Неверный ответ на перекрестный продукт?

#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]}];