end
if (djwcX disp else disp X=X;jX=jX' end end X=X;D,U,L,jX=jX (a)的MATLAB程序如下: A=[10 -1 -2;-1 10 -2;-1 -1 0.5]; b=[7.2;8.3;4.2]; X0=[0;0;0]; X=gsdddy(A,b,X0,inf, 0.001,100) (b)的MATLAB程序如下: A=[3 4 -5 7;2 -8 3 -2;4 51 -13 16;7 -2 21 3];b=[5;2;-1;21]; X0=[0;0;0;0];X=gsdddy(A,b,X0,inf,0.001,100) 2.用逐次超松弛迭代法解由一电路得到的方程组 11?111(??)x?x??2431423x3?10,?1111?1?x?(??)x?x3?0, ?124355?411115?1?x?x?(??)x?.3?31523353?解的精度为0.001。 逐次超松弛法的MATLAB程序如下: a(1,1)=1/2+1/4+1/3;a(1,2)=-1/4;a(1,3)=-1/3; a(2,1)=a(1,2);a(2,2)=1/4+1/3+1/5;a(2,3)=-1/5; a(3,1)=a(1,3);a(3,2)=a(2,3);a(3,3)=1/3+1/3+1/5; y(1)=20/2;y(2)=0;y(3)=5/3; x=zeros(1,3); w=1.2; for it=1:50 error=0; 15 for i=1:3 s=0;xb=x(i); for j=1:3 if i~=j,s=s+a(i,j)*x(j);end end x(i)=w*(y(i)-s)/a(i,i)+(1-w)*x(i); error=error+abs(x(i)-xb); end fprintf('it.no.=%3.0f,error=%7.2e\\n',it,error) if error/3<0.001,break;end end x 四、实验要求: 1.掌握常用的几种迭代方法; 2.掌握迭代法收敛性及误差估计; 3.学会用高斯-塞德尔迭代法、逐次超松弛迭代法求解线性方程组。 16 实验五 非线性方程的数值解法 一、实验目的: 1.掌握非线性方程的各种解法,包括迭代法、牛顿法,并通过编程练习与上机运算,体会迭代法、牛顿法的不同特点; 2.掌握解非线性方程的弦截法,并与牛顿法作比较; 3.了解各种方法的收敛性。 二、实验内容: 用二分法、牛顿法、弦截法求非线性方程的根。 三、实验过程: 1.用迭代法求方程f(x)?x2?2x?10的一个正根。 迭代法的MATLAB程序 function [k,piancha,xdpiancha,xk]=diedai1(x0,k) x(1)=x0; for i=1:k x(i+1)=fun1(x(i)); piancha= abs(x(i+1)-x(i)); xdpiancha=piancha/( abs(x(i+1))+eps); i=i+1;xk=x(i);[(i-1) piancha xdpiancha xk] end if (piancha >1)&(xdpiancha>0.5)&(k>3) disp return; end if (piancha < 0.001)&(xdpiancha< 0.0000005)&(k>3) disp return; end p=[(i-1) piancha xdpiancha xk]; 用不同迭代法求解的MATLAB程序如下: function m=fun1 (x) m=(10-x*x)/2; [k,piancha,xdpiancha,xk]= diedai1(2,5) 2)/2的结果 运行后输出用迭代公式xk?1?(10?xk 17 [k,piancha,xdpiancha,xk]=1.00000000000000 1.00000000000000 0.33333333333333 3.00000000000000 2.00000000000000 2.50000000000000 5.00000000000000 0.50000000000000 3.00000000000000 4.37500000000000 0.89743589743590 4.87500000000000 4.00000000000000 11.75781250000000 1.70828603859251 -6.88281250000000 5.00000000000000 11.80374145507813 0.63167031671297 -18.68655395507813 请用户注意:此迭代序列发散 k=5,piancha = 11.80374145507813,xdpiancha = 0.63167031671297,xk = -18.68655395507813 由以上运行后输出的迭代序列与根x*=2.316 624 790 355 40相差越来越大,即迭代序列{xk}发散,此迭代法就失败.这时偏差piancha逐渐增大且偏差的相对误差xdpiancha的值大于0.5。 请重新输入新的迭代公式 function m=fun1 (x) m=10/(x+2); [k,piancha,xdpiancha,xk]= diedai1(2,5) 用迭代公式xk?1?10/(xk?2)运行后输出的结果 [k,piancha,xdpiancha,xk]=1.00000000000000 0.50000000000000 0.20000000000000 2.50000000000000 2.00000000000000 0.27777777777778 0.12500000000000 2.22222222222222 3.00000000000000 0.14619883040936 0.06172839506173 2.36842105263158 4.00000000000000 0.07926442612555 0.03462603878116 2.28915662650602 5.00000000000000 0.04230404765128 0.01814486863115 2.33146067415730 k=5,piancha =0.04230404765128,xdpiancha = 0.01814486863115, xk = 2.33146067415730 可见,偏差piancha和偏差的相对误差xdpiancha的值逐渐变小,且第5次的迭代值xk =2.331 460 674 157 30与根x*=2.316 624 790 355 40接近,则迭代序列 {xk}收敛,但收敛速度较慢,此迭代法较为成功。 18

