Scipy Quad积分,积分可能发散或缓慢收敛

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

我正在尝试使用 scipy 的integrate.quad,但它不适用于我的功能。

import numpy as np
from scipy.integrate import quad

def cos_func (x):
    return np.cos(np.power(x, 3) + 1)

result_quad = quad(cos_func, 0, 10)[0]
print(result_quad)

我在 cos 函数中尝试过仅使用 x 和 x^2 ,两者都工作正常,只有 x^3 ,我也尝试过使用

x**3
而不是
np.power(x, 3)
,但这并没有改变任何东西。任何修复和解释为什么它不起作用的帮助将不胜感激。

python scipy
2个回答
0
投票

cos(x3+1)中的x3会导致余弦函数在x=10附近快速振荡。您将需要大量节点来捕获所有这些振荡。避免这种情况的一种方法是将 x 的积分范围分割为 [0,1] 和 [1,10] 并进行替换 x=u1/3 来完成第二个。 (当 x=0 时,替换会表现不佳)。

import numpy as np
from scipy.integrate import quad

def cos_func (x):
    return np.cos(np.power(x, 3) + 1)

def ucos_func (u):
    return np.cos(u + 1) / ( 3 * u ** ( 2.0 / 3.0 ) )

result_quad = quad(cos_func, 0, 1)[0] + quad( ucos_func, 1, 10.0 ** ( 1.0 / 3.0 ) )[0]
print(result_quad)

输出(我希望它是正确的!):

0.081369927369563

0
投票

由于该函数的高频特性,您将需要更多的点才能获得准确的积分。自适应方法的默认值是 50 个子区间,但将其更改为 1000 会给出正确的结果,而不会发出任何警告。

import numpy as np
from scipy.integrate import quad

def cos_func (x):
    return np.cos(np.power(x, 3) + 1)

result_quad = quad(cos_func, 0, 10, limit=1000)[0]
print(result_quad)  # 0.04519830321767172
© www.soinside.com 2019 - 2024. All rights reserved.