利用 MATLAB 编程实现 Newton 法与阻尼 Newton 法

本文章包含以下内容

1、画出阻尼 Newton 法的算法流程图;

2、MATLAB 编写用数值微分计算二阶 Hesse 矩阵的函数(函数式 M 文件);

3、MATLAB 编写 Newton 法求解无约束优化问题的函数,用数值微分计算 二阶 Hesse 矩阵(函数式 M 文件,精度设为 epson 可调);

4、MATLAB 编写阻尼 Newton 法求解无约束优化问题的函数,要求采用 黄金分割法精确一维搜索,用数值微分计算 Hesse 矩阵(函数式 M 文件,精 度设为 epson 可调);

5、MATLAB 编写阻尼 Newton 法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分计算 Hesse 矩阵(函数式 M 文件, 精度设为 epson 可调);

6、MATLAB 编写程序(命令式 M 文件),分别利用 Newton 法、精确搜索与 不精确搜索的阻尼 Newton 法,求解如下问题:

\LARGE \min f(x)=100(x_2-x_1^2)^2+(1-x_1)^2

精度为 0.001,初始点为(-1,1)。

数值微分法,Wolfe-Powell 非精确一维搜索代码链接

一维搜索,进退法,黄金分割法代码链接

本实验中函数用单独function计算

function y=f(x)
if(length(x)==1)
    global xk;
    global pk;
    x=xk+x*pk;
end
y=100*(x(2)-x(1)^2)^2+(1-x(1))^2;

1、阻尼 Newton 法的算法流程图;

 

2、MATLAB 编写用数值微分计算二阶 Hesse 矩阵的函数(函数式 M 文件);

function G=Hesse_2(x)
fx=f(x);%避免多次计算
G=zeros(length(x));
for i = 1 : length(x)
    for j = 1 : length(x)
        if i == j
            m=zeros(1,length(x));
            m(i)=(10^-6);
            G(i,i)=(f(x+m)+f(x-m)-2*fx)/(10^-12);
        else
            m=zeros(1,length(x));
            m(i)=(10^-6);
            n=zeros(1,length(x));
            n(j)=(10^-6);
            G(i,j)=(f(x+m+n)-f(x+m)-f(x+n)+fx)/(10^-12);
        end
    end
end

3、MATLAB 编写 Newton 法求解无约束优化问题的函数,用数值微分计算 二阶 Hesse 矩阵(函数式 M 文件,精度设为 epson 可调);

function xk=Newton(e,xk)
%step 1
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    gk=shuzhiweifenfa(xk);
    %step 3
    %范数用的是平方和开根号
    if sqrt(sum(gk.^2))<=e
        return
    end
    Gk=Hesse_2(xk);
    %由于之前函数默认返回行向量
    %gk需转置
    pk=-Gk^-1*gk';
    %step 4
    xk=xk+pk';
end

4、MATLAB 编写阻尼 Newton 法求解无约束优化问题的函数,要求采用 黄金分割法精确一维搜索,用数值微分计算 Hesse 矩阵(函数式 M 文件,精 度设为 epson 可调);

function xk=Newton_hjfg(e,x)
global xk;
global pk;
xk=x;
%step 1
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    gk=shuzhiweifenfa(xk);
    %step 3
    %范数用的是平方和开根号
    if sqrt(sum(gk.^2))<=e
        return
    end
    Gk=Hesse_2(xk);
    %由于之前函数默认为行向量
    %pk,gk需转置
    pk=(-Gk^-1*gk')';
    %step 4
    %一维搜索求ak
    %这两个函数见之前代码(matlab无约束最优化的一般算法)
    [a,b,c]=jintuifa(0,0.1);
    a=huangjinfenge(a,c,10^-4);
    %step 5
    xk=xk+a*pk;
end

5、MATLAB 编写阻尼 Newton 法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分计算 Hesse 矩阵(函数式 M 文件, 精度设为 epson 可调);

function xk=Newton_Wolfe(e,x)
global xk;
global pk;
xk=x;
%step 1
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    gk=shuzhiweifenfa(xk);
    %step 3
    %范数用的是平方和开根号
    if sqrt(sum(gk.^2))<=e
        return
    end
    Gk=Hesse_2(xk);
    %由于之前函数默认为行向量
    %pk,gk需转置
    pk=(-Gk^-1*gk')';
    %step 4
    %一维搜索求ak
    %函数见之前代码(利用 MATLAB 编程实现最速下降法求解无约束最优化问题)
    a=Wolfe_Powell(xk,pk);
    %step 5
    xk=xk+a*pk;
end

6、MATLAB 编写程序(命令式 M 文件),分别利用 Newton 法、精确搜索与 不精确搜索的阻尼 Newton 法,求解如下问题:

\LARGE \min f(x)=100(x_2-x_1^2)^2+(1-x_1)^2

精度为 0.001,初始点为(-1,1)。

clear
clc
x=[-1,1];
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
fprintf('=========================\n');
fprintf('Newton 法:\n');
x_=Newton(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('精确搜索的阻尼 Newton 法:\n');
x_=Newton_hjfg(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的阻尼 Newton 法:\n');
x_=Newton_Wolfe(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));

结果:

 

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阻尼牛顿(Damped Newton Method)是一种求解非线性方程组的方,常用于求解优化问题的极小值。下面是一个基于阻尼牛顿的函数实现,可以用于求解函数的极小值: ```matlab function [x, fx, iter] = damped_newton(f, gradf, hessf, x0, tol, maxiter) % f: 目标函数 % gradf: 目标函数的梯度 % hessf: 目标函数的 Hessian 矩阵 % x0: 初始点 % tol: 精度要求 % maxiter: 最大迭代次数 x = x0; fx = f(x); g = gradf(x); H = hessf(x); iter = 0; while norm(g) > tol && iter < maxiter % 计算搜索方向 d = -H \ g; % 阻尼系数的初始值 alpha = 1; % 利用 backtracking line search 计算最优的阻尼系数 while f(x + alpha * d) > fx + 0.5 * alpha * g' * d alpha = alpha / 2; end % 更新解和函数值 x = x + alpha * d; fx = f(x); % 更新梯度和 Hessian 矩阵 g = gradf(x); H = hessf(x); iter = iter + 1; end end ``` 其中,`f`、`gradf` 和 `hessf` 分别是目标函数、目标函数的梯度和 Hessian 矩阵的函数句柄。`x0` 是初始点,`tol` 是精度要求,`maxiter` 是最大迭代次数。函数的输出包括求解得到的最优解 `x`、最优解对应的函数值 `fx` 和迭代次数 `iter`。 使用该函数可以实现对任意目标函数的极小值求解,例如,对于 Rosenbrock 函数: ```matlab % Rosenbrock 函数 f = @(x) 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2; gradf = @(x) [-400 * x(1) * (x(2) - x(1)^2) - 2 * (1 - x(1)); 200 * (x(2) - x(1)^2)]; hessf = @(x) [1200 * x(1)^2 - 400 * x(2) + 2, -400 * x(1); -400 * x(1), 200]; x0 = [-1.2; 1]; tol = 1e-6; maxiter = 100; [x, fx, iter] = damped_newton(f, gradf, hessf, x0, tol, maxiter); fprintf("x = (%g, %g), f(x) = %g, iter = %d\n", x(1), x(2), fx, iter); ``` 可以得到最优解为 `x = (1, 1)`,最小函数值为 `f(x) = 0`,迭代次数为 19。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值