Получение перекрестного произведения неизвестной матрицы с неизвестной функцией в sympy - PullRequest
0 голосов
/ 18 июня 2020

Я хотел бы, чтобы sympy подтвердил, что, учитывая уравнение:

$$ r '(t) = A \ times r (t) $$

(то есть «производная от неизвестная функция r является перекрестным произведением неизвестной матрицы A на r "), из этого следует, что:

$$ r '' (t) = A \ times r '(t) $$

(т.е. «вторая производная r - это произведение A на первую производную r»).

Из документации кажется, что я хочу использовать MatrixSymbol для A, но MatrixSymbol не определяет cross:

from sympy import *
from sympy.abc import *
r = Function('r')(t) 
A = MatrixSymbol('A', 4, 4)  # dummy dimensions

Derivative(A.cross(r))

дает мне:

AttributeError                            Traceback (most recent call last)
<ipython-input-52-4c8dc7c142cf> in <module>
      4 A = MatrixSymbol('A', 4, 4)
      5 
----> 6 Derivative(A.cross(r))

AttributeError: 'MatrixSymbol' object has no attribute 'cross'

Как правильно это сделать?

1 Ответ

1 голос
/ 19 июня 2020

Векторный класс SymPy полностью отделен от класса Matrix, что может сбивать с толку, если вы привыкли думать о векторе как о конкретном виде матрицы: https://docs.sympy.org/latest/modules/vector/index.html

I Я продемонстрирую, как это сделать с помощью класса векторов. Это можно сделать и более компактно, но я подробно изложу:

In [23]: from sympy.vector import CoordSys3D 
    ...: N = CoordSys3D('N')                                                                                                                   

In [24]: a1, a2, a3 = symbols('a1:4')                                                                                                          

In [25]: r1, r2, r3 = [ri(t) for ri in symbols('r1:4', cls=Function)]                                                                          

In [26]: A = a1*i + a2*j + a3*k                                                                                                                

In [27]: r = r1*i + r2*j + r3*k                                                                                                                

In [28]: A                                                                                                                                     
Out[28]: a1*N.i + a2*N.j + a3*N.k

In [29]: r                                                                                                                                     
Out[29]: (r1(t))*N.i + (r2(t))*N.j + (r3(t))*N.k

In [30]: (A.cross(r.diff(t))).diff(t) == A.cross(r.diff(t, 2))                                                                                 
Out[30]: True
...