Lambdifying Sympy向量

时间:2019-02-08 20:23:04

标签: python numpy sympy

我正在使用sympy进行矢量演算计算,我想知道是否存在一种简单的方法来对矢量和二进式表达式进行数值评估。我知道lambdify函数可以像这样使用:

from sympy.abc import x,lambdify

expr=x**x+1
lambda_expr=lambdify(x,expr)
print(lambda_expr(5.0))

二进/矢量表达式是否具有类似的功能?我尝试了以下代码,但引发了语法错误:

from sympy.vector import CoordSys3D, Del

C=CoordSys3D('C')
nabla=Del()

#define some test vectorial field
B=C.x*C.y*C.z*(C.i+C.j+C.k)

#compute a field and a dyad
nabla_B=nabla.dot(B).doit()
rot_B=nabla.cross(B).doit()

#try to get lambda expressions...
lambda_nablaB=lambdify((C.x,C.y,C.z),nabla_b
lambda_rotB=lambdify((C.x,C.y,C.z),rot_B)

语法错误:

 lambda C.x,C.y,C.z: (C.x*C.y*C.z*C.i + C.x*C.y*C.z*C.j + C.x*C.y*C.z*C.k)
                ^
    SyntaxError: invalid syntax

我希望对一个字段/双位数进行数字求值并得到一个numpy数组。

1 个答案:

答案 0 :(得分:0)

这可能不是一个理想的答案,但是以下解决方案似乎可行。函数evalsym将sympy向量转换为numpy向量:

C=CoordSys3D('C')

def evalsym(symvec,pos):
    numvec=num.zeros(3)
    numvec[0]=symvec.evalf(subs={C.x:pos[0],C.y:pos[1],C.z:pos[2]}).dot(C.i)
    numvec[1]=symvec.evalf(subs={C.x:pos[0],C.y:pos[1],C.z:pos[2]}).dot(C.i)
    numvec[2]=symvec.evalf(subs={C.x:pos[0],C.y:pos[1],C.z:pos[2]}).dot(C.i)
    return numvec