Gauss-Newton法matlab求解

目标函数y=Ae^{Bx}

输入变量x=\begin{bmatrix} 1 &2 &3 &4 &5 &6 &7 &8 \end{bmatrix}

目标值y=\begin{bmatrix} 8.3 &11.0 &14.7 &19.7 &26.7 &35.2 &44.4 &55.9 \end{bmatrix}

简单介绍一下高斯-牛顿迭代求解非线性方程组的过程。

高斯-牛顿迭代可以说是牛顿迭代的升级版->就是将误差的二范数进行最小值的优化求解。

这个方法的原理是,利用二阶泰勒展开去近似线性回归模型,通过迭代更新系数,令残差最小。

模型函数:f(x,\beta ),目标函数:min \, r=(f-y)^{2},此为单变量目标函数(单变量的意思就是f是一个单一变量),但是实际问题中肯定不止单变量,会出现多变量,因此会出现:min\, r=(f-y)^{T}(f-y)

第i个输入变量的残差可以表示为:r_{i}=f(x_{i},\beta )-y_{i}

又因为在目标函数y=Ae^{Bx}中,我们需要求A,B这两个需要更新的数值,因此对函数f中的A,B分别进行偏微分运算,得到对应的雅可比矩阵J^{T}=\begin{bmatrix} \frac{\delta J}{\delta A}\\ \frac{\delta J}{\delta B} \end{bmatrix}

在牛顿迭代中,牛顿迭代的公式为:x^{k+1}=x^{k}-H^{-1}\bigtriangledown f

其中H^{-1}是f的二阶梯度,在高斯-牛顿法中,省略二阶项,只留下一阶项的二次方,刚好与梯度\bigtriangledown f吻合

因此,得到最终的迭代公式:x^{k+1}=x^{k}+(J^{T}J)^{-1}J^{T}r_{i}

代码如下:

%object function y=A*e^(b*t)

clear
clc

deriv_step=1e-5;
iternum=100;

input=[1;2;3;4;5;6;7;8];
output=[8.3;11.0;14.7;19.7;26.7;35.2;44.4;55.9];

%gauss_newton
A=6;
B=0.3;
loop_num=100;
tt=1e-8;
for i=1:loop_num
    y=A*exp(B*input);
    r=output-y;
    JfA=exp(B*input);
    JfB=A*exp(B*input).*input;
    Jf=[JfA,JfB];
    betha=inv(Jf'*Jf)*Jf'*r;
    Anew=A+betha(1);
    Bnew=B+betha(2);
    if norm(r)<tt
        break;
    end
    A=Anew;
    B=Bnew;
end
subplot(1,2,1)
plot(input,output,'--bo',input,y,'rx');
subplot(1,2,2)
plot(input,r,'--b');
% xlim([-10 10]);
% ylim([0 100]);


得到结果如图:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值