SymPy: как мне создать символическую лямбда-функцию?

#python #sympy

#python #sympy

Вопрос:

Например, у меня есть это выражение:

 x = Symbol('x')
f = sin(x) * x
 

Я хочу, чтобы работал следующий код:

 >>> a = Symbol('a')
>>> f(a)
TypeError: 'Mul' object is not callable
 

Я могу превратить это выражение в лямбда-функцию, которая будет работать с числами:

 >>> f = lambdify(x, f)
>>> f(10)
-5.440211108893697
 

Но это не работает для символов:

 >>> f = lambdify(x, f)
>>> f(a)
TypeError: loop of ufunc does not support argument 0 of type Symbol which has no callable sin method
 

Я знаю о методе * .subs, но меня интересует эта нотация:

 >>> a = Symbol('a')
>>> f(a)
 

Как это сделать?

Комментарии:

1. f = lambda x:sin(x)*x

2. это действительно так просто?

3. Да, возможно, это слишком просто … Сравните type(sin(x)*x) с type(lambda x:sin(x)*x)

4. В вашем случае, похоже, вам просто нужна простая лямбда-функция Python, как сказано выше. В других контекстах также может быть полезно использовать Lambda функцию sympy, которая предоставляет «символическую» функцию. Это используется, например ImageSet .

5. Согласно lambdify документам, он преобразует ваш sin(x) в np.sin(x) . Это то np.sin , что не может справиться с symbol . Он отлично работает с числами и числовыми массивами. Как указано в ошибке, для нечислового объекта numpy код пытается выполнить x.sin() .