【问题标题】:Are there any inherent limitations to the scipy.integrate.quad function?scipy.integrate.quad 函数是否有任何固有限制?
【发布时间】:2021-11-26 15:18:21
【问题描述】:

我目前正在尝试执行高斯函数的定积分,当我确信情况并非如此时,我得到的答案为 0。

这让我问,在执行定积分时,quad 函数究竟能做什么有限制吗?我是否在正确的应用程序中使用了 quad? quad 究竟是如何找到积分的?

import math
from scipy.integrate import quad

def g(λ,a,u,o):
    return a*math.exp((λ-u)**2/(-2*o**2))

exc = quad(g, 4000, 8000, args=(1,6700,2.125))[0]

print(exc)

我已经绘制了这个高斯,所以我知道它在我设置的范围内不为零。我还在我的科学计算器中插入了积分,它给出了 5.33 的答案。所以现在我得出的结论是,我要么犯了一些我找不到的错误,要么在错误的情况下使用了 quad。

感谢您的任何帮助:)

【问题讨论】:

  • 其实使用λ作为变量名。哇!

标签: python gaussian integral quad


【解决方案1】:

相对于你试图整合的区域,你的函数基本上是 0,除了小范围之外

您可以添加一些点来帮助函数将集成分解为更小的部分

points(sequence of floats,ints), optional 断点序列 在有界积分区间中, 可能出现被积函数(例如,奇点、不连续点)。这 序列不必排序。注意这个选项不能 与重量结合使用。

import math
from scipy.integrate import quad

def g(λ,a,u,o):
    return a*math.exp((λ-u)**2/(-2*o**2))

exc = quad(g, 4000, 8000, args=(1,6700,2.125), full_output=1, points=[6500, 7000])[0]

print(exc)

5.3265850835908095

There seems to be no way around this problem

【讨论】:

  • 谢谢!我不知道与这样的薄峰相关的范围。认为只要包含峰值,无论范围如何,答案都是相同的。在这种情况下,我可以将积分面积本身缩短到 6500-7000 以获得我想要的。谢谢你的帮助:)
【解决方案2】:

正如 Tom 所提到的,您的函数显着大于 0 的区域太远而无法被集成过程检测到。从理论上讲,您的u 也可能是1e12,但是集成方案要求它有点多才能找到它。

一种简单的补救方法是将正交域增加到 [-inf, +inf],并移动函数以使“有趣”部分约为 0。

import math
from scipy.integrate import quad
import numpy as np

a = 1.0
u = 0.0
o = 2.125


def g(x):
    return a * math.exp(-(x - u) ** 2 / (2 * o ** 2))


exc = quad(g, -np.inf, +np.inf)[0]

print(exc)
5.326585083590876

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2021-06-25
    • 2011-10-04
    • 1970-01-01
    • 2015-11-09
    • 2016-11-16
    相关资源
    最近更新 更多