【数值分析_数值逼近】实例体会误差分析的重要性

引言

课本1.2节的例1.1给出了不同方法计算定积分的结果与精确解之间的误差。本文分析课本内容并给出上机代码实现。

理论分析

例1.1 计算积分I_{n}=e^{-1}\int_{0}^{1}x^{n}e^{x}dx (n=0,1,2...),并估计误差.

分部积分法手算得到I_{n}的递推公式

发现e^{-1}\int_{0}^{1}x^{n}e^{n}dx就是I_{n-1},得递推公式

I_{n}=1-nI_{n-1}

 n=0时,有I_{0}=e^{-1}\int_{0}^{1}e^{x}dx=1-e^{-1}.

若求出I_{0}的值,将I_{0}代入递推公式,可逐次求出I_{1},I_{2},I_{3},...的值. 用Taylor多项式展开部分和计算e^{-1}的近似值

e^{-1}\approx 1+(-1)+\frac{(-1)^{2}}{2!}+...+\frac{(-1)^{k}}{k!}

 取k=7,用四位小数计算,得e^{-1}\approx 0.36791-e^{-1}=0.6321,由I_{n}=1-nI_{n-1}递推的计算公式为方案A:

\widetilde{I_{0}}=0.6321

\widetilde{I_{n}}=1-n\widetilde{I_{n-1}}(n=1,2,...)

初值I_{0}引起的误差在后续计算过程引起的误差越来越大:

 实际计算会发现n大到一定程度时,积分值误差较大,甚至出现负数。 

换一种计算方案,由\frac{e^{-1}}{n+1}<I_{n}<\frac{1}{n+1},取n=9,得

\frac{e^{-1}}{10}<I_{9}<\frac{1}{10}

粗略取                                                   I_{9}\approx \frac{1}{2}(\frac{1}{10}+\frac{e^{-1}}{10})=0.0684=I_{9}^{*}

 方案B:

 I_{9}^{*}=0.0864

I_{n-1}^{*}=\frac{1}{n}(1-I_{n-1}^{*}) 

虽然方案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位),不改变实际的小数位数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值