我在评估Sympy光学模块的TWave实例时遇到问题。
起初,我使用以下代码尝试了Right Alt
:
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()
现在,后来发生的事让我感到奇怪:
乍一看,我发现有3个变量需要替换,即# 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
。但是,当我尝试这样做时:
x, t, n
我遇到了ff.subs({'x':1, 't':10, 'n':1})
错误。我试图从子词典中删除ValueError: summation of quantities of incompatible dimensions
:
n
它起作用了,但是ff.subs({'x':1, 't':10})
仍然是一个符号实例。因此,我无法从n
有什么主意吗?我只想能够在任何给定点评估横波值。
谢谢
PS:可能不相关,但是我在Anaconda上使用Sympy 1.2
答案 0 :(得分:0)
问题似乎与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)