一、算法解释
给定一组观测值(测量值),以及观测方程,求.
对任意给定的初值,观测方程在处展开有
也就是
忽略高阶小量并记
则可以把关于的非线性最小二乘问题化为关于的线性最小二乘问题
则可以采用线性最小二乘法的方法求得每一次迭代的
二、实例
已知数据集数据如下图所示
已知数据点存于data.txt中,其中第一列是x,第二列是y数据。且已知数据点的表达式为下式
其中有未知参数.
【问题】通过非线性最小二乘法的高斯牛顿算法对未知参数进行估计,误差保证在以内。
【求解】对观测矩阵H求雅可比矩阵
编写Matlab代码实现高斯牛顿算法对参数迭代求解
%非线性最小二乘法,高斯牛顿法进行迭代求解
clc
clear
theta0 = [1;1;1;1];
data=importdata('data.txt');
length = size(data);
%牛顿迭代法求解
e = 1e-3; thetak=theta0; k=0;
Y = data(:,2);
H = [];
J = [];
while 1>0
k = k+1;
for i=1:length(1)
H(i) = funy(thetak,data(i,1));
J(i,:) = funJ(thetak,data(i,1));
end
DY = Y - H';
Dtheta = inv(J'*J) * J'*DY;
thetak1 = thetak+Dtheta;
%判断是否跳出迭代
if Dtheta < e
break
end
thetak = thetak1;
end
disp('迭代的次数k为:')
disp(k)
disp('近似最优解θ为:')
disp(thetak1)
% tk1=[0.0098;1158.8;11.225;63.892];
yls = [];
for i=1:length
yls(i) = thetak1(1)*exp(-1392/data(i,1)) +...
1 / (thetak1(2)*exp(-sqrt(thetak1(3)/(thetak1(4)+data(i,1)))));
end
plot(data(:,1),yls,'*')
hold on
plot(data(:,1),data(:,2))
hold off
xlabel('x');ylabel('y');
function H=funJ(tk,x)
H = [exp(-1392/x) ...
-exp(sqrt(tk(3)/(tk(4)+x)))/(tk(2)^2) ...
exp(sqrt(tk(3)/(tk(4)+x))) / ( 2 * tk(2) * sqrt( tk(3) * (tk(4)+x) ) ) ...
-exp(sqrt(tk(3)/(tk(4)+x))) * (tk(3)/(tk(4)+x))^(3/2) / (2 * tk(2) * tk(3) ) ];%1*4
end
function y=funy(theta,x)
y = theta(1)*exp(-1392/x)+1/(theta(2)*exp(-sqrt(theta(3)/(theta(4)+x))));
end
求解结果
命令行窗口:
迭代的次数k为:
16近似最优解θ为:
1.0e+03 *0.0000
1.1588
0.0112
0.0639
这里参数θ的精确值为
0.009763268177082
1.158759625196295e+03
11.225544366770176
63.894293303247480
拟合结果图像: