龍貝格求積算法python實現
import numpy as np
def trapezoid(a, b, n, func):
"""
復化梯形公式求函數func在區間[a,b]上的積分值
n是等分的區間數目
"""
x = np.linspace(a, b, num=n + 1)
y = func(x)
h = (b - a) / (2 * n)
return h * (y[0] + 2 * np.sum(y[1:-1]) + y[-1])
def romberg(a, b, func, eps, max_iter=100):
"""
龍貝格求積算法
求函數func在區間[a,b]上的積分值
eps:誤差
max_iter:最大迭代上限,應該大於等於2
"""
previous = [trapezoid(a, b, 1, func)]
for i in range(1, max_iter):
current = [trapezoid(a, b, 2 ** i, func)]
for k in range(1, i + 1):
tmp = ((4 ** k) * current[k - 1] - previous[k - 1]) / (4 ** k - 1)
current.append(tmp)
if np.abs(current[-1] - previous[-1]) < eps:
return current[-1]
previous = current
return previous[-1]
if __name__ == '__main__':
# x^2+x^3+exp(x)在[0,2]上的積分值:13.055722765711728
print(
romberg(0, 2, lambda x: x ** 2 + x ** 3 + np.exp(x), 1e-5)
)