复化求积的思想:
将区间[a,b]分作n等分,步长h = (b-a) / n,等分点x(k) = a + kh,k = 0,1,2,3,…,n,先在每个子区间[x(k),x(k+1)]上采用低阶的数值求积公式求得近似积分值I(k),再将它们累加并以和作为积分I的近似值。
用复化梯形公式和复化Simpson公式计算:
I
=
∫
0
π
e
x
c
o
s
x
d
x
I = \int_0^\pi e^xcosxdx\
I=∫0πexcosxdx
精确值是:I = -12.0703463164
(1)复化梯形公式:
python代码:
import math
a, b = 0, math.pi # 区间端点
I = -12.0703463164 # 精确解
F_a = math.e ** a * math.cos(a)
F_b = math.e ** math.pi * math.cos(b)
ls = [1] # 存放E_n
for i in range(1,10):
n = 2 ** i
h = (b-a) / n
m = 0
# 计算复化求积公式中的和式
for j in range(1,n):
m += math.e ** (j*b/n) * math.cos(j*b/n)
T_n = h / 2 * (F_a + 2*m + F_b)
E_n = I - T_n
ls.append(str(E_n))
print('Tn={:.10f} En={:.2E} En/E2n={:.2f}'.format(T_n, E_n, float(ls[i-1])/float(ls[i])), '\t','n={}'.format(n))
运行结果:
结论:
当n加倍(步长h减半)时,误差E(n)按因子4递减,误差确是O(h^2);当n增大时,复化梯形公式的误差越来越小,近似解也越来越收敛于精确解;但是,当n相对较小时,求解效果并不是太好,误差相对较大。
(2)复化Simpson公式:
python代码:
import math
a, b = 0, math.pi # 区间端点
I = -12.0703463164 # 精确解
F_a = math.e ** a * math.cos(a)
F_b = math.e ** math.pi * math.cos(b)
ls = [-1] # 存放E_n
for i in range(1,9):
n = 2 ** i
h = (b-a) / n
p = q = 0
# 计算复化求积公式中的和式
for j in range(1, 2*n, 2):
p += math.e ** (j*b/(2*n)) * math.cos(j*b/(2*n))
for k in range(2, 2*n, 2):
q += math.e ** (k*b/(2*n)) * math.cos(k*b/(2*n))
S_n = h / 6 * (F_a + 4*p + 2*q + F_b)
E_n = I - S_n
ls.append(str(E_n))
print('Sn={:.10f} En={:.2E} En/E2n={:.2f}'.format(S_n, E_n, float(ls[i-1])/float(ls[i])), '\t','n={}'.format(n))
运行结果:
结论:
当n加倍(步长h减半)时,误差E(n)按因子16递减,误差确是O(h^4);当n增大时,复化Simpson公式的误差越来越小,近似解也越来越收敛于精确解;复化Simpson公式总体上近似效果较好,要比复化梯形公式优越的多。
如有错误或者不足之处,欢迎大家留言指正!