Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向量的符号替换_Python_Sympy - Fatal编程技术网

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)