对函数与参数进行数值积分

问题描述 投票:0回答:1

我有一个被积函数 f(x),它取决于 x 和其他几个参数 a1、a2、a3 等。这个函数可能很难或不可能通过 SymPy 进行符号积分;这就是为什么我想使用 SciPy 进行数值积分,但我不确定如何才能保留参数 a1, ... 并获得这些参数的积分结果。 例如,f(x) = a * x^2,但我“不知道”如何解析地解决它,并且从x = 0积分到x = 1之后,我想得到a / 3。 如果这很重要,我想保留这些参数,因为我需要根据这些参数来区分积分后的表达式。 那么有没有办法使用现有的 scipy/numpy 工具来做到这一点,还是我需要创建自己的数值积分器?

python math scipy sympy
1个回答
0
投票

我“不知道”如何解析地解决它,从 x = 0 积分到 x = 1 后,我想得到 / 3。如果这很重要,我想保留这些参数,因为我需要区分根据这些参数积分后的表达式。

数值积分无法实现这一点,因为数值微分会给出一个数字作为最终结果。如果您想要符号表示,则需要符号/分析集成。

或者,如果符号积分不可能,您可以使用数值积分,然后使用数值微分。数值微分允许您对函数进行微分,即使您没有它的符号表示。

这是一个简单的例子。

from scipy.integrate import quad
from scipy.optimize import approx_fprime

def f(x, a, b):
    return a * x ** 2 + b * x ** 3 + a * b

def f_int(a, b):
    result, error = quad(f, 0, 1, args=(a, b))
    return result

def f_int_analytic(a, b):
    return b / 4 + a * (1 / 3 + b)

def f_int_jacobian(a, b):
    return approx_fprime([a, b], lambda p: f_int(p[0], p[1]), epsilon=1e-8)

# Evaluate integral at a=1 b=1
f_int(1, 1)

# Take jacobian/gradient of function with respect to a and b at a=1, b=1
f_int_jacobian(1, 1)

不过,这种方法存在一个潜在的问题。当您对这样的函数进行数值微分时,积分会存在一些误差范围,由四边形的

epsabs
epsrel
参数控制。 (参见docs。)如果您的积分在一次评估中误差为 1e-8,那么微分时的误差将为 1e-8/1e-8,这将使斜率误差 1。这意味着小误差会被放大。我建议您调整
epsabs
epsrel
epsilon
以避免这种情况。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.