复化求积方法对提高积分精度是行之有效的,但必须事先给出恰当的步长h。如果步长太长,则难以保证精度,太小则增加计算量。在实际应用中,一般采用变步长积分法来解决该问题,即让步长不断减小,考察在不同步长条件下的计算结果的精度,一旦计算结果满足精度要求,则可以停止计算,给出正确答案。这是面向计算机的解决方案。在人工计算的条件下,一般采用一种特殊的变步长法,即采用逐次二分积分区间的方法得到不断减半的步长,再应用复化求积方法,可推导出某种递推公式,既可减少计算量,又可以较快地达到计算精度的要求。
- 变步长梯形法
对于
I
=
∫
a
b
f
(
x
)
d
x
I=\int_a^bf(x)dx
I
=
∫
a
b
f
(
x
)
d
x
,将积分区间
[
a
,
b
]
[a,b]
[
a
,
b
]
分成n等分,则共有
n
+
1
n+1
n
+
1
个分点:
x
k
=
a
+
k
H
(
k
=
0
,
1
,
2
,
⋯
,
n
)
,
H
=
(
b
−
a
)
/
n
x_k=a+kH \quad (k=0,1,2,\cdots,n),H=(b-a)/n
x
k
=
a
+
k
H
(
k
=
0
,
1
,
2
,
⋯
,
n
)
,
H
=
(
b
−
a
)
/
n
设此时用复化梯形公式求得的积分值为
T
n
T_n
T
n
。进一步地,将积分区间
[
a
,
b
]
[a,b]
[
a
,
b
]
分成2n等分,则共有
2
n
+
1
2n+1
2
n
+
1
个分点,设此时用复化梯形公式求得的积分值为
T
2
n
T_{2n}
T
2
n
。显然,在计算
T
2
n
T_{2n}
T
2
n
的过程中所用的分点有一半是计算
T
n
T_n
T
n
时用过的,重复计算是浪费。为此,有必要研究
T
n
T_n
T
n
和
T
2
n
T_{2n}
T
2
n
之间的关系。
对于任意一个子区间
[
x
k
,
x
k
+
1
]
[x_k,x_{k+1}]
[
x
k
,
x
k
+
1
]
,用梯形公式计算的积分值记为
T
1
,
k
T_{1,k}
T
1
,
k
,在其中间增加一个节点
x
k
+
1
2
=
1
2
(
x
k
+
x
k
+
1
)
x_{k+\frac{1}{2}}=\frac{1}{2}(x_k+x_{k+1})
x
k
+
2
1
=
2
1
(
x
k
+
x
k
+
1
)
后,用复化梯形公式计算的积分值为
T
2
,
k
T_{2,k}
T
2
,
k
。则有:
T
1
,
k
=
1
2
H
[
f
(
x
k
)
+
f
(
x
k
+
1
)
]
T
2
,
k
=
1
4
H
[
f
(
x
k
)
+
2
f
(
x
k
+
1
2
)
+
f
(
x
k
+
1
)
]
T_{1,k}=\frac{1}{2}H[f(x_k)+f(x_{k+1})] \\ T_{2,k}=\frac{1}{4}H[f(x_k)+2f(x_{k+\frac{1}{2}})+f(x_{k+1})]
T
1
,
k
=
2
1
H
[
f
(
x
k
)
+
f
(
x
k
+
1
)
]
T
2
,
k
=
4
1
H
[
f
(
x
k
)
+
2
f
(
x
k
+
2
1
)
+
f
(
x
k
+
1
)
]
分析
T
2
,
k
T_{2,k}
T
2
,
k
和
T
1
,
k
T_{1,k}
T
1
,
k
的关系,可得:
T
2
,
k
=
1
2
T
1
,
k
+
1
2
H
⋅
f
(
x
k
+
1
2
)
T_{2,k}=\frac{1}{2}T_{1,k}+\frac{1}{2}H·f(x_{k+\frac{1}{2}})
T
2
,
k
=
2
1
T
1
,
k
+
2
1
H
⋅
f
(
x
k
+
2
1
)
所以
T
2
n
=
1
2
T
n
+
1
2
H
∑
k
=
0
n
−
1
f
(
x
k
+
1
2
)
(1)
T_{2n}=\frac{1}{2}T_n+\frac{1}{2}H\sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}}) \tag{1}
T
2
n
=
2
1
T
n
+
2
1
H
k
=
0
∑
n
−
1
f
(
x
k
+
2
1
)
(
1
)
或
T
2
n
=
1
2
T
n
+
h
∑
k
=
0
n
−
1
f
(
x
k
+
1
2
)
T_{2n}=\frac{1}{2}T_n+h\sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}})
T
2
n
=
2
1
T
n
+
h
k
=
0
∑
n
−
1
f
(
x
k
+
2
1
)
式中,
∑
k
=
0
n
−
1
f
(
x
k
+
1
2
)
\sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}})
∑
k
=
0
n
−
1
f
(
x
k
+
2
1
)
为区间
[
a
,
b
]
[a,b]
[
a
,
b
]
分成n等分再次二分而增加的新节点的函数值之和。要特别注意的是
H
=
(
b
−
a
)
/
n
H=(b-a)/n
H
=
(
b
−
a
)
/
n
为区间
[
a
,
b
]
[a,b]
[
a
,
b
]
分成n等分的步长,
h
=
b
−
a
2
n
h=\frac{b-a}{2n}
h
=
2
n
b
−
a
为区间
[
a
,
b
]
[a,b]
[
a
,
b
]
分成2n等分的步长,
x
k
+
1
2
=
a
+
(
k
+
1
2
)
H
x_{k+\frac{1}{2}}=a+(k+\frac{1}{2})H
x
k
+
2
1
=
a
+
(
k
+
2
1
)
H
。
如果将区间
[
a
,
b
]
[a,b]
[
a
,
b
]
继续分成4n等分、8n等分、···、2n(i=0,1,···)等分,均可按照公式(1)递推计算出来。
在实际计算中,利用某二分前后两次积分值之差的绝对值
∣
T
2
n
−
T
n
∣
≤
ϵ
|T_{2n}-T_n|\leq \epsilon
∣
T
2
n
−
T
n
∣
≤
ϵ
,来判断积分近似值
T
2
n
T_{2n}
T
2
n
是否满足精度要求。
- 变步长梯形法的误差
在变步长梯形法中,把区间
[
a
,
b
]
[a,b]
[
a
,
b
]
分成n等分后,用复化梯形公式计算积分I的近似值为
T
n
T_n
T
n
,截断误差为:
R
n
=
I
−
T
n
=
−
(
b
−
a
)
12
(
b
−
a
n
)
2
f
(
2
)
(
η
n
)
R_n=I-T_n=-\frac{(b-a)}{12}(\frac{b-a}{n})^2f^{(2)}(\eta_n)
R
n
=
I
−
T
n
=
−
1
2
(
b
−
a
)
(
n
b
−
a
)
2
f
(
2
)
(
η
n
)
把区间
[
a
,
b
]
[a,b]
[
a
,
b
]
分成2n等分后,用复化梯形公式计算积分I的近似值为
T
2
n
T_{2n}
T
2
n
,截断误差为:
R
2
n
=
I
−
T
2
n
=
−
(
b
−
a
)
12
(
b
−
a
2
n
)
2
f
(
2
)
(
η
2
n
)
R_{2n}=I-T_{2n}=-\frac{(b-a)}{12}(\frac{b-a}{2n})^2f^{(2)}(\eta_{2n})
R
2
n
=
I
−
T
2
n
=
−
1
2
(
b
−
a
)
(
2
n
b
−
a
)
2
f
(
2
)
(
η
2
n
)
当
f
(
2
)
(
η
)
f^{(2)}(\eta)
f
(
2
)
(
η
)
在区间
[
a
,
b
]
[a,b]
[
a
,
b
]
上变化不大时,有
f
(
2
)
(
η
n
)
≈
f
(
2
)
(
η
2
n
)
f^{(2)}(\eta_n)\approx f^{(2)}(\eta_{2n})
f
(
2
)
(
η
n
)
≈
f
(
2
)
(
η
2
n
)
,故
R
2
n
R
n
=
1
−
T
2
n
1
−
T
n
≈
1
4
\frac{R_{2n}}{R_n}=\frac{1-T_{2n}}{1-T_n}\approx \frac{1}{4}
R
n
R
2
n
=
1
−
T
n
1
−
T
2
n
≈
4
1
整理,得事后误差估计式为:
1
−
T
2
n
≈
1
3
(
T
2
n
−
T
n
)
1-T_{2n}\approx \frac{1}{3}(T_{2n}-T_n)
1
−
T
2
n
≈
3
1
(
T
2
n
−
T
n
)
也就是说,用前后两次计算的结果之差来估计误差,两者越接近则精度越高。这是所谓的误差的时候估计。将
I
I
I
和
T
2
n
T_{2n}
T
2
n
的误差补偿给
T
2
n
T_{2n}
T
2
n
,得到比
T
2
n
T_{2n}
T
2
n
更精确的积分近似值:
I
‾
=
4
3
T
2
n
−
1
3
T
n
\overline I=\frac{4}{3}T_{2n}-\frac{1}{3}T_n
I
=
3
4
T
2
n
−
3
1
T
n