引言
课本1.2节的例1.1给出了不同方法计算定积分的结果与精确解之间的误差。本文分析课本内容并给出上机代码实现。
理论分析
例1.1 计算积分 ,并估计误差.
解 分部积分法手算得到的递推公式
发现就是,得递推公式
n=0时,有.
若求出的值,将代入递推公式,可逐次求出的值. 用Taylor多项式展开部分和计算的近似值
取k=7,用四位小数计算,得,,由递推的计算公式为方案A:
初值引起的误差在后续计算过程引起的误差越来越大:
实际计算会发现n大到一定程度时,积分值误差较大,甚至出现负数。
换一种计算方案,由,取n=9,得
,
粗略取
方案B:
虽然方案A和方案B用到的递推公式相同,只是前者顺序计算,后者逆序计算,但方案B的误差在计算过程中是逐步缩小的。
代码实现
方案A
function I=SolutionA(N)
%方案A
I=zeros(N+1,1);
I(1)=1-exp(-1);
for n=1:N
I(n+1)=1-n*I(n);
end
方案B
function I=SolutionB(N)
%方案B
I=zeros(N+1,1);
I(N+1)=(1/(N+1)+(exp(-1))/(N+1))/2;
for n=N:-1:1
I(n)=(1-I(n+1))/n;
end
利用matlab自带的函数计算积分准确值
function I=SolutionE(N)
%精确解
syms x;
I=zeros(N+1,1);
for n=0:N
I(n+1)=vpa(exp(-1)*int(x^(n)*exp(x),0,1),4);
end
利用matlab自带的函数得到积分的数值结果
function I=SolutionN(N)
%数值解
I=zeros(N+1,1);
for n=0:N
I(n+1)=integral(@(x) x.^n.*exp(x),0,1,'AbsTol',1e-12);
end
测试函数:比对我们自己编写的程序与matlab给出的准确解、数值解之间的误差。
function Test(ft,fn,fe,N)
fprintf('输出方案A的结果\n');
format short
L1=ft(N)
fprintf('输出精确解\n');
format short
L1=fe(N)
fprintf('输出数值解\n');
format short
L1=fn(N)
fprintf('比较方案A与精确解的误差\n');
errore=abs(ft(N)-fe(N))
fprintf('比较方案A与数值解的误差\n');
errore=abs(ft(N)-fn(N))
运行结果
>> Test(@SolutionA,@SolutionN,@SolutionE,9)
输出方案的结果
L1 =
0.6321
0.3679
0.2642
0.2073
0.1709
0.1455
0.1268
0.1124
0.1009
0.0916
输出精确解
L1 =
0.6321
0.3679
0.2642
0.2073
0.1709
0.1455
0.1268
0.1124
0.1009
0.0916
输出数值解
L1 =
1.7183
1.0000
0.7183
0.5634
0.4645
0.3956
0.3447
0.3055
0.2744
0.2490
比较方案与精确解的误差
errore =
1.0e-07 *
0.0000
0.0000
0.0000
0.0000
0.0001
0.0006
0.0035
0.0060
0.2498
0.4603
比较方案与数值解的误差
errore =
1.0862
0.6321
0.4540
0.3562
0.2936
0.2501
0.2179
0.1931
0.1734
0.1574
>> Test(@SolutionB,@SolutionN,@SolutionE,9)
输出方案的结果
L1 =
0.6321
0.3679
0.2642
0.2073
0.1709
0.1455
0.1268
0.1121
0.1035
0.0684
输出精确解
L1 =
0.6321
0.3679
0.2642
0.2073
0.1709
0.1455
0.1268
0.1124
0.1009
0.0916
输出数值解
L1 =
1.7183
1.0000
0.7183
0.5634
0.4645
0.3956
0.3447
0.3055
0.2744
0.2490
比较方案与精确解的误差
errore =
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0003
0.0026
0.0232
比较方案与数值解的误差
errore =
1.0862
0.6321
0.4540
0.3562
0.2936
0.2501
0.2178
0.1934
0.1708
0.1806
和课本结果不同是因为,课本在每一步计算之后都进行了四舍五入,只保留小数点后四位。我们的程序中,format short的作用是显示5个字长的数字(小数点后4位),不改变实际的小数位数。