#vector #physics #sympy
#вектор #физика #сочувствующий
Вопрос:
Я использую модуль sympy в jupyter notebook для выполнения некоторых вычислений с опорными кадрами. Я поворачиваюсь вокруг оси z только на угол av. Идея заключается в следующем:
- W — мировой кадр
- V — кадр транспортного средства, мировой кадр, повернутый по оси z с помощью pi — av
- u — кадр v, повернутый на угол 90 градусов по оси z
Я использую следующий код:
from sympy import *
init_printing()
av = symbols('\alpha_v')
# Reference frames
from sympy.physics.vector import *
# World frame
W = ReferenceFrame('W')
# Vehicle frame
v = ReferenceFrame('v')
v.orient(W,'Axis',[pi-av,W.z])
display('Rotation matrix from W to v:')
display(W.dcm(v)) <-- Check if frames are still coupled
# u frame
u = v
display(W.dcm(v)) <-- Check if frames are still coupled
u.orient(u,'Axis',[pi/2,u.z])
display(W.dcm(v)) <-- Check if frames are still coupled, from here on error!
display('Rotation matrix from w to u:')
display(u.dcm(w))
После поворота u связь между кадрами v и W прерывается. Я получаю следующий вывод:
Ошибка в конце:
ValueError Traceback (most recent call last)
<ipython-input-20-72d62c7921df> in <module>()
17 display(W.dcm(v))
18 u.orient(u,'Axis',[pi/2,u.z])
---> 19 display(W.dcm(v))
20 display('Rotation matrix from w to u:')
21 display(u.dcm(w))
c:pythonpython35libsite-packagessympyphysicsvectorframe.py in dcm(self, otherframe)
409 if otherframe in self._dcm_cache:
410 return self._dcm_cache[otherframe]
--> 411 flist = self._dict_list(otherframe, 0)
412 outdcm = eye(3)
413 for i in range(len(flist) - 1):
c:pythonpython35libsite-packagessympyphysicsvectorframe.py in _dict_list(self, other, num)
254 return outlist[0]
255 raise ValueError('No Connecting Path found between ' self.name
--> 256 ' and ' other.name)
257
258 def _w_diff_dcm(self, otherframe):
ValueError: No Connecting Path found between W and v
Таким образом, вращая u, я разрываю соединение между W и v? Я не понимаю, что я здесь делаю не так.
Информация о сервере: Вы используете Jupyter notebook.
Версия сервера notebook: 5.6.0 Сервер работает на этой версии Python: Python 3.5.4 (v3.5.4:3f56838, август 8 2017, 02:17:05) [ 64-разрядная версия MSC v.1900 (AMD64)]
Редактировать: проблема может быть решена с помощью:
from sympy import *
init_printing()
av = symbols('\alpha_v')
# Reference frames
from sympy.physics.vector import *
# World frame
W = ReferenceFrame('W')
display(W)
# Vehicle frame
v = ReferenceFrame('v')
v.orient(W,'Axis',[pi-av,W.z])
display('Rotation matrix from W to v:')
display(W.dcm(v))
display(W.dcm(v))
# u frame
u = ReferenceFrame('u')
u.orient(v,'axis',[pi/2,v.z])
display(u.dcm(v))
display(W.dcm(v))
Я думал, что u = v создает копию v в переменной u . Это не работает и вызывает проблему. Правильно определить u как referenceframe и впоследствии ориентировать его относительно v.
Единственный вопрос, который все еще остается, заключается в том, как создать копию, если вам нужны два идентичных опорных фрейма? Это единственный способ сделать что-то вроде этого?
u = ReferenceFrame('u')
u.orient(v,'axis',[0,v.z])