MATLAB--高斯牛顿法

利用高斯牛顿法求解非线性问题,包含了利用LDLT分解法求解Ax=b的方程:

clear all;
clc
%%演示牛顿高斯法--非线性优化

%真实值
ar = 1.0;
br = 2.0;
cr = 1.0;
x = 1:2:100;
x = x./100;
nosie = 0.9*randn(1,size(x,2));%产生高斯噪音
y_real = exp(ar*x.^2+br*x+cr)+nosie;

%估计初始值
ae = 2.0;
be = 4.0;
ce = 3.0;
itr = 20;%迭代次数
num_itr = 0;%初始迭代次数
esp = 0.01;
%构造函数f(a,b,c)
syms x_ a b c;
arg = [a;b;c];
f(a,b,c,x_) = exp(a*x_.^2+b*x_+c);
Jacobi = jacobian(f,arg);
%高斯牛顿法
last_cost = 0;
for i=1:itr
    H = 0;
    b = 0;
    cost = 0;
    J = [0 0 0];
    for j = 1:size(x,2)
        error = y_real(j)-f(ae,be,ce,x(j));
        
        %雅可比矩阵
         J(1) = -x(j)^2*exp(ae*x(j)^2 + be*x(j) + ce);
         J(2) =  -x(j)*exp(ae*x(j)^2 + be*x(j) + ce);
         J(3) = -exp(ae*x(j)^2 + be*x(j) + ce);
        
         %用MATLAB库函数求出的Jacobian
         %J_ = -Jacobi(ae,be,ce,x(j));%因为y_real(j)-f(ae,be,ce,x(j)),所以要添个负号
         %for k=1:3
         %   J(k) = J_(k);
         %end
       
        H = H + J'*J;
        b = b+ -J'*error;
        cost = cost + error^2;
    end

    %结束条件
    if abs((cost-last_cost)/cost)<esp
        break
    end
    num_itr = i;
    last_cost = cost;
    fprintf('%d,%f\n',i,cost);
    
    %ldlt分解求解dx
    [L,D] = ldl(H);
    bH = sum(b,2);
    dx = L'\(D\(L\bH));
    
    %矩阵直接求逆求解dx
    %dx = H^-1*b;

    ae = vpa(ae+dx(1),2);%放低精度,加快运算速度
    be = vpa(be+dx(2),2);
    ce = vpa(ce+dx(3),2);
end
plot(x,f(ae,be,ce,x));
hold on;
grid on;
scatter(x,y_real,100,'black','.');
fprintf('迭代次数为:%d\n',num_itr);

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高斯牛顿法是一种非线性最小二乘拟合方,用于求解最小二乘问题。在Matlab中,可以通过编写函数来实现高斯牛顿法。 首先,需要定义一个目标函数,即要进行最小二乘拟合的函数。这个函数可以是任意的非线性函数。 然后,需要定义一个初始估计值,作为高斯牛顿法的起始点。可以根据实际情况或者经验来选择初始值。 接下来,在循环中迭代运行高斯牛顿法的步骤,直至满足收敛条件为止。具体步骤如下: 1. 计算目标函数在当前估计值处的雅可比矩阵。 2. 计算当前估计值处的目标函数值。 3. 根据雅可比矩阵和目标函数值,求解线性最小二乘问题,得到一个增量值(delta)。 4. 更新估计值,将当前估计值加上增量值。 5. 判断增量值是否满足收敛条件,若满足则终止迭代,否则返回第1步。 高斯牛顿法的核心是求解线性最小二乘问题,这可以通过Matlab中的矩阵运算和求解线性方程组的函数来实现。在每次迭代中,需要计算雅可比矩阵的转置矩阵乘以雅可比矩阵,以及雅可比矩阵的转置矩阵乘以目标函数值,然后利用这些矩阵来求解线性方程组。 最后,通过不断迭代运行高斯牛顿法,直到满足收敛条件,即可得到最小二乘拟合的结果。 总之,高斯牛顿法是一种通过不断迭代求解线性最小二乘问题的方,通过Matlab中的矩阵运算和线性方程组求解函数,可以实现这种方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值