复化求积的思想:
将区间[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πexcosxdxI = \int_0^\pi e^xcosxdx\ I=∫0πexcosxdx
精确值是:I = -12.0703463164
(1)复化梯形公式:
python代码:
import matha, 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_nfor i in range(1,10):n = 2 ** ih = (b-a) / nm = 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_nls.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 matha, 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_nfor i in range(1,9):n = 2 ** ih = (b-a) / np = 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_nls.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公式总体上近似效果较好,要比复化梯形公式优越的多。
如有错误或者不足之处,欢迎大家留言指正!