#wolfram-mathematica
#wolfram-mathematica
Вопрос:
У меня возникла проблема с выполнением функции, которая принимает 2 входных сигнала: R (единичный вектор) и v (вектор) и выводит список из 3 векторов {vr, vp, vc}
vr = (v.R)R
vp = v-vr
vc = R*vp
R = {0.36,0.48,0.8}
v can equal i{1,0,0},j{0,1,0},k{0,0,1}
Моя проблема в том, что с vc он даст неправильный ответ в позиции 1 в v
```
rotPrep[R_,v_]:= {Dot[v,R]R, v - Dot[v,R]R, Cross[R, v - Dot[v,R]R]};
Print["{ir,ip,ic} = ", rotPrep[R,i]];
Print["{jr,jp,jc} = ", rotPrep[R,j]];
Print["{kr,kp,kc} = ", rotPrep[R,k]];
```
Кажется, я прав, но j и k дают мне 1.9984×10 ^ -17 в позиции, в которой находился 1.
{ir,ip,ic} = {{0.1296,0.1728,0.288},{0.8704,-0.1728,-0.288},{0,0.8,-0.48}}
{jr,jp,jc} = {{0.1728,0.2304,0.384},{-0.1728,0.7696,-0.384},{-0.8,1.9984x10^-17,0.36}}
{kr,kp,kc} = {{0.288,0.384,0.64},{-0.288,-0.384,0.36},{0.48,-0.36,-1.9984x10^-17}}
Комментарии:
1. Я попытался очистить-вставить-и-запустить ваш код и не могу воспроизвести то, что вы видите. Я ПРЕДПОЛАГАЮ, что ваша проблема заключается в том, что вы вычитаете два приблизительных десятичных значения, и результат почти, но не точно, равен нулю. Таким образом, вы видите шум с плавающей запятой. Попробуйте включить следующую идею и посмотреть, устраняет ли она вашу проблему
R = Rationalize[{0.36,0.48,0.8}]; rotPrep[R_,v_]:=N[{Dot[v,R]R, v - Dot[v,R]R, Cross[R, v - Dot[v,R]R]}];
, которая используетRationalize
иN
пытается получить точные нули вместо приблизительных нулей.
Ответ №1:
Как сказал Билл в комментариях, это правильный способ его написания
R = Rationalize[{0.36,0.48,0.8}];
rotPrep[R_,v_]:=N[{Dot[v,R]R, v - Dot[v,R]R, Cross[R, v - Dot[v,R]R]}];