gpt4 book ai didi

python-3.x - Lambdify 参数积分

转载 作者:行者123 更新时间:2023-12-01 13:19:25 24 4
gpt4 key购买 nike

我有以下问题:我想lambdify 一个包含参数积分的sympy 表达式,例如Integral(tanh(a*x),(x,0 ,1))。我尝试手动实现 like here.

本质上,我们想要的是将积分转换为如下形式:

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 正常工作。

最佳答案

我认为从 integral_as_quad 返回一个 lambda 是行不通的,因为这个 lambda 永远不会被调用,因为 SymPy 中的 Integral 对象是不可调用的。相反,参数元组可以通过其 args 参数传递给 quad。我所做的另一个更改是在外部 lambdification 中,替换了

modules=['numpy', {'Integral':integral_as_quad}] 

modules=[{'Integral': integral_as_quad}, 'sympy'] 

我们的想法是,在这个阶段我们还不需要 NumPy 函数,我们只想用我们的可调用函数替换 Integral。 modules 列表的顺序很重要:字典排在第一位以防止 SymPy 将 Integral 保留为 Integral。

现在 L(1) 返回正确的数量。

import sympy as sp
import numpy as np
from scipy.integrate import quad

def integral_as_quad(function, limits):
x, a, b = limits
param = tuple(function.free_symbols - {x})
f = sp.lambdify((x, *param), function, modules=['numpy'])
return quad(f, a, b, args=param)[0]

a, x = sp.symbols('a,x')
I = sp.Integral(sp.tanh(a*x), (x,0,1))
L = sp.lambdify(a, I, modules=[{'Integral': integral_as_quad}, 'sympy'])

关于python-3.x - Lambdify 参数积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51173981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com