|
其实解非线性方程组的算法很多的,随便搜索一偏这样的文章将里面的算法实现一下应该就可以解决LZ的问题的。下面我将我自己写的一篇文章中的算法贴出来共享下。
%以下是一个用迭代法解非线性方程组的算法。
%x0:初始迭代点。n:方程组个数。
%step:迭代次数。sig,gama,rou:算法中的相应参数,具体含义请参看算法。
%delta:误差。(这里指反问题,一般方程组可设为0)
%ydelta:含噪声的右端项。(这里指反问题,一般方程组可直接用精确右端项)
%x:最后迭代点。
function [x f k]=equsolve(n,x0,delta,ydelta,step,sig,gama,rou)
if nargin<5
step=300;
end;
if nargin<6
sig=0.5;
end;
if nargin<7
gama=0.5;
end;
if nargin<8
rou=0.2;
end;
f=nonlinfun(n,x0);
bmat=eye(n);
x=x0;
k=1;
lama=1.0;
normf=norm(f,2);
count=0;
while (normf>delta && k<=step)
epsilon=0.5/k^2;
p=bmat\(ydelta-f)';
s=lama*p';
xt=x+s;
ft=nonlinfun(n,xt);
normft=norm(ft,2);
if ((normft-normf)<(-sig*tmp+epsilon))
y=f;
x=xt;
f=ft;
else
lama=rou*lama;
count=count+1;
continue;
end;
theta=1.0;
bmat=bmat+((ft-y)'-bmat*s')*s/norm(s,2);
if (abs(det(bmat))<1.0e-3)
bmat=bmat+0.5*((ft-y)'-bmat*s')*s/norm(s,2);
end;
k=k+1;
normf=normft;
lama=1.0;
end;
err=normf;
disp('用了')
k
disp('步,精度为')
err
%nonlinfun就是要求解的非线性方程组。 |
评分
-
1
查看全部评分
-
|