如何评估Sympy Optics模块的TWave实例?

时间:2018-09-26 15:51:15

标签: python sympy

我在评估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

1 个答案:

答案 0 :(得分:0)

问题似乎与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)