感谢这位大佬,我也是看了他的博客,感觉明白了许多。我的代码也是基于该博主的博客所写的,所以各位小伙伴在看代码之前请最好看一遍该博主的博客。
下面就是MATLAB源代码:
function [X,Y]=GaussNewton
clear;
clc;
tic
%% 高斯牛顿算法,X0为初始点,e为迭代误差值
x0=[0;0]; %初始点
e=0.001; %阈值
syms x1 x2
F(1)=x1-0.7*sin(x1)-0.2*cos(x2); %目标函数值
F(2)=x2-0.7*cos(x1)+0.2*sin(x2);
A=jacobian(F,[x1,x2]); %求目标函数的雅可比矩阵;
H=A.'*A; %求A.'*A,这在后续会使用到
H=-inv(H); %对H求逆并取相反数
%% 进行迭代循环
for k=1:20
f=double(subs(F,[x1 x2],x0'))'; %对目标函数赋k次迭代初值
h=double(subs(H,[x1 x2],x0')); %对H赋k次迭代初值
a=double(subs(A.',[x1 x2],x0')); %对a,'赋k次迭代初值
x=x0+h*a*f; %求解k次迭代的解,即使目标函数最优的解
delet=sqrt(sum((x-x0).^2)); %误差值
if delet
fprintf('迭代次数为:%d\n',k)
break
else
x0=x; %不符合阈值,将K次迭代求解的值赋给K+1次迭代的初值
end
end
X=x; %返回最优解
Y=double(subs(F,[x1 x2],x'))'; %返回最优值
toc
end