不动点迭代法matlab程序
- 格式:doc
- 大小:20.00 KB
- 文档页数:3
问题与实验3: 一元线性迭代的收敛性条件怎样表述? 关于迭代法收敛性的两个判别条件: a 、充分必要条件是:矩阵M 的谱半径(){}1,..,2,1max<==n i M iiλρ()b 、充分条件是:矩阵M 的某个算子范数M<1。
问题与实验4: 在本例中,12<M,这时迭代序列是收敛的,就本例或选择别的例子,按12<M和12≥M构造不同的迭代法,通过实验和比较,并给出你对实验结果的解释(如关于收敛性、收敛速度等),当然这需要你首先知道矩阵范数的概念,并且对它有比较好的理解。
设x 是方程组(5)的解,{}mx 是迭代法(6)生成的任一序列,因为f Mx x +=,f Mxx mm +=+1()()()0221x x Mx x Mx x M x x mm m m -==-=-=--- ,设D = diag (a 11, a 22, …, a nn ),将AX = b 改写为: AX = (D – (D - A )) x = b DX = (D - A ) x + bX = (I – D -1A ) x + D -1b记 B = I – D -1A F = D -1 b 则迭代格式的向量表示为F BX Xk k +=+)()1( B称为雅克比迭代矩阵。
由此可知要判断X 是否收敛只需看M 的谱半径是否小于1,既有一其中I 是单位i 矩阵,D 是提取A 的对角线上的元素。
下判断条件:充要条件:(1) (){}1,..,2,1max<==n i M iiλρ.(2)充分条件是:矩阵M 的某个算子范数M<1.并且我们知道当M 越小的时候其收敛的速度越快。
并且还可以知道当初始值越接近精确解时收敛速度越快。
这是由于迭代的公式所定的。
下面来看另一个例子:X1+2X2+-2X3=1 X1+X2+X3=1 2X1+2X2+X3=1雅可比法的迭代矩阵:A=[1 2 -2; 1 1 1; 2 2 1;] b=[1;1;1;] D=diag(diag(A)); LU=D-A; M=D\LU;p=max(abs(eig(M))) f=D\b; x=[]; z=[];x(:,1)=eye(3,1); N=200000000; for i=1:N;if norm(A*x(:,i)-b)<1e-010;m=i;breakelsex(:,i+1)=M*x(:,i)+f;z=x(:,i+1)endendme=norm(A*z-b)plot([1:length(x)],x)title('JACOBI ITERATION OF LINEAR EQUATIONS')A =1 2 -21 1 12 2 1b = 1 1 1p = 5.8106e-006(谱范数)可以看出是收敛的z=1 0 -1z =-1 1 -1z =-33 1m =4(迭代的次数)e =0(误差的估计)图像是:1 1.52 2.53 3.54-3-2-1123JACOBI ITERATION OF LINEAR EQUATIONSA=[9 -1 -1; -1 8 0; -1 0 9;] b=[7;7;8;] D=diag(diag(A)); LU=D-A; M=D\LU;p=max(abs(eig(M))) f=D\b; x=[]; z=[];x(:,1)=eye(3,1);N=200000000;for i=1:N;if norm(A*x(:,i)-b)<1e-010;m=i;breakelsex(:,i+1)=M*x(:,i)+f;z=x(:,i+1)endendme=norm(A*z-b)plot([1:length(x)],x)title('JACOBI ITERATION OF LINEAR EQUATIONS')A = 9 -1 -1-1 8 0-1 0 9b =7 7 8p =0.1620(谱范数)可以看出是收敛,m =16迭代的次数。
实验报告内容:一:不动点迭代法解方程二:牛顿插值法的MA TLAB实现完成日期:2012年6月21日星期四数学实验报告一日期:2012-6-21hold on>> fplot(g,[-2,2])>> fplot(f,[-2,2])>> hold off>> grid输出结果如下所示:所以,确定初值为x0=1二:不断迭代算法:第一步:将f(x0)赋值给x1第二步:确定x1-x0的绝对值大小,若小于给定的误差值,则将x1当做方程的解,否则回到第一步编写计算机程序:clearf=inline('0.5*sin(x)+0.4');x0=1;x1=f(x0);k=1;while abs(x1-x0)>=1.0e-6x0=x1;x1=f(x0);k=k+1;fprintf('k=%.0f,x0=%.9f,x1=%.9f\n',k,x0,x1)end显示结果如下:k=2,x0=0.820735492,x1=0.765823700k=3,x0=0.765823700,x1=0.746565483k=4,x0=0.746565483,x1=0.739560873k=5,x0=0.739560873,x1=0.736981783k=6,x0=0.736981783,x1=0.736027993k=7,x0=0.736027993,x1=0.735674699k=8,x0=0.735674699,x1=0.735543758k=9,x0=0.735543758,x1=0.735495216k=10,x0=0.735495216,x1=0.735477220k=11,x0=0.735477220,x1=0.735470548k=12,x0=0.735470548,x1=0.735468074k=13,x0=0.735468074,x1=0.735467157>>。
Matlab⾮线性⽅程数值解法实验⽬的⽤Matlab实现⾮线性⽅程的⼆分法、不动点迭代法实验要求1. 给出⼆分法算法和不动点迭代算法2. ⽤Matlab实现⼆分法3. ⽤Matlab实现不动点迭代法实验内容(1)在区间[0,1]上⽤⼆分法和不动点迭代法求的根到⼩数点后六位。
(2)⼆分法的基本思想:逐步⼆分区间[a,b],通过判断两端点函数值的符号,进⼀步缩⼩有限区间,将有根区间的长度缩⼩到充分⼩,从⽽,求得满⾜精度要求的根的近似值。
(3)不动点迭代法基本思想:已知⼀个近似根,构造⼀个递推关系(迭代格式),使⽤这个迭代格式反复校正根的近似值,计算出⽅程的⼀个根的近似值序列,使之逐步精确法,直到满⾜精度要求(该序列收敛于⽅程的根)。
实验步骤(1)⼆分法算法与MATLAB程序(⼆分法的依据是根的存在性定理,更深地说是介值定理)。
MATLAB程序,1 %⼆分法2 %输⼊:f(x)=0的f(x),[a,b]的a,b,精度ep3 %输出:近似根root,迭代次数k4 function [root,k]=bisect(fun,a,b,ep)5if nargin>36 elseif nargin<47 ep=1e-5;%默认精度8else9 error('输⼊参数不⾜');%输⼊参数必须包括f(x)和[a,b]10 end11if fun(a)*fun(b)>0%输⼊的区间要求12 root=[fun(a),fun(b)];13 k=0;14return;15 end16 k=1;17while abs(b-a)/2>ep%精度要求18 mid=(a+b)/2;%中点19if fun(a)*fun(mid)<020 b=mid;21 elseif fun(a)*fun(mid)>022 a=mid;23else24 a=mid;b=mid;25 end26 k=k+1;27 end28 root=(a+b)/2;29 end⼆分法1运⾏⽰例(并未对输出格式做控制,由于精度要求,事后有必要控制输出的精度):优化代码,减⼩迭代次数(在迭代前,先搜寻更适合的有根区间)1 %⼆分法改良2 %在⼀开始给定的区间中寻找更⼩的有根区间3 %输⼊:f(x)=0的f(x),[a,b]的a,b,精度ep4 %输出:近似根root,迭代次数k5 %得到的根是优化区间⾥的最⼤根6 function [root,k]=bisect3(fun,a,b,ep)7if nargin>38 elseif nargin<49 ep=1e-5;%默认精度10else11 error('输⼊参数不⾜');%输⼊参数必须包括f(x)和[a,b]12 end13 %定义划分区间的分数14 divQJ=1000;15 %等分区间16 tX=linspace(a,b,divQJ);17 %计算函数值18 tY=fun(tX);19 %找到函数值的正负变化的位置20 locM=find(tY<0);21 locP=find(tY>0);22 %定义新区间23if tY(1)<024 a=tX(locM(end));25 b=tX(locP(1));26else27 a=tX(locP(end));28 b=tX(locM(1));29 end30if fun(a)*fun(b)>0%输⼊的区间要求31 root=[fun(a),fun(b)];32 k=0;33return;34 end35 k=1;36while abs(b-a)/2>ep%精度要求37 mid=(a+b)/2;%中点38if fun(a)*fun(mid)<039 b=mid;40 elseif fun(a)*fun(mid)>041 a=mid;42else43 a=mid;b=mid;44 end45 k=k+1;46 end47 root=(a+b)/2;48 end⼆分法2运⾏⽰例(同样没有控制输出)明显地,迭代次数减⼩许多。
非线性方程组求解1.mulStablePoint用不动点迭代法求非线性方程组的一个根function [r,n]=mulStablePoint(F,x0,eps)%非线性方程组:f%初始解:a%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=1.0e-6;endx0 = transpose(x0);n=1;tol=1;while tol>epsr= subs(F,findsym(F),x0); %迭代公式tol=norm(r-x0); %注意矩阵的误差求法,norm为矩阵的欧几里德范数n=n+1;x0=r;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endend2.mulNewton用牛顿法法求非线性方程组的一个根function [r,n]=mulNewton(F,x0,eps)if nargin==2eps=1.0e-4;endx0 = transpose(x0);Fx = subs(F,findsym(F),x0);var = findsym(F);dF = Jacobian(F,var);dFx = subs(dF,findsym(dF),x0);r=x0-inv(dFx)*Fx;n=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);dFx = subs(dF,findsym(dF),x0);r=x0-inv(dFx)*Fx; %核心迭代公式tol=norm(r-x0);n=n+1;if(n>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend3.mulDiscNewton用离散牛顿法法求非线性方程组的一个根function [r,m]=mulDiscNewton(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=transpose(x0)-inv(J)*fx;m=1;tol=1;while tol>epsxs=r;fx = subs(F,findsym(F),xs);J = zeros(n,n);for i=1:nx1 = xs;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=xs-inv(J)*fx; %核心迭代公式tol=norm(r-xs);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;4.mulMix用牛顿-雅可比迭代法求非线性方程组的一个根function [r,m]=mulMix(F,x0,h,l,eps)if nargin==4eps=1.0e-4;endn = length(x0);J = zeros(n,n);Fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));C =D - J;inD = inv(D);H = inD*C;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = Hm*inD*Fx;r = transpose(x0)-dr; m=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));C =D - J;inD = inv(D);H = inD*C;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = Hm*inD*Fx;r = x0-dr; %核心迭代公式tol=norm(r-x0);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend5.mulNewtonSOR用牛顿-SOR迭代法求非线性方程组的一个根function [r,m]=mulNewtonSOR(F,x0,w,h,l,eps)if nargin==5eps=1.0e-4;endn = length(x0);J = zeros(n,n);Fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));L = -tril(J-D);U = -triu(J-D);inD = inv(D-w*L);H = inD*(D - w*D+w*L);;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = w*Hm*inD*Fx;r = transpose(x0)-dr;m=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));L = -tril(J-D);U = -triu(J-D);inD = inv(D-w*L);H = inD*(D - w*D+w*L);;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = w*Hm*inD*Fx;r = x0-dr; %核心迭代公式tol=norm(r-x0);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend6.mulDNewton用牛顿下山法求非线性方程组的一个根function [r,m]=mulDNewton(F,x0,eps)%非线性方程组:F%初始解:x0%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=1.0e-4;endx0 = transpose(x0);dF = Jacobian(F);m=1;tol=1;while tol>epsttol=1;w=1;Fx = subs(F,findsym(F),x0);dFx = subs(dF,findsym(dF),x0);F1=norm(Fx);while ttol>=0 %下面的循环是选取下山因子w的过程r=x0-w*inv(dFx)*Fx; %核心的迭代公式Fr = subs(F,findsym(F),r);ttol=norm(Fr)-F1;w=w/2;endtol=norm(r-x0);m=m+1;x0=r;if(m>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endend7.mulGXF1用两点割线法的第一种形式求非线性方程组的一个根function [r,m]=mulGXF1(F,x0,x1,eps)format long;if nargin==3eps=1.0e-4;endx0 = transpose(x0);x1 = transpose(x1);n = length(x0);fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);for i=1:nxt = x1;xt(i) = x0(i);J(:,i) = (subs(F,findsym(F),xt)-fx1)/h(i);endr=x1-inv(J)*fx1;m=1;tol=1;while tol>epsx0 = x1;x1 = r;fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);for i=1:nxt = x1;xt(i) = x0(i);J(:,i) = (subs(F,findsym(F),xt)-fx1)/h(i);endr=x1-inv(J)*fx1;tol=norm(r-x1);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;8.mulGXF2用两点割线法的第二种形式求非线性方程组的一个根function [r,m]=mulGXF2(F,x0,x1,eps)format long;if nargin==3eps=1.0e-4;endx0 = transpose(x0);x1 = transpose(x1);n = length(x0);fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);xt = x1;xt(1) = x0(1);J(:,1) = (subs(F,findsym(F),xt)-subs(F,findsym(F),x1))/h(1);for i=2:nxt = x1;xt(1:i) = x0(1:i);xt_m = x1;xt_m(1:i-1) = x0(1:i-1);J(:,i) = (subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(i);endr=x1-inv(J)*fx1;m=1;tol=1;while tol>epsx0 = x1;x1 = r;fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);xt = x1;xt(1) = x0(1);J(:,1) = (subs(F,findsym(F),xt)-subs(F,findsym(F),x1))/h(1);for i=2:nxt = x1;xt(1:i) = x0(1:i);xt_m = x1;xt_m(1:i-1) = x0(1:i-1);J(:,i) = (subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(i);endr=x1-inv(J)*fx1;tol=norm(r-x1);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;9.mulVNewton用拟牛顿法求非线性方程组的一组解function [r,m]=mulVNewton(F,x0,A,eps)%方程组:F%方程组的初始解:x0% 初始A矩阵:A%解的精度:eps%求得的一组解:r%迭代步数:mif nargin==2A=eye(length(x0)); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendx0 = transpose(x0);Fx = subs(F, findsym(F),x0);r=x0-A\Fx;m=1;tol=1;while tol>epsx0=r;Fx = subs(F, findsym(F),x0);r=x0-A\Fx;y=r-x0;Fr = subs(F, findsym(F),r);z= Fr-Fx;A1=A+(z-A*y)*transpose(y)/norm(y); %调整A A=A1;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end10.mulRank1用对称秩1算法求非线性方程组的一个根function [r,n]=mulRank1(F,x0,A,eps)if nargin==2l = length(x0);A=eye(l); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-inv(A)*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-inv(A)*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;A1=A+ fr *transpose(fr)/(transpose(fr)*y); %调整A A=A1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end11.mulDFP用D-F-P算法求非线性方程组的一组解function [r,n]=mulDFP(F,x0,A,eps)if nargin==2l = length(x0);B=eye(l); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-B*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-B*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整AB=B1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end12.mulBFS用B-F-S算法求非线性方程组的一个根function [r,n]=mulBFS(F,x0,B,eps)if nargin==2l = length(x0);B=eye(l); %B取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-B*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-B*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;u = 1 + z'*B*z/(y'*z);B1= B+ (u*y*y'-B*z*y'-y*z'*B)/(y'*z); %调整B B=B1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end13.mulNumYT用数值延拓法求非线性方程组的一组解function [r,m]=mulNumYT(F,x0,h,N,eps)format long;if nargin==4eps=1.0e-8;endn = length(x0);fx0 = subs(F,findsym(F),x0);x0 = transpose(x0);J = zeros(n,n);for k=0:N-1fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endinJ = inv(J);r=x0-inJ*(fx-(1-k/N)*fx0);x0 = r;endm=1;tol=1;while tol>epsxs=r;fx = subs(F,findsym(F),xs);J = zeros(n,n);for i=1:nx1 = xs;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=xs-inv(J)*fx; %核心迭代公式tol=norm(r-xs);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;14.DiffParam1用参数微分法中的欧拉法求非线性方程组的一组解function r=DiffParam1(F,x0,h,N)%非线性方程组:f%初始解:x0%数值微分增量步大小:h%雅可比迭代参量:l%解的精度:eps%求得的一组解:r%迭代步数:nx0 = transpose(x0);n = length(x0);ht = 1/N;Fx0 = subs(F,findsym(F),x0);for k=1:NFx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endinJ = inv(J);r = x0 - ht*inJ*Fx0;x0 = r;end15.DiffParam2用参数微分法中的中点积分法求非线性方程组的一组解function r=DiffParam2(F,x0,h,N)%非线性方程组:f%初始解:x0%数值微分增量步大小:h%雅可比迭代参量:l%解的精度:eps%求得的一组解:r%迭代步数:nx0 = transpose(x0);n = length(x0);ht = 1/N;Fx0 = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nxt = x0;xt(i) = xt(i)+h(i);J(:,i) = (subs(F,findsym(F),xt)-Fx0)/h(i);endinJ = inv(J);x1 = x0 - ht*inJ*Fx0;for k=1:Nx2 = x1 + (x1-x0)/2;Fx2 = subs(F,findsym(F),x2);J = zeros(n,n);for i=1:nxt = x2;xt(i) = xt(i)+h(i);J(:,i) = (subs(F,findsym(F),xt)-Fx2)/h(i);endinJ = inv(J);r = x1 - ht*inJ*Fx0;x0 = x1;x1 = r;end16.mulFastDown用最速下降法求非线性方程组的一组解function [r,m]=mulFastDown(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endlamda = fx/sum(diag(transpose(J)*J));r=x0-J*lamda; %核心迭代公式fr = subs(F,findsym(F),r);tol=dot(fr,fr);x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;17.mulGSND用高斯牛顿法求非线性方程组的一组解function [r,m]=mulGSND(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endDF = inv(transpose(J)*J)*transpose(J);r=x0-DF*fx; %核心迭代公式tol=norm(r-x0);x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;18.mulConj用共轭梯度法求非线性方程组的一组解function [r,m]=mulConj(F,x0,h,eps)format long;if nargin==3eps=1.0e-6;endn = length(x0);x0 = transpose(x0);fx0 = subs(F,findsym(F),x0);p0 = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)*(1+h);p0(:,i) = -(subs(F,findsym(F),x1)-fx0)/h;endm=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endlamda = fx/sum(diag(transpose(J)*J));r=x0+p0*lamda; %核心迭代公式fr = subs(F,findsym(F),r);Jnext = zeros(n,n);for i=1:nx1 = r;x1(i) = x1(i)+h;Jnext(:,i) = (subs(F,findsym(F),x1)-fr)/h;endabs1 = transpose(Jnext)*Jnext;abs2 = transpose(J)*J;v = abs1/abs2;if (abs(det(v)) < 1)p1 = -Jnext+p0*v;elsep1 = -Jnext;endtol=norm(r-x0);p0 = p1;x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;19.mulDamp用阻尼最小二乘法求非线性方程组的一组解function [r,m]=mulDamp(F,x0,h,u,v,eps)format long;if nargin==5eps=1.0e-6;endFI = transpose(F)*F/2;n = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsj = 0;fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;afx = subs(F,findsym(F),x1);J(:,i) = (afx-fx)/h;endFIx = subs(FI,findsym(FI),x0);for i=1:nx2 = x0;x2(i) = x2(i)+h;gradFI(i,1) = (subs(FI,findsym(FI),x2)-FIx)/h;ends=0;while s==0A = transpose(J)*J+u*eye(n,n);p = -A\gradFI;r = x0 + p;FIr = subs(FI,findsym(FI),r);if FIr<FIxif j == 0u = u/v;j = 1;elses=1;endelseu = u*v;j = 1;if norm(r-x0)<epss=1;endendendx0 = r;tol = norm(p);m=m+1;if(m>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endendformat short;。
迭代运算matlab程序-回复迭代运算matlab程序是一种重要的计算方法,它可以通过在一个循环中重复执行相同的计算步骤,逐步逼近所需的结果。
本文将详细介绍迭代运算matlab程序的原理、使用方法以及一些常见的应用示例。
首先,我们需要了解迭代运算的原理。
迭代,顾名思义就是重复执行某一操作。
在数值计算中,迭代运算通常用于解决无法通过解析方法得到精确解的问题。
它通过不断逼近解的过程,最终得到一个近似解。
迭代运算matlab程序的基本步骤如下:1. 确定迭代的初值:根据问题的要求,选择一个合适的初值作为迭代的起点。
2. 设定迭代终止条件:根据问题的求解精度要求,确定终止迭代的条件。
通常情况下,我们会设定一个误差阈值,当迭代过程中的误差小于该阈值时,停止迭代。
3. 迭代计算:每次迭代过程中,根据给定的公式或算法,通过matlab程序对初值进行计算,得到一个新的近似解。
4. 判断终止条件:判断当前的近似解是否满足终止条件,如果满足,则停止迭代;否则,返回到第3步,继续迭代计算。
下面,我们以求解方程x^2-2=0为例,来演示如何使用迭代运算matlab 程序。
首先,我们需要将方程转化为迭代形式:x = (x + 2/x)/2。
在matlab代码中,我们可以写成:x0 = 1; 初始值err = 1e-6; 误差阈值x = x0;while abs(x^2-2) > errx = (x + 2/x)/2;end代码的含义如下:- `x0` 表示迭代的初始值,我们选择1作为初始值。
- `err` 表示误差阈值,当迭代过程中的误差小于该阈值时,停止迭代。
- `x` 表示当前的近似解,首先将其赋值为初始值x0。
- `while` 循环用于判断是否满足终止条件,即判断迭代过程中的误差是否小于误差阈值。
- 在循环内部,根据迭代公式`(x + 2/x)/2`更新近似解x。
使用上述代码,我们可以通过迭代运算matlab程序求解方程x^2-2=0的近似解。
MATLAB(矩阵实验室)是一种用于数学计算、绘图等的高度工程化的软件评台。
利用MATLAB进行牛顿迭代法求解方程组的根是一种常见的数值分析方法。
本文将介绍如何使用MATLAB进行牛顿迭代法求解方程组的根,并给出具体的代码实现。
1. 理论基础牛顿迭代法是一种求解方程根的常用数值方法。
对于一般的方程组F(X)=0,牛顿迭代法的迭代公式如下:X(k+1)=X(k)−(∂F/∂X)^(-1)·F(X(k))其中,X(k)表示第k次迭代的解,∂F/∂X表示F对X的雅可比矩阵,^(-1)代表矩阵的逆运算。
2. MATLAB代码实现以下是使用MATLAB进行牛顿迭代法求解方程组的一般代码实现:```matlabfunction [x, numIter] = newtonMethod(F, J, x0, tol, maxIter)F为方程组F(X)=0的函数句柄J为方程组F(X)的雅可比矩阵的函数句柄x0为初始解向量tol为迭代精度maxIter为最大迭代次数x = x0;numIter = 0;while norm(F(x)) > tol numIter < maxIterx = x - J(x) \ F(x); 使用MATLAB的\表示矩阵的逆运算numIter = numIter + 1;endend```3. 示例下面以一个二元非线性方程组为例,演示如何使用上述MATLAB代码进行牛顿迭代法求解方程组的根。
考虑方程组:F1(x1, x2) = x1^2 + x2^2 - 25 = 0F2(x1, x2) = x1*x2 - 9 = 0对应的雅可比矩阵为:J(x)=[2x1, 2x2; x2, x1]下面是具体的MATLAB代码实现:```matlab定义方程组F和雅可比矩阵JF = (x) [x(1)^2 + x(2)^2 - 25; x(1)*x(2) - 9];J = (x) [2*x(1), 2*x(2); x(2), x(1)];设置初始解向量、迭代精度和最大迭代次数x0 = [1; 1];tol = 1e-6;maxIter = 100;调用newtonMethod函数进行求解[x, numIter] = newtonMethod(F, J, x0, tol, maxIter);显示结果disp(['解向量为:', num2str(x')]);disp(['迭代次数为:', num2str(numIter)]);```4. 结论本文介绍了使用MATLAB进行牛顿迭代法求解方程组的方法,并给出了具体的代码实现和示例。
不动点迭代法matlab程序
不动点迭代法是一种用于解决函数f(x)=0的方法,在数学上它可以被形象地描述如下:假设已有一个近似解x0,则我们只需将x0代入f(x)=0,然后再求出f(x0)的值,再计算更新的x的值,即
x1=x0-f(x)/f(x0),然后将x1代入f(x)=0,重复上面的步骤,直到结果达到足够的精确度为止。
在matlab中,不动点迭代法实现起来相对简单,只需设置一些基本参数,就可以实现快速准确的求解,具体步骤如下:
1、求解待解函数及其一阶导数;
2、设置精度阈值和最大迭代次数;
3、令x0为初始猜测,计算上述函数及其一阶导数;
4、更新x,即x1=x0-f(x)/f(x0);
5、重复步骤3和4,直到精度达到要求或最大迭代次数到达;
可以看出,不动点迭代法是数值计算中使用非常普遍的方法。
它不仅具有计算速度快,而且收敛性强,可以很快找到函数f(x)=0的解。
此外,熟悉和掌握不动点迭代法对于熟练掌握matlab程序编写也是很有帮助的。
其原理的掌握能够极大地提高求解精度,而熟练的掌握能够使编写的代码更加简洁,运行效率更高。
总之,不动点迭代法是一种非常有用的方法,它的使用和掌握也是matlab程序设计的一项重要技能。
但是,需要指出的是,在掌握不动点迭代法时,有必要做到理论结合实践,从而更好地学习和使用
该方法。
matlab不动点迭代法Matlab是一种广泛应用于数学和科学工程领域的高级编程语言和交互式环境。
其中一个常用的数值方法是迭代法,这种方法可以求解方程的根、求解最优化问题,以及求解微分和积分方程等一系列问题。
本文将以Matlab的不动点迭代法为例,分步骤阐述其基本原理和实现方法。
第一步:简介不动点迭代法不动点迭代法是一种求函数零点的数值方法,其基本思想是将原方程变形成一个不动点方程,即将原方程中的未知量转化为自变量,使得在新的方程中,原未知量的解恰好等于函数的不动点。
若能找到一个连续可导的函数g(x),使得原方程x=f(x)在某个区间[a,b]内有唯一不动点,那么我们就可以通过不动点迭代法求得其精确或近似解。
具体的,迭代过程可以表示为:x_{n+1}=g(x_n), n=0,1,2,...其中x_0是迭代的初值,x_n是第n次迭代得到的近似解,g(x)是所定义的迭代函数。
当x_n趋近于x时,迭代恒定收敛,即有:\lim_{n \rightarrow \infty} x_n = x第二步:Matlab的实现方法在Matlab中,我们可以通过定义一个函数文件包含上述的迭代公式并编写一个主程序来实现不动点迭代法。
以下是具体的实现步骤:(1)定义一个包含迭代函数g(x)的函数文件,命名为g.m,这个文件应该放在Matlab的当前工作路径下。
以下是一个示例的g.m的代码:function y = g(x)y = (1/3) * (x^3+3);end(2)编写主程序,命名为main.m,用来调用g.m并计算迭代的近似解。
以下是示例的main.m的代码:% 定义初值x0 = -5;% 设置最大迭代次数和误差容限tol = 1e-5;kmax = 100;% 迭代循环x = x0;for k = 1:kmaxxnew = g(x);if abs(xnew-x) < tolfprintf('Solution converged after %d iterations\n', k);break;endx = xnew;end% 打印输出近似解fprintf('The converged solution is x=%f\n', x);在实际使用中,我们可以将上述代码保存为一个名为main.m的文件并在Matlab中运行,即可得到近似解。
数值分析中求解非线性方程的MATLAB求解程序(6种)1.求解不动点function [k,p,err,P]=fixpt(g,p0,tol,max1)%求解方程x=g(x) 的近似值,初始值为p0%迭代式为Pn+1=g(Pn)%迭代条件为:在迭代范围内满足|k|<1(根及附近且包含初值)k为斜率P(1)=p0;for k=2:max1P(k)=feval(g,P(k-1));err=abs(P(k)-P(k-1));relerr=err/(abs(P(k))+eps);p=P(k);if (err<tol)|(relerr<tol)break;endendif k==max1disp('超过了最长的迭代次数')endP=P';2.二分法function [c,err,yc]=bisect(f,a,b,delta)%二分法求解非线性方程ya=feval(f,a);yb=feval(f,b);if ya*yb>0break;endmax1=1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif b-a<deltabreak;endendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);3.试值法function [c,err,yc]=regula(f,a,b,delta,epsilon,max1) %试值法求解非线性方程%f(a)和飞(b)异号ya=feval(f,a);yb=feval(f,b);if ya*yb>0disp('Note:f(a)*f(b)>0');endfor k=1:max1dx=yb*(b-a)/(yb-ya);c=b-dx;ac=c-a;yc=feval(f,c);if yc==0break;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;enddx=min(abs(dx),ac);if abs(dx)<delta|abs(yc)<epsilonbreak;endendc;err=abs(b-a)/2;yc=feval(f,c);4.求解非线性方程根的近似位置function R=approot(X,epsilon)%求解根近似位置%为了粗估算方程f(x)=0在区间[a,b]的根的位置,%使用等间隔采样点(xk,f(xk))和如下的评定准则:%f(xk-1)与f(xk)符号相反,%或者|f(xk)|足够小且曲线y=f(x)的斜率在%(xk,f(xk))附近改变符号。
matlab用迭代法求方程Matlab是一种常用的科学计算软件,可用于解决各种数学问题。
其中,迭代法可以用来求解方程,是一种简单但非常有效的算法。
本文将介绍如何在Matlab中使用迭代法求解方程的步骤。
步骤一:构造迭代式迭代法的核心在于构造一个迭代式,通过不断迭代的方式逼近方程的解。
在求解方程f(x)=0时,一般可以构造形如x(n+1)=g(x(n))的递推公式来进行迭代。
其中,g(x)是一个函数,可以通过试错与调整来确定。
步骤二:设定初值x(0)在开始迭代之前,需要确定初值x(0),即从哪个点开始进行迭代。
初值不同可能会得到不同的解,在实际应用中需要特别注意。
步骤三:设定迭代停止条件为了避免无限迭代,需要设定迭代停止的条件。
常用的条件有两种:一种是设定迭代次数,即达到一定迭代次数后停止迭代;另一种是设置收敛条件,即在一定误差范围内停止迭代。
步骤四:编写Matlab代码完成以上准备工作后,可以开始编写Matlab代码。
具体实现可以采用for循环或while循环的方式进行迭代,根据设定的迭代停止条件来决定何时停止迭代。
以求解方程f(x)=x^3-x-1为例,其迭代式可以构造为:x(n+1)=x(n)-(x(n)^3-x(n)-1)/(3*x(n)^2-1)初值设为x(0)=1,迭代停止条件设为当两次迭代之差小于0.0001时停止。
则对应的Matlab代码可写为:x(1)=1;tol=0.0001;for n=1:100x(n+1)=x(n)-(x(n)^3-x(n)-1)/(3*x(n)^2-1);if abs(x(n+1)-x(n))<tolbreak;endend步骤五:运行程序并解读结果编写完Matlab代码后,可以运行程序并查看结果。
对于上述例子,最终的解为x=1.3247,满足收敛条件。
在使用迭代法求解方程时,需要注意函数的收敛性、初值选择、迭代次数等问题。
此外,迭代法也存在无法收敛或收敛速度慢的情况,需要特别注意。
《MATLAB 程序设计实践》课程考核1、编程实现以下科学计算算法,并举一例应用之.(参考书籍《精通MALAB科学计算》,王正林等著,电子工业出版社,2009年)“不动点迭代法和牛顿法非线性方程组求解”(1).不动点迭代法非线性方程组求解(a).算法说明:设含有n个未知数与n个方程的非线性方程组记为:F(x)=0,然后把上述方程组改为便于迭代的等价形式:x=φ(x),由此就可以构造不动点迭代法的迭代公式:}满足,则就是φ的不动点,这样就可以求出非线性方程组的解.如果得到的序列{xk在MATLAB中编程实现的非线性方程组的不动点迭代法的函数为:mulStablePoint。
功能:用不动点迭代法求非线性方程组的一个解。
调用格式:[r,n]=mulStablePoint(x0,eps).其中,x0为初始迭代向量;eps为迭代精度;r为求出的解向量;n为迭代步数。
(b)。
流程图:(c).源程序代码:function [r,n]=mulStablePoint(x0,eps) %不动点迭代法求非线性方程组的一个解%初始迭代向量:x0%迭代精度:eps%解向量:r%迭代步数:nif nargin==1eps=1。
0e-4;endr=myf(x0);n=1;tol=1;while tol>epsx0=r;r=myf(x0);%迭代公式tol=norm(r-x0);%注意矩阵的误差求法,norm为矩阵的欧几里德范数n=n+1;if(n〉100000) %迭代步数控制disp(’迭代步数太多,可能不收敛!’);return;endend举例说明:解:首先建立myf.m函数文件,输入以下内容:function f=myf(x)f(1)=0.5*sin(x(1))+0。
1*cos(x(2)*x(1))-x(1);f(2)=0.5*cos(x(1))-0.1*sin(x(2))—x(2);在MATLAB命令窗口中输入:(2)。
(以下代码可直接带入matlab运行,首先以.m文件保存第一段代码,然后在command window输入第二段代码即可)
%08/06/18
%不动点迭代(Picard迭代)
function [x,time]=Picard(f,x0,tol)
%结果给出迭代次数
%x0为迭代初值
%tol为误差容限
if(nargin==2)
tol=1.0e-5;
end
%缺省情况下误差容限为十的负五次方
wucha=0.5; %设置误差初值
x1=x0; %x1与x0为前后两次计算结果
time=0; %用于记录迭代次数
while(wucha>tol)
x1=subs(f,x0)+x0;
%迭代计算
wucha=abs(x1-x0);
x0=x1; % 更新x0的值在循环中这一句非常重要
time=time+1;
%记下迭代次数
end
x=x1;
%不动点迭代的测试主函数
%其中测试函数为4阶的勒让德多项式,计算其在0.3附近的根
[x,time]=Picard('1/8*(35*x^4-30*x^2+3)',0.3)
%通过直接计算函数值,画出其函数图形
x=0:0.01:1;
f=1/8*(35*x.^4-30*x.^2+3);
plot(x,f)
grid
title('四阶勒让德多项式')。
文章标题:使用MATLAB迭代法解方程的程序目录1. 什么是迭代法解方程2. MATLAB中迭代法的实现3. 迭代法解方程的优缺点4. 实例分析:使用MATLAB实现迭代法解方程5. 结语1. 什么是迭代法解方程迭代法是一种数值计算方法,用于逼近方程的根或解。
在实际应用中,经常会遇到无法通过代数方法得到准确解的方程,这时候就需要借助数值计算的方法来求得近似解。
迭代法通过不断逼近解的过程,逐步缩小误差,最终得到一个接近精确解的近似值。
2. MATLAB中迭代法的实现MATLAB作为一种强大的数值计算工具,提供了丰富的数值计算函数和工具箱,其中包括了多种迭代法的实现。
在MATLAB中,常用的迭代法有牛顿法、雅各比迭代法、高斯-赛德尔迭代法等。
这些迭代法都可以通过调用MATLAB内置函数或自行编写程序实现。
在编写迭代法程序时,需要注意选择合适的迭代停止条件、初始化的迭代值、迭代步数等参数。
3. 迭代法解方程的优缺点迭代法解方程具有以下优点:1) 适用范围广:迭代法可以解决各种类型的方程,包括线性方程组、非线性方程、微分方程等;2) 可以得到近似解:即使方程无法通过代数方法求解,迭代法也可以得到一个接近精确解的近似值;3) 数值稳定性:在一定条件下,迭代法能够保证解的稳定性和收敛性。
但迭代法也存在一些缺点:1) 收敛速度慢:一些迭代法可能需要较多的迭代次数才能得到满意的解;2) 初始值敏感:迭代法对初始值的选取比较敏感,选取不当可能导致迭代发散或者收敛到错误的解;3) 复杂度高:一些迭代法的实现比较复杂,需要具备较高的数值计算和编程能力。
4. 实例分析:使用MATLAB实现迭代法解方程接下来,我们将以求解非线性方程x^2-3x+2=0为例,使用MATLAB实现迭代法来求得方程的根。
我们选择使用简单而经典的二分法来进行迭代计算。
```MATLABfunction result = iteration_method()f = @(x) x^2 - 3*x + 2;a = 0;b = 2;tol = 1e-6;if f(a)*f(b) > 0error('The function has the same sign at the endpoints.'); endwhile (b - a) > tolc = (a + b) / 2;if f(c) == 0break;elseif f(a)*f(c) < 0b = c;elsea = c;endresult = c;endend```上述代码中,我们通过定义函数f(x)为方程的表达式,并选择区间[a, b]为[0, 2]作为初始迭代区间。
《MATLAB程序设计实践》课程考核1、编程实现以下科学计算法,并举一例应用之。
(参考书籍《精通MATLAB科学计算》,王正林等著,电子工业出版社,2009年)“不动点迭代非线性方程求解”解:算法说明:在Matlab中编程实现不动点迭代法的函数为StablePoint 功能:用不动点迭代法求函数的一个零点。
调用格式:[root,n]=StablePoint(f,x0,eps)。
其中,f为函数名;x0为初始迭代向量;eps为根的精度;root为求出的函数零点;n为迭代步数。
流程图:输入参数f,x0,eps迭代算根否比较精度是否符合要求是输出根值和迭代步数不动点迭代法的MA TLAB程序代码:function [root,n]=StablePoint(f,x0,eps)%用不动点迭代法求函数f的一个零点%初始迭代量:x0%根的精度:eps%求出的函数零点:root%迭代步数:nif(nargin==2)eps=1.0e-4;endtol=1;root=x0;n=0;while(tol>eps)n=n+1;r1=root;root=subs(sym(f),findsym(sym(f)),r1)+r1; %迭代的核心公式tol=abs(root-r1);end实例:采用不动点迭代法求方程120x+-=的一个根。
x流程图:开始确定函数和参数代入公式输出结果解:在MATLAB命令窗口中输入程序代码:>>[r,n]=StablePoint('1/sqrt(x)+x-2',0.5)结果输出:r =0.3820n =4从计算结果可以看出,经过四步迭代,得出方程的一个根为0.38202.编程解决以下科学计算问题7.某工厂2005年度各季度产值(单位:万元)分别为450.6, 395.9,410.2,450.9,试绘制折线图和饼图,并说明图像的实际意义。
解:流程图:用subplot首先对对作图区域分区根据图线类型选择函数:折线图用plot饼状图用pie输入数据;图像用title标注输出图像源程序代码:%折线图subplot(1,2,1)plot([450.6,395.9,410.2,450.9])title('2005年度各季度产值-折线图');%饼状图subplot(1,2,2)pie([450.6,395.9,410.2,450.9],1:4,{'第一季度','第二季度','第三季度','第四季度'}) title('2005年度各季度产值-饼图')从折线图可以看出该工厂效益变化趋势,效益在第二季度最低随后逐渐提高,并在第四季度恢复到第一季度的水平;从饼状图可以看出各个季度该工厂效益的比例关系。
迭代运算matlab程序-回复Matlab程序的迭代运算迭代运算是一种重要的数值计算方法,特别在数值分析和科学计算中得到广泛的应用。
Matlab是一种功能强大的数值计算软件,提供了强大的迭代运算功能。
本文将详细介绍如何使用Matlab进行迭代运算,包括迭代算法的选择、迭代方程的建立以及求解结果的评估。
迭代运算在数值计算中的重要性不言而喻。
它适用于那些无法用解析方法求解的问题,例如非线性方程、积分和微分方程等。
而在解决这些问题时,Matlab作为一种最广泛使用的数值计算软件,提供了丰富和高效的迭代运算工具。
首先,我们需要选择适当的迭代算法。
常见的迭代算法包括牛顿法、割线法、弦截法等。
这些算法都有各自的优缺点,根据问题的特点选择合适的算法是迭代运算的第一步。
Matlab提供了丰富的迭代算法函数,可以根据具体的问题选择合适的函数进行计算。
接下来,我们需要建立迭代方程。
迭代方程是迭代运算的核心,它将原始问题转化为一个逐步逼近的过程。
建立迭代方程需要具体问题的数学模型知识。
以解非线性方程为例,我们可以将原问题表示为f(x)=0的形式,其中f(x)是一个非线性函数。
然后,选择一个适当的初始值x0,根据迭代方法得到x1,再根据x1计算x2,以此类推,直到收敛于解。
在Matlab中,我们可以通过编写函数来表示迭代方程,然后使用Matlab的迭代算法函数进行运算。
在进行迭代运算时,我们需要考虑收敛性和精度问题。
迭代算法得到的解有可能不是唯一的,因此需要进行适当的收敛性判断。
常见的方法有判断迭代结果的相对误差是否小于某个阈值,或者判断迭代结果是否满足特定的条件。
Matlab提供了方便的函数来进行收敛性判断。
另外,迭代计算的精度也是一个重要的问题。
迭代计算过程中,近似解会逐步逼近真实解,但可能会受到计算机浮点数精度的限制。
所以在编写迭代程序时,需要注意使用适当的数值计算方法,避免精度丢失和数值不稳定问题。
最后,我们需要对迭代结果进行评估。
迭代运算matlab程序[迭代运算matlab程序],以中括号内的内容为主题,写一篇1500-2000字文章,一步一步回答迭代运算(matlab程序)是一种重要的数值计算方法,它可以通过不断重复执行一系列操作来逼近最终解。
Matlab是一款强大的数学软件,提供了丰富的函数和工具箱,方便用户进行迭代运算。
本文将以迭代运算(matlab 程序)为主题,一步一步回答相关问题,介绍迭代运算的基本原理、实现方法以及常见应用。
首先,我们来了解迭代运算的基本原理。
迭代运算是解决数学问题的一种常用方法,它通过不断迭代计算,将一个问题逐步逼近最优解。
这种方法的基本思想是从一个初始点开始,通过不断调整,使得迭代序列趋于问题的解。
在每次迭代中,根据某种规则或算法,通过计算得到下一个迭代点,然后再次进行计算,直到满足停止准则为止。
接下来,我们将介绍如何使用Matlab实现迭代运算。
Matlab提供了丰富的数值计算函数和工具箱,这使得编写迭代运算程序变得非常简单。
我们可以使用循环结构来实现迭代,最常见的是for循环和while循环。
以for循环为例,我们可以使用一系列语句重复执行特定的操作。
在Matlab中,for循环的基本语法格式如下:matlabfor 变量= 起始值:步长:终止值循环体end在这个循环中,变量将从起始值开始,以给定的步长递增或递减,直到达到终止值为止。
在每个迭代步骤中,我们可以在循环体内进行计算和操作。
以下是一个简单的例子,演示如何使用for循环进行迭代计算一个数的平方根:matlabx = 10; 初始值for k = 1:5x = (x + 10/x)/2; 迭代公式end在这个例子中,我们以10作为初始值,通过迭代运算计算数的平方根。
当迭代5次后,我们得到了一个逼近的结果。
除了for循环,我们还可以使用while循环来实现迭代运算。
和for循环不同,while循环会在满足指定条件时重复执行。
它的基本语法格式如下:matlabwhile 条件循环体end在这个循环中,条件被定义为一个逻辑表达式。
实验四
姓名:木拉丁。
尼则木丁班级:信计08-2
学号:20080803405 实验地点:新大机房
实验目的:通过本实验学习利用MATLAB不动点迭代法,抛物线法,斯特芬森迭代法解非线性方程组,及其编程实现,培养编程与上机调试能力。
实验要求:①上机前充分准备,复习有关内容,写出计算步骤,查对程序;
②完成实验后写出完整的实验报告,内容应该包括:所用的算法语言,
算法步骤陈述,变量说明,程序清单,输出计算结果,结果分析等等;
③用编好的程序在Matlab环境中执行。
迭代法
MATLAB程序:
function pwxff(f,x0,x1,x2,d,n)
f=inline(f);
x(1)=x0;
x(2)=x1;
x(3)=x2;
w1=(f(x(2))-f(x(3)))/(x(2)-x(3));
t1=(f(x(1))-f(x(3)))/(x(1)-x(3));
t2=(f(x(1))-f(x(2)))/(x(1)-x(2));
w2=1/(x(1)-x(2))*(t1-t2);
w=w1+w2*(x(3)-x(2));
for k=3:n
x(k+1)=x(k)-2*f(x(k))/(w+sqrt(w^2-4*f(x(k))*w2));
if abs(x(k+1)-x(k))<d
break
end
disp(sprintf('%d %f',k,x(k+1)))
end
x=x(k+1)
计算例题: 求f(x)=x3-x-1在[1,1.5]的零点. 取x0=1.5,
取x0=1.5,迭代公式为x n+1=(1+x n)1/3,计算结果如下表:
数值结果:ddfa('(x+1)^(1/3)',1.5,0.0001,100)
k x
1 1.500000
2 1.357209
3 1.330861
4 1.325884
5 1.324939
抛物线法
MATLAB程序:
function pwxf(f,x0,x1,x2,e,m)
f=inline(f);
x(1)=x0;
x(2)=x1;
x(3)=x2;
w1=(f(x(2))-f(x(3)))/(x(2)-x(3));
t1=(f(x(1))-f(x(3)))/(x(1)-x(3));
t2=(f(x(1))-f(x(2)))/(x(1)-x(2));
w2=(1/(x(1)-x(2)))*(t1-t2);
w=w1+w2*(x(3)-x(2));
for k=3:m
x(k+1)=x(k)-2*f(x(k))/(w+sqrt(w^2-4*f(x(k))*w2));
if abs(x(k+1)-x(k))<e
break
end
disp(sprintf('%d %f %f',k,x(k+1),f(x(k+1))))
end
x=x(k+1)
计算例题: 用抛物线法求解方程 :
56532.0,6.0,5.00
1)(210====-=x x x xe x f x
数值结果:
pwxf('x*exp(x)-1',0.5,0.6,0.56532,0.001,100)
3 0.567111 -0.000090
x = 0.5671
实验总结:从计算过程中得知迭代法的收敛性跟初始值和迭代公式有关,如果取初始值不妥当,迭代法会发散的。
2012-5-18。