文档介绍:实验一:
1、试验程序:
function charpt1_2
% 误差传播及算法稳定性实验
clc;clear all;
promps={'请选择递推关系式,若选E1=1/e,En=1-nEn-1,请输入1,若选EN=0,En-1=(1-En)/n,请输入2:'};
I=1;
while I
result=inputdlg(promps,'charpt1_2',1,{'1'});
Nb=str2num(char(result));
if ((Nb~=1)|(Nb~=2))
I=0;
end
end
%%%%%%%%%%%%%%%%%
I=1;
while I
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));
format long %% 设置显示精度
result=zeros(1,steps); %% 存储计算结果
err=result; %% 存储计算的绝对误差值
func=result; %% 存储用quadl计算的近似值
%%%%%%%%%%%%%%%%%
%% 用quadl计算积分近似值
for n=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)));
for n=2:steps
result(n)=subs(vpa(1-n*result(n-1)));
end
err=abs(result-func);
elseif(Nb==2)
digits(Sd);
result(steps)=0;
for n=(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('自定义算法结果','库函数计算结果','误差值');
grid on
2、试验结果:
选择递推关系式1,递推步数为10,有效数字为5位,计算结果如下:
库函数计算值:
-001 -001 -001 -001 -001 -001 -001 -001 -002 -002
递推值:
-001 -001 -001 -001 -001 -001 -001 -002 -001 -+000
误差值:
-007 -006 -006 -005 -005