我在评估Sympy光学模块的TWave实例时遇到问题。
首先,我尝试使用以下代码使用lambdify()
:
from sympy import symbols
from sympy.physics.optics import TWave
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 = 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
错误。我试图从subs字典中删除n
:ff.subs({'x':1, 't':10})
它起作用了,但是
n
仍然是一个符号实例。因此,我无法从ff.subs({'x':1, 't':10}).evalf()
中获取任何数值任何想法?我只希望能够评估任何给定点的横波值。
谢谢,
PS:可能不相关,但是我在Anaconda上使用Sympy 1.2
最佳答案
看起来问题与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)
关于python - 如何评估Sympy Optics模块的TWave实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52521762/