我正在使用 quadpy 在 python 中集成一个函数。
功能
import numpy as np
T = 2*np.pi
def ex1(t):
return np.where(np.logical_and((t%T>=0), (t%T<np.pi)), t%T, np.pi)
该函数是周期性的,这是它的情节:
x = np.linspace(0, 6*T, 1000)
plt.plot(x, ex1(x))
plt.grid(True)
plt.show()
问题
我正在尝试集成此功能:
from scipy.integrate import quad
import quadpy
print(quadpy.quad(ex1, 0, 3))
print(quad(ex1, 0, 3))
生产
(array(4.5), array(1.41692995e-19))
(4.5, 4.9960036108132044e-14)
在 0 到 3 的时间间隔内,一切正常。但是,如果我将间隔增加到例如 4,scipy 仍然有效。
print(quad(ex1, 0, 4))
生产
(7.631568411183528, 1.0717732083155035e-08)
但
print(quadpy.quad(ex1, 0, 4))
生产
IntegrationError: Tolerances (abs: 1.49e-08, rel: 1.49e-08) could not be reached with the given max_num_subintervals (= 50).
问题
- 如何防止此错误?我尝试添加一个名为的参数,
max_num_subintervals
但这似乎不起作用。 - 我是否正确地使用了 quadpy 来做我想做的事情?我已经开始使用它,因为我想采用 scipy 不支持的复数的导数,并且我想有一个万能的解决方案,因此对于这些更简单的示例使用 quadpy scipy 就足够了。