SymPy не может оценивать скалярное произведение * метаморфизованных * векторов - PullRequest
2 голосов
/ 27 мая 2020

Я работаю с SymPy vector s:

from sympy import *
from sympy.vector import *
N = CoordSys3D('N')
x = symbols('x')
v = x * N.i + x**2 * N.j
vf=factor(v)
vf1=vf.as_independent(Vector)[1]
type(vf1)
# sympy.core.add.Add

Мне нужно вычислить dot(vf1,vf1). Но SymPy не оценивает скалярное произведение:

ss = dot(vf1,vf1)
ss
# 1 + 2*Dot(N.i, N.j*x) + Dot(N.j*x, N.j*x)

Я подозреваю, это потому, что vf1 был преобразован в другой тип, т.е. sympy.core.add.Add).

Есть ли способ заставить SymPy вычислять ss? Есть ли способ преобразовать vf1 как sympy.vector...?

EDIT

Я написал функцию, которая выполняет скалярное произведение. Но мне нужно сделать это способом SymPy, поэтому мне не нужно повторно реализовывать мою собственную версию каждой функции в sympy.vector.

1 Ответ

2 голосов
/ 27 мая 2020

Да, as_independent не уважает класс Add или Mul, с которым имеет дело, и использует только Mul / Add (вместо VectorMul / VectorAdd в вашем случае). Это можно исправить с помощью преобразования:

>>> from sympy.core.rules import Transform
>>> T = Transform(lambda x: (VectorMul if x.is_Mul else VectorAdd)(*x.args),
...  lambda x: x.is_Add or x.is_Mul and any(isinstance(i,BaseVector)
...  for i in x.args))
>>> vf1.xreplace(T)
N.i + x*N.j
>>> dot(_,_)
x**2 + 1
...