gpt4 book ai didi

python - Lambdify 或评估 CoordSys3D

转载 作者:太空宇宙 更新时间:2023-11-03 15:43:09 24 4
gpt4 key购买 nike

如何计算 Sympy CoordSys3D 表达式上的点?

使用 Sympy 物理模块,这个过程按预期工作:

from sympy import *
from sympy.physics.vector import ReferenceFrame, CoordinateSym, divergence
R = ReferenceFrame('R')
field = R[0]*R[1]*R[2]*(R.x+R.y+R.z)

div = divergence(vect=field, frame=R)
div_func = lambdify([R[0], R[1], R[2]], div, modules='numpy')
print('Function evaluated at a point = {}'.format(div_func(1,2,8)))

但是,如果我改为使用 CoordSys3D,lambdify 的过程就不清楚了:

from sympy.vector import CoordSys3D, divergence, curl

A = CoordSys3D('A')
field = A.x*A.y*A.z*(A.i + A.j + A.k)
div = divergence(field)

# How do I lambdify / evaluate this?

# This fails:
# File "<lambdifygenerated-5>", line 1
# def _lambdifygenerated(A.x, A.y, A.z):
# SyntaxError: invalid syntax
# div_func = lambdify([A.x, A.y, A.z], div, modules='numpy')

# This fails:
# "name 'x' is not defined"
# div_func = lambdify([x, y, z], div, modules='numpy')

print('Function evaluated at a point = {}'.format(div_func(1,2,8)))

一些观察:

  • R[0] 是一个 sympy.physics.vector.frame.CoordinateSym
  • A.x 是一个 sympy.vector.scalar.BaseScalar

CoordSys3D 似乎是我想要的格式,特别是因为对球坐标系的支持很简单。

例如:

A = CoordSys3D('A', transformation='spherical')  # transformation requires Sympy 1.2 
vec_field = a*A.r**2*A.i + c*cos(A.theta)/A.r*A.j + b * A.k
div = divergence(vec_field)

最佳答案

看起来 lambdify 在生成代码时没有正确解释 A.x(它应该),因此您必须用符号替换它。

vars = symbols('A.x A.y A.z')
div_func = lambdify(vars, div.subs(dict(zip([A.x, A.y, A.z], vars))), modules='numpy')
print(div_func(1, 2, 8)) # 26

符号 vars 叫什么并不重要,我将它们命名为“A.x”等等只是为了保持一致。它们也可以是 vars = symbols('v0:3')

关于python - Lambdify 或评估 CoordSys3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51484568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com