Python 向量的符号替换
在下面的代码中,我有一个类型为Python 向量的符号替换,python,sympy,Python,Sympy,在下面的代码中,我有一个类型为Mul的表达式,名为term。在术语中是一种称为zhat的类型Symbol。我想执行类似于term.subs(zhat,vec)的操作,其中vec属于BaseVector类型。我正在用一个符号代替一个向量。输出被分配到代码中的out\u actual 问题是,out\u actual的类型是Mul,而我需要它的类型是vectorul。变量out\u-ideal是我期望从替换中得到的。有什么方法可以获得理想的out\u import sympy as sp from
Mul
的表达式,名为term
。在术语中
是一种称为zhat
的类型Symbol
。我想执行类似于term.subs(zhat,vec)
的操作,其中vec
属于BaseVector
类型。我正在用一个符号代替一个向量。输出被分配到代码中的out\u actual
问题是,out\u actual
的类型是Mul
,而我需要它的类型是vectorul
。变量out\u-ideal
是我期望从替换中得到的。有什么方法可以获得理想的out\u
import sympy as sp
from sympy.vector import CoordSys3D
N = CoordSys3D('N')
Q, eps, zhat = sp.symbols('Q \epsilon_0 \\hat{\\mathbf{z}}')
vec = N.k
term = Q*eps*zhat
out_ideal = Q*eps*vec
out_actual = term.subs(zhat, vec)
它不是特别令人愉快或可概括的,但您可以执行以下操作,在适当的时候将任何
Mul
转换为VectorMul
(否则将其保留为Mul
):
之所以需要这样做,是因为subs
,一种属于Basic
类的方法,只需查看Mul
对象(term
)的所有参数(例如Q
,eps
,zhat
),并替换与替换目标匹配的每个参数,并以Mul
的形式给出结果,但带有修改后的args列表(即zhat
已替换为vec
)。它不会对结果进行任何进一步的计算,并将参数保留为Mul
要将其转换为VectorMul
,只需手动将结果参数相乘,就像将导出理想值一样。所有的multiply\u args
都是手动将参数相乘,如果任何参数是向量,则升级为vectorul
。显然,这只会起作用,因为您知道您已经开始使用Mul
;如果需要的话,您需要将其推广到处理其他类型
如果值得为该功能向SymPy Github存储库提交一个功能需求
import sympy as sp
from sympy.vector import CoordSys3D
from sympy.core.mul import Mul
N = CoordSys3D('N')
def multiply_args(obj):
'''Gets the result of multiplying all of the Mul's args together.'''
if not isinstance(obj, Mul):
raise ValueError('Input must be an instance of Mul')
args = obj.args
prod = args[0]
for e in args[1:]:
prod = prod * e
return prod
Q, eps, zhat = sp.symbols('Q \epsilon_0 \\hat{\\mathbf{z}}')
vec = N.k
term = Q*eps*zhat
sub_result = term.subs(zhat, vec)
sub_result = multiply_args(sub_result)