我正在尝试评估一个双积分,其中内部积分的极限是可变的并且取决于外部积分。来自 Matlab 背景,使用符号积分很容易,但我不知道如何在 Python 中以有效的方式计算它。我阅读 scipy
了文件,但没有得到任何帮助。这种积分的一个例子是
任何有关相同的帮助将不胜感激。
更新:我正在寻找该问题的数值解决方案。非常感谢您的回答和帮助。他们完全有道理。我有一个更新的问题。我想评估以下积分,它是上面的更新版本。提前非常感谢。
我正在尝试评估一个双积分,其中内部积分的极限是可变的并且取决于外部积分。来自 Matlab 背景,使用符号积分很容易,但我不知道如何在 Python 中以有效的方式计算它。我阅读 scipy
了文件,但没有得到任何帮助。这种积分的一个例子是
任何有关相同的帮助将不胜感激。
更新:我正在寻找该问题的数值解决方案。非常感谢您的回答和帮助。他们完全有道理。我有一个更新的问题。我想评估以下积分,它是上面的更新版本。提前非常感谢。
要计算双积分,您可以使用函数scipy.integrate.dblquad。或者您可以使用函数scipy.integrate.quad两次。
示例积分可以按如下方式完成:
import math
from scipy.integrate import dblquad, quad
from scipy.special import erf, jv
def h(t, z):
return f(t) * g(z)
def f(t):
return 0.5 * t * (erf(t - a) - 1) * jv(0, q * t)
def g(z):
return math.exp(-((z - a) ** 2)/(2 * (s ** 2)))
def h1(z):
return integral_of_f(z) * g(z)
def h2(z):
return (integral_of_f(z) ** 2) * g(z)
def integral_of_f(z):
return quad(f, 0, 2 * z)[0] # here abserr is discarded
if __name__ == '__main__':
a, q, s = 0, 2, 3 # set the constants
result, abserr = dblquad(h, 0, 60, lambda z: 0, lambda z: 2 * z)
print(f'result: {result}, abserr: {abserr}')
result1 = quad(h1, 0, 60)[0] # abserr here for result1 is not valid since abserr is already discarded in the function integral_of_f
print(f'result1: {result1}')
result2 = quad(h2, 0, 60)[0] # abserr here for result2 is not valid too for the same reason
print(f'result2: {result2}')
哪个打印
result: -0.21705286423629183, abserr: 1.4361242750875712e-08
result1: -0.21705286423678177
result2: 0.013105371081178754
可以看到result
使用计算的dblquad
和result1
使用quad
两次计算的 几乎是相同的值,因为它们计算了相同的积分。
result2
用于更新的问题。