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

我在评估 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错误。我试图n从 subs 字典中删除:


ff.subs({'x':1, 't':10})

它起作用了,但n仍然是一个象征性的例子。因此,我无法从中获得任何数值ff.subs({'x':1, 't':10}).evalf()


任何想法?我只想能够评估任何给定点的横波值。


谢谢,


PS:可能不相关,但我在 Anaconda 上使用 Sympy 1.2


犯罪嫌疑人X
浏览 148回答 1
1回答

一只甜甜圈

看起来问题与TWave在不告诉您的情况下向表达式添加单位有关。wave.rewrite('cos')给A*cos(-2*pi*f*t + phi + pi*second*f*n*x/(149896229*meter)). 如果您消除meter和second符号,您的代码就可以工作。from sympy import symbolsfrom sympy.physics.optics import TWavefrom sympy.physics.units import meter, secondimport numpy as npA, f, phi = symbols('A f phi')wave = TWave(A, f, phi)# the evaluationxpoint = 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python