使用 Levenberg-Marquardt 方法测试 \(u_{xx}+u^2=-sin(x)+sin(x)^2\), 初值选取 \(u(x)=cos(x)sin(x)\)
参考文献:《非线性方程组数值方法》,袁亚湘;
function T69
% 全局二次收敛的 Levenberg-Marquardt
% yuewen_chen@qq.com
n=300;
r=linspace(-pi*5,pi*5,n)';
h=r(2)-r(1);
rb=[r(1)-h;r;r(end)+h];
f=-sin(r)+sin(r).^2;
x0=sin(rb);
u=cos(r).*sin(r); % initial guess
% ************ D2********************
cn1=-1*ones(n-1,1);
cp1=1*ones(n-1,1);
c=-2*ones(n,1);
D2=sparse((diag(c,0)+diag(cp1,1)+diag(-cn1,-1))/(h^2));
%******************************************
M=D2;
eta=0.9;
for k=1:200
lam=norm(F(u));
L=g(u)'*g(u)+lam*speye(n,n);
R=-g(u)*F(u);
d=L\R;
if norm(F(u+d))<=norm(eta*F(u))
u=u+d;
else
alp=Armijo(u,d);
u=u+alp*d;
end
plot(r,u,'b.',r,sin(r),'r')
title(['res=',num2str(nF(u)), ', k=',num2str(k),' , \alpha=',num2str(norm(d))])
drawnow
end
function y=F(u)
y=M*u+u.^2-f;
y(1)=y(1)+x0(1)/h^2;
y(end)=y(end)+x0(end)/h^2;
end
function y=g(u)
J=M+diag(2*u,0);
y=J;
end
function y=nF(u)
y=norm(F(u));
end
function alp=Armijo(u,d)
et=1/5;
bet1=0.5;
t=0;
while t<=500
if (nF(u+et^t*d)^2<=nF(u)^2+bet1*et^t*F(u)'*g(u)*d)
alp=et^t;
break
else
t=t+1;
end
alp=et^t;
end
end
end
Levenberg-Marquardt for nonlinear elliptical equation
原文:https://www.cnblogs.com/yuewen-chen/p/11524458.html