Как оценить TWave экземпляр модуля Sympy Optics?

1

У меня проблема с оценкой экземпляра 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 вместо этого ValueError: summation of quantities of incompatible dimensions ошибок ValueError: summation of quantities of incompatible dimensions. Я попытался удалить n из словаря subs:

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

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

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

Спасибо,

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

Теги:
sympy

1 ответ

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)
  • 0
    from sympy.physics.units import meter, second это, но не заметил, что нужно импортировать эту строку from sympy.physics.units import meter, second заменить оба модуля. Спасибо за помощь, все работает!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню