У меня следующая проблема: я хочу lambdify
sympy
выражение, содержащее параметрические интегралы, такие как Integral(tanh(a*x),(x,0,1))
. Я пытался сделать ручную реализацию как здесь.
По сути, мы хотим, чтобы интеграл преобразовывался во что-то вроде:
lambda theta: quad(lambda x: g(x,theta), a,b)[0]
, где
g = sp.lambdify((x,param), f, modules='numpy'))
Рассмотрим следующее MWE:
import sympy as sp
import numpy as np
from scipy.integrate import quad
def integral_as_quad(function, limits):
x, a, b = limits
param = function.free_symbols - {x}
f = sp.lambdify( (x,*param), function, modules='numpy')
return lambda y: quad(lambda x: f(x,y), a,b)[0]
a, x = sp.symbols('a,x')
I = sp.Integral(sp.tanh(a*x),(x,0,1))
K = integral_as_quad(sp.tanh(a*x),(x,0,1))
L = sp.lambdify(a, I, modules=['numpy', {'Integral':integral_as_quad}] )
Затем, например, вызов K(1)
возвращает правильное значение. Однако L(1)
дает
AttributeError: 'Mul' object has no attribute 'tanh'
У кого-нибудь есть идеи как это исправить?
ПРИМЕЧАНИЕ: Делать это вручную нельзя, поскольку выражения, с которыми я имею дело, более сложны и могут содержать несколько различных интегралов. Так что мне действительно нужно, чтобы lambdify работал.