《matlab代码--非线性方程组求解》由会员分享,可在线阅读,更多相关《matlab代码--非线性方程组求解(18页珍藏版)》请在金锄头文库上搜索。
1、 非线性方程组求解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 tolepsr= subs(F,findsym(F),x0); %迭代公式tol=norm(r-x0); %注意矩阵的误差求法,norm 为矩阵的欧几里德范数n=n+1;x0=r;if(n100000) %迭代步数控制disp(迭代步数太
2、多,可能不收敛!);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 tolepsx0=r; Fx = subs(F,findsym(F),x0);dFx =
3、subs(dF,findsym(dF),x0);r=x0-inv(dFx)*Fx; %核心迭代公式tol=norm(r-x0);n=n+1;if(n100000) %迭代步数控制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
4、= 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 tolepsxs=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(m100000) %
5、迭代步数控制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
6、 - 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 tolepsx0=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
7、(D);H = inD*C;Hm = eye(n,n);for i=1:l-1 Hm = Hm + power(H,i);enddr = Hm*inD*Fx; r = x0-dr; %核心迭代公式tol=norm(r-x0);m=m+1;if(m100000) %迭代步数控制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
8、,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
9、 tolepsx0=r; Fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:n x1 = 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;
10、%核心迭代公式tol=norm(r-x0);m=m+1;if(m100000) %迭代步数控制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 tolepsttol=1;w=1;Fx = subs(F,findsym(F
11、),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(m100000) %迭代步数控制disp(迭代步数太多,可能不收敛!);return;endend7.mulGXF1用两点割线法的第一种形式求非线性方程组的一个根function r,m=mulGXF1(F,x0,x1,e
12、ps)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 toleps x0 = x1;x1
13、 = 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(m100000) %迭代步数控制disp(迭代步数太多,可能不收敛!);return;endendformat short;8.mulGXF2用两点割线法的第二种形式求非线性方程组的一个根f
14、unction 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)-sub