Как оценить TWave экземпляр модуля Sympy Optics? - PullRequest
0 голосов
/ 26 сентября 2018

У меня проблема с оценкой экземпляра TWave модуля оптики Sympy.

Сначала я попытался использовать 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 из словаря sub:

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

это работало, но с n все еще символическим экземпляром.Таким образом, я не могу получить числовое значение из ff.subs({'x':1, 't':10}).evalf()

Есть идеи?Я просто хочу иметь возможность оценить значение поперечной волны в любой заданной точке (точках).

Спасибо,

PS: возможно, не имеет значения, но я использую Sympy 1.2 на Anaconda

1 Ответ

0 голосов
/ 26 сентября 2018

Похоже, проблема связана с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...