数值计算方法上机实习题
xndx, 1. 设In??05?x11,从I0=0.1822, I0=0.1823出发,计算I20; n11(2) I20=0,I20=10000, 用In?1??In?,计算I0;
55n(1) 由递推公式In??5In?1?(3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。
解:(1)程序如下: (2)程序如下: clear all clear all clc clc I=0.1822; %题中的已知数据 I=0; %赋予I20的初始值 for n=1:20; for n=0:19; I=(-5)*I+1/n; %由递推公式所得 I=(-1/5)*I+1/(5*(20-n)); %有递推公式得 end end fprintf('I20=%f\\n',I) fprintf('I0=%f\\n',I)
M=10000; M=0.1823; %与I的计算结果形成对比
for i=1:20; for i=0:19; M=(-5)*M+1/i; %由递推公式所得 M=(-1/5)*M+1/(5*(20-i));%有递推公式得 end end fprintf('M20=%f\\n',M) fprintf('M0=%f\\n',M) 输出结果为: 输出结果为: I20=-11592559237.912731 I0=0.182322 M20=-2055816073.851284 M0=0.182322
(3)由输出结果可看出第一种算法为不稳定算法,第二中算法为稳定算法。 由于误差
*e0?I0?I 0*en?In?In??5In?1?11**2n?(?5In?)?5(In?1?1?In?1)?5en?1?5en?2?5e0nn第一种算法为正向迭代算法,每计算一步误差增长5倍,虽然所给的初始值很接近,随
着n的增大,误差也越来越大。
?en?In?In111?111????en?1?In?1?In?e??I??(?I?)?I?I?en ?1nnnnn55n55n55?1?e0???en?5?第二种算法为倒向迭代算法,每计算一步误差缩小5倍,虽然所给的初始值之间差很多,随着n的增大,误差也越来越小。
?42. 求方程e?10x?2?0的近似根,要求xk?1?xk?5?10,并比较计算量。
xn(1) 在[0,1]上用二分法; (2) 取初值x0?0,并用迭代xk?12?ex?;
10(3) 加速迭代的结果;
(4) 取初值x0?0,并用牛顿迭代法; (5) 分析绝对误差。 解:(1)程序如下(二分法): clear all clc
a=0;b=1;
f=@(x)(exp(x)+10*x-2);
%@是定义函数句柄的运算符 c=(a+b)/2;%取区间中点 i=0;%分割次数
while abs(f(c))>5*10^(-4)
%判断f(x)的精度是否满足要求 if f(a)*f(c)<0 b=c;c=(a+b)/2; elseif f(b)*f(c)<0 a=c;c=(b+a)/2; end i=i+1; end
fprintf('二分法运算次数为%i\\n',i) fprintf('二分法计算结果为%f\\n',c) 运行结果如下:
二分法运算次数为13
二分法计算结果为0.090515 (2)程序如下(不动点迭代)
(3)程序如下(艾肯特迭代加速) clear all clc x0=0;
x=x0; %给定迭代初值
p(1000)=0; %先定义p矩阵的长度 p(1)=x;
for k=2:1000 ; %规定迭代次数上限 y=(2-exp(x))/10; z=(2-exp(y))/10;
x=x-((y-x)^2)/(z-2*y+x); (4)程序如下(牛顿法迭代) clear all
clear all clc x0=0; x=x0;
for k=1:10000 %规定迭代次数上限
y=(2-exp(x))/10; %迭代结果存到y中 if abs(x-y)<5*10^(-4)
fprintf('初始值x0为%i\\n迭代次数为%i\\n',x0,k); break end x=y;
if k==10000;
fprintf('迭代次数超出上限%i\\n',k); end end
fprintf('迭代法计算结果为%f\\n',y); 运行结果为: 初始值x0为0 迭代次数为4
迭代法计算结果为0.090513
clc x0=0;
x=x0; %给定迭代初值
for k=1:1000 ; %规定迭代次数上限
y=x-(exp(x)+10*x-2)/(exp(x)+10); %牛顿计算公式
if abs(y-x)<5*10^(-4)
fprintf('初始值x0为%f\\n迭代次数为%i\\n',x0,k);
%艾特肯加速公式
p(k)=x; %p是用来存储每一步迭代结果的矩阵
if abs(p(k-1)-p(k))<5*10^(-4)
x=y; fprintf('初始值x0为%f\\n迭代次数
if k==1000; 为%i\\n',x0,k-1);
break fprintf('迭代次数超出上限%i\\n',k); end end if k==1000; end fprintf('迭代次数超出上限%i\\n',k); fprintf('牛顿迭代法计算结果为%f\\n',y);
end 运行结果为: end 初始值x0为0.000000 fprintf('艾特肯加速迭代法计算结果迭代次数为2 为%f\\n',x); 牛顿迭代法计算结果为0.090525 运行结果为: (5)分析绝对误差 初始值x0为0.000000 通过指令求得方程精确解的近似解:
>> solve('exp(x)+10*x-2=0') 迭代次数为2
ans = 艾特肯加速迭代法计算结果为0.090525
1/5 - lambertw(0, exp(1/5)/10) >> 1/5 - lambertw(0, exp(1/5)/10) break ans = end 0.090525101307255 各种计算方法的绝对误差为:
二分法的绝对误差:1.0e-04 * 0.508986927450078
不动点迭代方法的绝对误差: 1.0e-04 * 0.121013072549997 艾特肯加速迭代的绝对误差: 1.0e-04 * 0.001013072550016 牛顿法的绝对误差: 1.0e-04 * 0.001013072550016
由上述各种算法计算出方程的值,二分法迭代了11次,收敛速度最慢,不动点迭代法迭代了4次,艾特肯迭代法迭代了2次,牛顿法迭代了2次,后两种方法的收敛速度都比较快,但计算量大。由绝对误差可以看出二分法的误差最大,而艾特肯加速迭代和牛顿法误差最小。
3.钢水包使用次数多以后,钢包的容积增大,数据如下: x y 10 2 3 4 5 6 9.7 14 7 10 15 8 11 12 13 16 10.49 10.59 10.60 10.8 10.6 10.9 10.76 试从中找出使用次数和容积之间的关系,计算均方差。(用y?解:用已知函数模型来拟合,程序如下: 先编辑函数
function [err]=f31(f,x,y) a=f(1); b=f(2); c=f(3); err=0; for k=1:15
err=err+((c+x(k))*y(k)-(a*x(k)+b))^2;
9 6.42 8.2 9.58 9.5 9.93 9.99 ax?b拟合) c?x