非线性方程组求解
1.mulStablePoint用不动点迭代法求非线性方程组的一个根
function [r,n]=mulStablePoint(F,x0,eps) %非线性方程组:f %初始解:a %解的精度:eps %求得的一组解:r %迭代步数:n
if nargin==2 eps=1.0e-6; end
x0 = transpose(x0); n=1; tol=1;
while tol>eps
r= subs(F,findsym(F),x0); %迭代公式
tol=norm(r-x0); %注意矩阵的误差求法,norm为矩阵的欧几里德范数 n=n+1; x0=r;
if(n>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!'); return; end end
2.mulNewton用牛顿法法求非线性方程组的一个根 function [r,n]=mulNewton(F,x0,eps) if nargin==2 eps=1.0e-4; end
x0 = 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>eps x0=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; end end
3.mulDiscNewton用离散牛顿法法求非线性方程组的一个根 function [r,m]=mulDiscNewton(F,x0,h,eps) format long; if nargin==3 eps=1.0e-8; end
n = length(x0);
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); end
r=transpose(x0)-inv(J)*fx; m=1; tol=1;
while tol>eps xs=r;
fx = subs(F,findsym(F),xs); J = zeros(n,n); for i=1:n x1 = xs;
x1(i) = x1(i)+h(i);
J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i); end
r=xs-inv(J)*fx; %核心迭代公式 tol=norm(r-xs); m=m+1;
if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!'); return;
end end
format short;
4.mulMix用牛顿-雅可比迭代法求非线性方程组的一个根 function [r,m]=mulMix(F,x0,h,l,eps) if nargin==4 eps=1.0e-4; end
n = length(x0); J = zeros(n,n);
Fx = subs(F,findsym(F),x0); for i=1:n x1 = x0;
x1(i) = x1(i)+h(i);
J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i); end
D = diag(diag(J)); C = D - J; inD = inv(D); H = inD*C; Hm = eye(n,n); for i=1:l-1
Hm = Hm + power(H,i); end
dr = Hm*inD*Fx;
r = transpose(x0)-dr; m=1; tol=1;
while tol>eps x0=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); end
D = diag(diag(J)); C = D - J; inD = inv(D); H = inD*C; Hm = eye(n,n); for i=1:l-1
Hm = Hm + power(H,i); end
dr = Hm*inD*Fx;
r = x0-dr; %核心迭代公式 tol=norm(r-x0); m=m+1;
if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!'); return; end end
5.mulNewtonSOR用牛顿-SOR迭代法求非线性方程组的一个根 function [r,m]=mulNewtonSOR(F,x0,w,h,l,eps) if nargin==5 eps=1.0e-4; end
n = length(x0); J = zeros(n,n);
Fx = subs(F,findsym(F),x0); for i=1:n x1 = x0;
x1(i) = x1(i)+h(i);
J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i); end
D = 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-1
Hm = Hm + power(H,i); end
dr = w*Hm*inD*Fx;
r = transpose(x0)-dr; m=1; tol=1;
while tol>eps x0=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); end
D = 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-1
Hm = Hm + power(H,i); end
dr = w*Hm*inD*Fx;
r = x0-dr; %核心迭代公式 tol=norm(r-x0); m=m+1;
if(m>100000) % disp('迭代步数太多,可能不收敛!'); return; end end
6.mulDNewton用牛顿下山法求非线性方程组的一个根 function [r,m]=mulDNewton(F,x0,eps) %非线性方程组:F %初始解:x0 %解的精度:eps %求得的一组解:r %迭代步数:n
if nargin==2 eps=1.0e-4; end
x0 = transpose(x0); dF = Jacobian(F); m=1; tol=1;
while tol>eps ttol=1; w=1;
Fx = subs(F,findsym(F),x0); dFx = subs(dF,findsym(dF),x0);
迭代步数控制
matlab求解非线性方程组



