我在评估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))。如果消除了metersecond符号,则您的代码有效。

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/

10-12 03:18