数值分析实验报告.docx
- 文档编号:4454102
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:16
- 大小:204.59KB
数值分析实验报告.docx
《数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
数值分析实验报告
数值实验题1
实验1.1病态问题
实验目的:
算法有“优”与“劣”之分,问题也有“好”与“坏”之别。
对数值方法的研究而言,所谓坏问题是指问题本身对扰动敏感,反之属于好问题。
本实验通过对一个高次多项式方程的求解,初步认识病态问题。
实验内容:
考虑一个高次的代数多项式
(E.1.1)
显然该多项式的全部根为1,2,…,20,共计20个,且每个根都是单重的(也称为简单的)。
现考虑该多项式的一个扰动
,(E.1.2)
其中,ε是一个非常小的数。
这相当于是对方程(E.1.1)中x19的系数作一个小的扰动。
比较方程(E.1.1)和方程(E.1.2)根的差别,从而分析方程(E.1.1)的解对扰动的敏感性。
实验步骤与结果分析:
(一)实验源程序
functiont_charpt1_1
%数值实验1.1病态问题
%输入:
[020]之间的扰动项及小的扰动常数
%输出:
加扰动后得到的全部根
clc
result=inputdlg({'请输入扰动项:
在[020]之间的整数:
'},'charpt1_1',1,{'19'});
Numb=str2num(char(result));
if((Numb>20)|(Numb<0))errordlg('请输入正确的扰动项:
[020]之间的整数!
');return;end
result=inputdlg({'请输入(01)之间的扰动常数:
'},'charpt1_1',1,{'0.00001'});
ess=str2num(char(result));
ve=zeros(1,21);
ve(21-Numb)=ess;
root=roots(poly(1:
20)+ve);
x0=real(root);y0=imag(root);
plot(x0',y0','*');
disp(['对扰动项',num2str(Numb),'加扰动',num2str(ess),'得到的全部根为:
']);
disp(num2str(root));
(二)实验结果分析
(1)对于x19项的扰动ess,不同的取值对应的结果如下所示。
●对扰动项19加扰动1e-010得到的全部根为:
19.9961,19.0257,17.9085,17.1508,15.7982,15.181,13.8995,13.0571,11.9753,11.0109,9.99608,9.00111,7.99978,7.00003,6,5,4,3,2,1。
●对扰动项19加扰动1e-009得到的全部根为:
19.952,19.2293,17.6573+0.692896i,17.6573-0.692896i,15.4524+0.875524i,15.4524-0.875524i,13.3527+0.486992i,13.3527-0.486992i,11.8578,11.0427,9.9916,9.00201,7.99952,7.00009,5.99999,5,4,3,2,1。
●对扰动项19加扰动1e-007得到的全部根为:
20.422+0.999203i,20.422-0.999203i,18.1572+2.4702i,18.1572-2.4702i,15.3149+2.69865i,15.3149-2.69865i,12.8466+2.06246i,12.8466-2.06246i,10.9216+1.10366i,10.9216-1.10366i,9.56629,9.11508,7.99387,7.00027,6,5,4,3,2,1。
●对扰动项19加扰动1e-005得到的全部根为:
22.5961+2.3083i,22.5961-2.3083i,18.8972+5.00563i,18.8972-5.00563i,14.9123+4.95848i,14.9123-4.95848i,12.0289+3.73551i,12.0289-3.73551i,10.059+2.33021i,10.059-2.33021i,8.63828+1.0564i,8.63828-1.0564i,7.70896,7.028,5.99942,5.00001,4,3,2,1。
根在复平面上的位置如图所示:
图ess=1e-010图ess=1e-009
图ess=1e-007图ess=1e-005
从实验的图形中可以看出,当ess充分小时,方程E.1.1和方程E.1.2的解相差很小,当ess逐渐增大时,方程的解就出现了病态解,这些解都呈现复共轭性质。
并且,病态解首先出现在x=16这个解附近,如ess=1e-009时,x=20,19,12,11,…,2,1的解基本误差不大。
在x=16附近,扰动后的解偏离实轴程度较严重,随着ess的增大,扰动对解的影响从x=16附近开始向两边波及,并且偏离实轴的幅度越来越大。
x=0,1,2,3,4,5这些阶次较小的解对x19上的扰动最不敏感。
(2)将扰动项加到x18上后,ess=1e-009时方程的解都比较准确,没有出现复共轭现象。
ess=1e-008时误差与x19(ess=1e-009)时相当,即扰动加到x18上比加到x19小一个数量级。
对x8的扰动ess=1000时没有出现复共轭,误差很小;对x的扰动ess=10e10时没有出现复共轭,误差很小。
因此,扰动作用到xn上时,n越小,扰动引起的误差越小。
(3)
令
(E.3.1)
的零点均为ε的函数,分别它们记为
,显然有
。
研究
关于ε的变化情况,将
表示为
(E.3.2)
关于ε的变化或敏感程度可以用其导数表示,故在(E.3.2)两边关于ε求导:
(E.3.3)
为了知道原方程的根是如何受扰动ε的影响,需要知道
。
在(E.3.3)两边令ε
,得到
(E.3.4)
在令
,则得
,即
(E.3.5)
由于
,故
(E.3.6)
计算表明,对根1,此导数的绝对值只有
,极其微小;但从第7个根起,此导数的绝对值就从
开始,最大直到
,非常大!
所以必定造成病态。
这就是根源。
现在来估计扰动对根的影响。
对根
的影响,由(E.3.5)可得条件数
(E.3.7)
经过计算发现,扰动对
的影响最大,对
的影响最小,与实际计算结果一致。
实验1.2误差传播与算法稳定性
实验目的:
体会稳定性在选择算法中的地位。
误差扩张的算法是不稳定的,是我们所不期望的;误差衰竭的算法是稳定的,是我们努力寻求的。
实验内容:
考虑一个由积分定义的序列
(E.1.4)
显然En>0,n=1,2,…当n=1时,利用部分积分得E1=1/e。
而对n≥2,经分部积分可得递推关系En=1-nEn-1,n=2,3,…(E.1.5)
由式(E.1.4)得En≤1/(n+1)。
由递推关系式(E.1.5),可得计算式(E.1.4)积分序列{En}的两种算法。
其一为式(E.1.5)的直接应用,即
E1=1/e,En=1–nEn-1,n=2,3,…(E.1.7)
另一种算法则是利用式(E.1.5)变形得到
EN=0,En-1=(1-En)/n,n=N-1,N-2,…,3,2.(E.1.8)
实验步骤及结果分析:
(一)实验源程序
functiont_charpt1_2
%数值实验1.2:
误差传播与算法稳定性
%输入:
递推式选择及递推步数
%输出:
各步递推值及误差结果,以及递推值和误差与递推步数的关系图
clc
promps={'请选择递推关系式,若选E.1.7,请输入1,否则输入2:
'};
result=inputdlg(promps,'charpt1_2',1,{'1'});
Nb=str2num(char(result));
if((Nb~=1)&(Nb~=2))errordlg('请选择递推关系式,若选E.1.7,请输入1,否则输入2!
');return;end
result=inputdlg({'请输入递推步数n:
'},'charpt1_2',1,{'10'});
steps=str2num(char(result));
if(steps<1)errordlg('递推步数错误!
');return;end
result=zeros(1,steps);err=result;
if(Nb==1)
n=1;result(n)=1/exp
(1);
while(n result(n+1)=1-n*result(n); err(n+1)=abs(result(n+1)-func(n+1)); n=n+1; end elseif(Nb==2) n=steps; err(n)=abs(result(n)-func(n)); while(n>1) result(n-1)=(1-result(n))/n; err(n-1)=abs(result(n-1)-func(n-1)); n=n-1; end end disp(['递推值: ',num2str(result)]); disp(['误差: ',num2str(err)]); plot([1: steps],result,'-'); gridon holdon; plot([1: steps],err,'r--'); xlabel('n');ylabel('En-andERRn--'); text(2,err (2),'\uparrowerr(n)'); text(4,result(4),'\downarrowEn'); %------------------------------------------------------------------ functionen=func(n) %计算En的精确值 if(n==1) en=1/exp (1); else en=1-n*func(n-1); end (二)实验结果分析 (1)分别用算法(E.1.7)、算法(E.1.8)计算得到的结果如图所示。 图算法(E.1.7)结果图算法(E.1.8)结果 两种算法的得到的结果数据如下: ●算法(E.1.7): 递推值: 0.3678794410.632120559-0.2642411181.79272335-6.1708934131.8544671-190.1268021331.88762-10654.100995887.9084 误差: 00.3678794410.4715177651.621829946.3164263531.7276647190.2391861331.7866810654.192595887.8245 ●算法(E.1.8): 递推值: 0.367880.264240.207280.170890.145540.126790.11250.10.10 误差: 2.3114e-0084.6229e-0081.3869e-0075.5474e-0072.7737e-0061.6642e-0050.00011650.000931970.00838770.083877 显然可以看出,算法(E.1.8)可以给出精确的结果,算法(E.1.8)虽然迭代的第一次EN的误差可能比较大,但EN-1的误差就急剧缩小,后面的误差都很小;而算法(E.1.7)的误差却是逐渐增大的,E10的误差居然达到了惊人的9.6x104。 (2)两种算法的优劣与第一感觉是吻合的。 理论上分析如下: 算法(E.1.7): En=1–nEn-1,因此误差en=|En-En*|=n|En-1-En-1*|=n! |E1-E1*|=n! e1。 可见误差的传递呈n的阶乘增大,算法是不稳定的。 算法(E.1.8): En-1=(1-En)/n,因此误差 。 因此算法的误差是逐级递减的,当N取的比较大时,即使初始EN的误差很大,计算的En的误差也会很小,因此算法是稳定的。 (3)算法(E.1.7)中即使e1很小,由于n增大时,误差呈n倍增大,因此算法(E.1.7)的误差对后面的影响是扩张的。 算法(E.1.8)中即使eN很大,由于误差呈1/n递减,因此算法(E.1.8)的误差对后面的影响是衰减的。 (4)综合上面的分析,算法(E.1.7)是不稳定的,算法(E.1.8)是稳定的。 数值实验题2 实验2.1多项式插值的振荡现象 实验目的: 在一个固定的区间上用插值逼近一个函数,显然Lagrange插值中使用的节点越多,插值多项式的次数就越高。 我们自然关心插值多项式的次数增加时,Ln(x)是否也更加靠近被逼近的函数。 Runge给出的一个例子是极著名并富有启发性的。 实验内容: 设区间[-1,1]上函数f(x)=1/(1+25x2)。 考虑区间[-1,1]的一个等距划分,分点为xi=-1+2i/n,i=0,1,2,…,n, 则拉格朗日插值多项式为 . 其中,li(x),i=0,1,2,…,n是n次Lagrange插值基函数。 实验步骤与结果分析: (三)实验源程序 functiont_charpt2 %数值实验二: “实验2.1: 多项式插值的震荡现象” %输入: 函数式选择,插值结点数 %输出: 拟合函数及原函数的图形 promps={'请选择实验函数,若选f(x),请输入f,若选h(x),请输入h,若选g(x),请输入g: '}; titles='charpt_2'; result=inputdlg(promps,'charpt2',1,{'f'}); Nb_f=char(result); if(Nb_f~='f'&Nb_f~='h'&Nb_f~='g')errordlg('实验函数选择错误! ');return;end result=inputdlg({'请输入插值结点数N: '},'charpt_2',1,{'10'}); Nd=str2num(char(result)); if(Nd<1)errordlg('结点输入错误! ');return;end switchNb_f case'f' f=inline('1./(1+25*x.^2)');a=-1;b=1; case'h' f=inline('x./(1+x.^4)');a=-5;b=5; case'g' f=inline('atan(x)');a=-5;b=5; end x0=linspace(a,b,Nd+1);y0=feval(f,x0); x=a: 0.1: b;y=Lagrange(x0,y0,x); fplot(f,[ab],'co'); holdon; plot(x,y,'b--'); xlabel('x');ylabel('y=f(x)oandy=Ln(x)--'); %-------------------------------------------------------------------- functiony=Lagrange(x0,y0,x); %Lagrange插值 n=length(x0);m=length(x); fori=1: m z=x(i); s=0.0; fork=1: n p=1.0; forj=1: n if(j~=k) p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=s+p*y0(k); end y(i)=s; end (二)实验结果分析 (1)增大分点n=2,3,…时,拉格朗日插值函数曲线如图所示。 n=3n=6 n=7n=8 n=9n=10 从图中可以看出,随着n的增大,拉格朗日插值函数在x=0附近较好地逼近了原来的函数f(x),但是却在两端x=-1和x=1处出现了很大的振荡现象。 并且,仔细分析图形,可以看出,当n为奇数时,虽然有振荡,但振荡的幅度不算太大,n为偶数时,其振荡幅度变得很大。 通过思考分析,我认为,可能的原因是f(x)本身是偶函数,如果n为奇数,那么Lagrange插值函数Ln(x)的最高次项xn-1是偶次幂,比较符合f(x)本身是偶函数的性质;如果n为偶数,那么Lagrange插值函数Ln(x)的最高次项xn-1是奇次幂,与f(x)本身是偶函数的性质相反,因此振荡可能更剧烈。 (2)将原来的f(x)换为其他函数如h(x)、g(x),结果如图所示。 其中h(x),g(x)均定义在[-5,5]区间上,h(x)=x/(1+x4),g(x)=arctanx。 h(x),n=7h(x),n=8 h(x),n=9h(x),n=10 g(x),n=8g(x),n=9 g(x),n=12g(x),n=13 分析两个函数的插值图形,可以看出: 随着n的增大,拉格朗日插值函数在x=0附近较好地逼近了原来的函数f(x),但是却在两端x=-5和x=5处出现了很大的振荡现象。 并且,仔细分析图形,可以看出,当n为偶数时,虽然有振荡,但振荡的幅度不算太大,n为奇数时,其振荡幅度变得很大。 原因和上面f(x)的插值类似,h(x)、g(x)本身是奇函数,如果n为偶数,那么Lagrange插值函数Ln(x)的最高次项xn-1是奇次幂,比较符合h(x)、g(x)本身是奇函数的性质;如果n为奇数,那么Lagrange插值函数Ln(x)的最高次项xn-1是偶次幂,与h(x)、g(x)本身是奇函数的性质相反,因此振荡可能更剧烈。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)