我在评估 Sympy 光学模块的 TWave 实例时遇到问题。起初,我尝试lambdify()使用此代码:from sympy import symbolsfrom sympy.physics.optics import TWaveimport numpy as npA, f, phi = symbols('A f phi')wave = TWave(A, f, phi)# the evaluationxpoint = tpoint = np.linspace(0, 10, 100)fb = lambdify([A, f, phi, x, t, n], wave.rewrite('cos'))fb(1, 1000, 0.5*np.pi, xpoint, tpoint, 1)但是,我收到了这个错误:AttributeError: 'Float' object has no attribute 'cos'相反。然后我尝试了一个简单evalf()的一点,只是为了确定。# evaluation with evalf()data = { 'A0': 1, 'f' : 100, 'phi' : np.pi/2,}ff = wave.subs(data).rewrite('cos')ff# result: TWave instance, rewritten in cosine term, with variable substituted现在,后来发生的事情让我感到奇怪:我一眼就看到需要替换的变量有 3 个,即x, t, n. 但是,当我尝试这样做时:ff.subs({'x':1, 't':10, 'n':1})我得到了ValueError: summation of quantities of incompatible dimensions错误。我试图n从 subs 字典中删除:ff.subs({'x':1, 't':10})它起作用了,但n仍然是一个象征性的例子。因此,我无法从中获得任何数值ff.subs({'x':1, 't':10}).evalf()任何想法?我只想能够评估任何给定点的横波值。谢谢,PS:可能不相关,但我在 Anaconda 上使用 Sympy 1.2
1 回答

一只甜甜圈
TA贡献1836条经验 获得超5个赞
看起来问题与TWave在不告诉您的情况下向表达式添加单位有关。
wave.rewrite('cos')给A*cos(-2*pi*f*t + phi + pi*second*f*n*x/(149896229*meter)). 如果您消除meter和second符号,您的代码就可以工作。
from sympy import symbols
from sympy.physics.optics import TWave
from sympy.physics.units import meter, second
import numpy as np
A, f, phi = symbols('A f phi')
wave = TWave(A, f, phi)
# the evaluation
xpoint = tpoint = np.linspace(0, 10, 100)
fb = sympy.lambdify(
[A, f, phi, x, t, n],
wave.rewrite(
'cos'
).subs(
[(meter, 1), (second, 1)]
),
modules='numpy'
)
fb(1, 1000, 0.5*np.pi, xpoint, tpoint, 1)
添加回答
举报
0/150
提交
取消