У меня проблема с оценкой экземпляра 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