如何使用 `scipy.integrate.quad` 计算依赖于另一个函数积分的函数的积分

How to use `scipy.integrate.quad` to compute integral of a function which depends on the integral of another function

计算此积分的任何帮助,F 函数使用涉及第一个积分的 f 函数定义,最后积分 F.

from scipy.integrate import quad

f = lambda x,a : a**2*x

def F(s,a):
  return quad(f,0,s,args=(a,))
quad(F,0,5,args=(4,))

收到错误:

      2 def F(s,a):
      3   return quad(f,0,s,args=(a,))
----> 4 quad(F,0,5,args=(4,))
      5 
    446     if points is None:
    447         if infbounds == 0:
--> 448             return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    449         else:
    450             return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)

TypeError: must be real number, not tuple

查看 scipy.integrate.quad 的 return 值:

Returns:

y: float The integral of func from a to b.

abserr: float An estimate of the absolute error in the result.

...

所以有多个 return 值(一个元组),这就是您收到 TypeError: must be real number, not tuple 消息的原因。

我想,您只是对整数值 quad(...)[0] 感兴趣,所以这就是您的 F 应该 return:

from scipy.integrate import quad

f = lambda x, a: a**2 * x
F = lambda x, a: quad(f, 0, x, args=(a,))[0]

I = quad(F, 0, 5, args=(4,))
print(I)

打印:

(333.33333333333337, 3.700743415417189e-12)

看待问题的另一种方式是意识到您正在对点 [0, 0][5, 0] 和 [=14] 所跨越的三角形积分函数 a**2 * y =].然后,您可以使用 quadpy(我的一个项目)中的三角形正交来计算值:

import quadpy

a = 4.0


def g(x):
    return a ** 2 * x[1]


scheme = quadpy.triangle.dunavant_05()
val = scheme.integrate(g, [[0.0, 0.0], [5.0, 0.0], [5.0, 5.0]])
print(val)

这应该比嵌套四边形方法需要更少的函数评估。