如何为自定义高斯勒让德积分函数添加args=(...)参数?
当然可以实现类似
args=(...)的参数传递! 完全能给你的自定义高斯勒让德求积函数加上和scipy.integrate.quad一样的args参数,这样就不用每次都手动给被积分函数绑定参数了。核心思路就是在自定义函数里新增args参数,然后把它解包传递给被积分的函数。
举个具体的实现例子:
假设你原本的高斯勒让德求积函数是这样的(简化版):
import numpy as np def gauss_legendre(integrand, lower, upper): # 取5个高斯勒让德节点(可根据精度需求调整) x_nodes, weights = np.polynomial.legendre.leggauss(5) # 变量替换,把[-1,1]区间映射到[lower, upper] t = 0.5 * (upper - lower) * x_nodes + 0.5 * (upper + lower) # 计算积分值 integral = 0.5 * (upper - lower) * np.sum(weights * integrand(t)) return integral
现在我们给它加上args参数,修改后的版本:
import numpy as np def gauss_legendre(integrand, lower, upper, args=()): x_nodes, weights = np.polynomial.legendre.leggauss(5) t = 0.5 * (upper - lower) * x_nodes + 0.5 * (upper + lower) # 关键:用*args解包参数,传递给被积分函数 integral = 0.5 * (upper - lower) * np.sum(weights * integrand(t, *args)) return integral
怎么使用这个修改后的函数?
比如你有一个带参数的被积分函数:
def test_func(x, a, b): return a * np.sin(b * x)
现在就可以像用quad那样,通过args传递参数:
# 计算从0到π的积分,参数a=2,b=3 result = gauss_legendre(test_func, 0, np.pi, args=(2, 3)) print(result)
原理说明:
args参数默认设为空元组(),这样不传递参数时也能正常调用;- 当需要传递参数时,把所有参数打包成元组传给
args; - 在调用被积分函数时,用
*args把元组里的参数逐个传递给integrand,和quad的逻辑完全一致。
如果你的被积分函数还需要关键字参数,还可以额外加个kwargs参数,但从你的需求来看,args已经足够解决重复传参的麻烦啦。
内容的提问来源于stack exchange,提问作者Ice-Nine
相关产品推荐
相关产品推荐

