数值分析matlab数值试验.docx
- 文档编号:9714295
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:14
- 大小:81.91KB
数值分析matlab数值试验.docx
《数值分析matlab数值试验.docx》由会员分享,可在线阅读,更多相关《数值分析matlab数值试验.docx(14页珍藏版)》请在冰豆网上搜索。
数值分析matlab数值试验
实验一:
误差传播及算法稳定性实验1.2
1、试验程序:
functioncharpt1_2
%误差传播及算法稳定性实验
clc;clearall;
promps={'请选择递推关系式,若选E1=1/e,En=1-nEn-1,请输入1,若选EN=0,En-1=(1-En)/n,请输入2:
'};
I=1;
whileI
result=inputdlg(promps,'charpt1_2',1,{'1'});
Nb=str2num(char(result));
if((Nb~=1)|(Nb~=2))
I=0;
end
end
%%%%%%%%%%%%%%%%%
I=1;
whileI
result=inputdlg('请输入递推步数n>=1:
','charpt1_2',1,{'10'});
steps=str2num(char(result));
if(steps>0)&(steps==fix(steps))%%如果steps大于0且为整数
I=0;
end
end
%%%%%%%%%%%%%%%%%
result=inputdlg('请输入计算中所采用的有效数字位数n:
','charpt1_2',1,{'5'});
Sd=str2num(char(result));
formatlong%%设置显示精度
result=zeros(1,steps);%%存储计算结果
err=result;%%存储计算的绝对误差值
func=result;%%存储用quadl计算的近似值
%%%%%%%%%%%%%%%%%
%%用quadl计算积分近似值
forn=1:
steps
fun=@(x)x.^n.*exp(x-1);
func(n)=quadl(fun,0,1);
end
%%%%%%%%%%%%%%%%%
%%用自定义算法计算
if(Nb==1)
digits(Sd);
result
(1)=subs(vpa(1/exp
(1)));
forn=2:
steps
result(n)=subs(vpa(1-n*result(n-1)));
end
err=abs(result-func);
elseif(Nb==2)
digits(Sd);
result(steps)=0;
forn=(steps-1):
-1:
1
result(n)=subs(vpa((1-result(n+1))/(n+1)));
end
err=abs(result-func);
end
%%%%%%%%%%%%%%%%%
%%输出结果数值及图像
clf;
disp('库函数计算值:
');
disp(sprintf('%e',func));
disp('递推值:
');
disp(sprintf('%e',result));
disp('误差值:
');
disp(sprintf('%e',err));
if(Nb==1)
plot([1:
steps],result,'-rs',[1:
steps],func,':
k*',[1:
steps],err,'-.bo');
elseif(Nb==2)
plot([steps:
-1:
1],result,'-rs',[steps:
-1:
1],func,':
k*',[steps:
-1:
1],err,'-.bo');
end
xlabel('第n步');
ylabel('计算值');
legend('自定义算法结果','库函数计算结果','误差值');
gridon
2、试验结果:
选择递推关系式1,递推步数为10,有效数字为5位,计算结果如下:
库函数计算值:
3.678794e-0012.642411e-0012.072766e-0011.708934e-0011.455329e-0011.268024e-0011.123836e-0011.009323e-0019.161229e-0028.387707e-002
递推值:
3.678800e-0012.642400e-0012.072800e-0011.708800e-0011.456000e-0011.264000e-0011.152000e-0017.840000e-0022.944000e-001-1.944000e+000
误差值:
5.588280e-0071.117662e-0063.352927e-0061.341222e-0056.705713e-0054.023702e-0042.816427e-0032.253226e-0022.027877e-0012.027877e+000
选择递推关系式2,递推步数为10,有效数字为5位,计算结果如下:
库函数计算值:
3.678794e-0012.642411e-0012.072766e-0011.708934e-0011.455329e-0011.268024e-0011.123836e-0011.009323e-0019.161229e-0028.387707e-002
递推值:
3.678800e-0012.642400e-0012.072800e-0011.708900e-0011.455300e-0011.267900e-0011.125000e-0011.000000e-0011.000000e-0010.000000e+000
误差值:
5.588280e-0071.117662e-0063.352927e-0063.412224e-0062.942873e-0061.237016e-0051.164270e-0049.322618e-0048.387707e-0038.387707e-002
选择递推关系式1,递推步数为10,有效数字为6位,计算结果如下:
库函数计算值:
3.678794e-0012.642411e-0012.072766e-0011.708934e-0011.455329e-0011.268024e-0011.123836e-0011.009323e-0019.161229e-0028.387707e-002
递推值:
3.678790e-0012.642420e-0012.072740e-0011.709040e-0011.454800e-0011.271200e-0011.101600e-0011.187200e-001-6.848000e-0021.684800e+000
误差值:
4.411720e-0078.823378e-0072.647073e-0061.058778e-0055.294287e-0053.176298e-0042.223573e-0031.778774e-0021.600923e-0011.600923e+000
选择递推关系式2,递推步数为10,有效数字为6位,计算结果如下:
库函数计算值:
3.678794e-0012.642411e-0012.072766e-0011.708934e-0011.455329e-0011.268024e-0011.123836e-0011.009323e-0019.161229e-0028.387707e-002
递推值:
3.678800e-0012.642410e-0012.072770e-0011.708930e-0011.455360e-0011.267860e-0011.125000e-0011.000000e-0011.000000e-0010.000000e+000
误差值:
5.588280e-0071.176622e-0073.529274e-0074.122239e-0073.057127e-0061.637016e-0051.164270e-0049.322618e-0048.387707e-0038.387707e-002
3、结果分析:
很明显第二种递推式结果要比第一种好,式1在第七步后有明显误差,而式2在第三步后基本与近似解一致。
而从理论上也可以得到我们也可以得到类似结论。
这是由于式1前一步的误差乘以n后累积到后一步,从而使误差扩散,而式2恰恰相反。
有效数字位数影响不是很明显。
实验二:
多项式差值的震荡现象实验2.1
1、试验程序:
functioncharpt2_1
%数值试验二:
多项式差值的震荡现象
promps={'请选择实验函数,若选f(x),请输入f,若选h(x),请输入h,若选g(x),请输入g:
'};
result=inputdlg(promps,'charpt2_1',1,{'f'});
Nb_f=char(result);
result=inputdlg({'请输入插值多项式的次数N>=1:
'},'charpt2_1',1,{'10'});
Nd=str2num(char(result));
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);
clf;
fplot(f,[a,b],'co');
holdon;
plot(x,y,'b--');
xlabel('x');
ylabel('y=f(x)oandy=Ln(x)--');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
functiony=Lagrange(x0,y0,x)
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
2、试验结果:
函数f(x):
n=2
n=3
n=4
n=5
n=6
n=10
函数g(x):
n=2
n=3
n=4
n=5
n=6
n=10
n=20
3、结果分析:
可以看到无论是哪个函数在某个低次以下时,插值函数结果与实际差别很大,随着次数上升,结果得到改善。
但是这只是在一定的区间上,如果不在此区间上,随着次数上升,会出现插值结果突然偏离原函数的现象,次数越高,偏离现象越严重。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 matlab 试验
![提示](https://static.bdocx.com/images/bang_tan.gif)