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