Вторая производная функции Ганкеля unsing sympy

Я хочу построить вторую производную функции Ханкеля с помощью Simpy. В Mathematica это так же просто, как:

D[HankelH2[1,z],z]

Это можно сделать аналитически с помощью свойства

Первая производная функции Ганкеля второго рода и первого порядка равна разнице между двумя функциями Ганкеля. второго типа нулевого и второго порядка, соответственно, все они делятся на два.

Но я хочу узнать, как получить его напрямую с помощью Sympy. Пока я пробовал это:

from scipy.special import hankel2
import sympy as sp
x = sp.Symbol('x')
dh2 = sp.diff(lambda x: hankel2(1,x),x)

Сообщение об ошибке кажется мне неразборчивым:

SympifyError Traceback (последний вызов последним) in () 1 import sympy as sp 2 x = sp.Symbol ('x') ----> 3 dh2 = sp.diff (lambda x: hankel2 (1, x), x )

/usr/lib/python2.7/dist-packages/sympy/core/function.pyc в diff (f, * символы, ** kwargs) 1639 "" "1640 kwargs.setdefault ('Assessment', True) -> 1641 return Derivative (символы f, *, ** kwargs) 1642 1643

/usr/lib/python2.7/dist-packages/sympy/core/function.pyc в новом (cls, expr, * переменные, ** предположения) 985 def new (cls, expr, * variables, ** предположения): 986 -> 987 expr = sympify (expr) 988 989 # Переменных нет, мы дифференцируем по всем свободным символам

/usr/lib/python2.7/dist-packages/sympy/core/sympify.pyc в sympify (a, locals, convert_xor, строго, рационально, оценивать) 313 expr = parse_expr (a, local_dict = locals, transformations = transformations, оценивать = оценивать) 314 except (TokenError, SyntaxError) as exc: -> 315 raise SympifyError ('не удалось проанализировать% r'% a, exc) 316 317 return expr

SympifyError: Sympify выражения 'could not parse u' at 0x7fdf3eca9e60> '' не удалось из-за возникшего исключения: SyntaxError: недопустимый синтаксис (, строка 1)

Есть ключ к разгадке, в чем моя ошибка?

Заранее спасибо.


person Felipe BM    schedule 29.01.2016    source источник


Ответы (1)


Вы не можете использовать функции SciPy с SymPy. Функции SciPy являются числовыми, тогда как SymPy работает только с символьными функциями (т.е. теми, которые находятся внутри самого SymPy). Заключение в lambda этого не меняет.

Что вам нужно сделать, так это импортировать hankel2 из SymPy и использовать его.

>>> from sympy import hankel2, symbols, diff
>>> x = symbols('x')
>>> diff(hankel2(1, x), x)
hankel2(0, x)/2 - hankel2(2, x)/2

Если вы хотите построить это, вы можете использовать функцию sympy.plot. Или вы можете преобразовать его в числовую функцию, используя scipy с

l = lambdify(x, diff(hankel2(1, x), x), {'hankel2': scipy.special.hankel2})

и используйте это с библиотекой построения графиков, такой как maptlotlib (похоже, что hankel2 - сложная функция, с которой, я не думаю, что SymPy plot сейчас очень хорошо справляется, поэтому вы можете предпочесть этот вариант).

person asmeurer    schedule 29.01.2016