本文是关于数值优化算法里最基础的最速下降法(Steepest Descent,SD)还有Newton法的Matlab实现

本文参考了高立《数值最优化方法》北京大学出版社

马昌凤 《最优化方法及其 Matlab程序设计》电子版

似乎应该在写代码之前先把理论复习一下,但是由于懒,还是直接复制粘贴写好的代码来得爽

在讲具体算法之前本应该介绍一下线搜索算法的框架和一些准则的,但是还没有写好,先发这个吧

Armijo准则+回溯的线搜索方法

function[alpha,flag]=Armijo(fun,gfun,x,d)% abs:使用Armijo准则回溯进行非精确线搜索

% input:待搜索函数fun,梯度gfun,初始点x,方向d

% output:搜索结果alpha

%设置初始参数

rho=10e-3;

alpha=1;beta=0.5;

m=0;m_max=20;flag=0;

while (m < m_max )

flag=(feval(fun,x+alpha*d) <= feval(fun,x)+ rho*alpha*feval(gfun,x)'*d);

if flag == 1

break;

end

m=m+1;

alpha=alpha*beta;

end

SD法就是沿着下降方向最快的方向搜索的方法

function [x,val,iter,flag] =SD(fun,gfun,x0)

%abs:使用最速下降法(steepest descent)求解无约束优化问题

%input:目标函数f,梯度函数g,初始点x0

%output:最优解x,最优值y,迭代次数iter,flag表示是否正常终止

%设置初始参数

k_max=10000; %最大迭代次数

rho=0.5;sigma=0.4;flag=0;

k=0; epsilon=1e-5;xk=x0

while(k < k_max)

gk=gfun(xk); %计算梯度

dk=-gk; %计算搜索方向

if(norm(dk) < epsilon) flag=1;break; end

m=0; mk=0;

[alpha,] = Armijo(fun,gfun,xk,dk)

xk=xk+alpha*dk;

k=k+1;

end

x=xk;

val=fun(xk);

iter=k;

end

基本的Newton法

function [x,val,iter,flag] = Newton(fun,gfun,Hess,x0)

%abs:使用Newton法求解无约束优化问题

%input:目标函数fun,梯度函数gfun,黑塞矩阵Hess,初始点x0

%output:最优解x,最优值val,迭代次数iter

%设置初始参数

k_max=5000; %最大迭代次数

k=0; epsilon=1e-5;

xk=x0;

while(k < k_max)

gk=gfun(xk); %计算梯度

Gk=Hess(xk);

dk=-Gk\gk; %计算搜索方向

if(norm(dk) < epsilon) flag=1; break; end

xk=xk+dk;

k=k+1;

end

x=xk;

val=fun(xk);

iter=k;

end

阻尼牛顿法:使用Newton法的方向加上线搜索技术

function [x,val,iter,flag] = dampNewton(fun,gfun,Hess,x0)

%abs:使用阻尼Newton法求解无约束优化问题

%input:目标函数fun,梯度函数gfun,黑塞矩阵Hess,初始点x0

%output:最优解x,最优值val,迭代次数iter,flag表示是否在最大迭代次数内终止

%设置初始参数

k_max=5000; %最大迭代次数

k=0; epsilon=1e-5;

xk=x0;

while(k < k_max)

gk=gfun(xk); %计算梯度

Gk=Hess(xk);

dk=-Gk\gk; %计算搜索方向

if(norm(dk) < epsilon) flag=1; break; end

[alpha,] = Armijo(fun,gfun,xk,dk)

xk=xk+alpha*dk;

k=k+1;

end

x=xk;

val=fun(xk);

iter=k;

end

下面两种方法都是在上面的算法实现上稍加改进,就不贴代码了(其实我也没写,因为感觉差不多)

由于Hessian矩阵不一定是正定的,因此可以考虑混合牛顿法:在Hessian矩阵可逆时使用Newton法的方向,在Hessian矩阵不可逆时采取最速下降方向

另外,若Hessian矩阵不可逆可以考虑加上一个单位矩阵的倍数来修正得到正定矩阵,修正系数可以考虑以几何级数增加来搜索.这就是Levenberg-Marquardt方法.这种思想在设计求解最小二乘问题的同名算法时也用到了.

下面是一些测试的例子,里面的Rosenbrock是数值最优化里比较常用的检验函数

%测试Armijio准则

%[alpha,flag]=Armijo(@Rosenbrock,@DRosenbrock,[-1 1]',[1 -2]')

%测试SD

%[x,val,iter,flag] =SD(@Rosenbrock,@DRosenbrock,[-1.2,1]')

%测试Newton法

%[x,val,iter,flag] = Newton(@Rosenbrock,@DRosenbrock,@HRosenbrock,[-1.2,1]')

%测试阻尼Newton法

% [x,val,iter,flag] = dampNewton(@Rosenbrock,@DRosenbrock,@HRosenbrock,[-1.2,1]')

按照我上面的参数运行了一下,SD用了大概1w次,Newton法5次,阻尼Newton法大概20次.

函数里有一些参数会影响到算法的循环次数,可以自己调整

最速下降法matlab全局最小值_最速下降和Newton法:Matlab实现相关推荐

  1. 最速下降法matlab全局最小值_梯度下降概念

    1.梯度概念 (1)从几何意义上讲,就是函数变化最快的地方. 在单变量的函数中,梯度只是导数,其实就是函数在某个给定点的切线的斜率: 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数 ...

  2. matlab雨流计数,雨流计数法matlab程度源代码

    <雨流计数法matlab程度源代码>由会员分享,可在线阅读,更多相关<雨流计数法matlab程度源代码(3页珍藏版)>请在人人文库网上搜索. 1. RAINFLOW cycle ...

  3. matlab svm工具箱_机器学习笔记--SVM(MATLAB 实现代码)

    我们知道SVM的基本原理就是找一个超平面(广义平面)将样本分为几个部分,即分类. MATLAB中自带SVM包,使用起来也十分方便,假如X是特征矩阵,Y是分类标签(可以是数值(1.2)也可以是strin ...

  4. hfss matlab联合仿真_一文搞定matlab 与 STK 联合调试仿真环境配置(文末附软件下载链接)...

    最近在做导师给的课题:卫星星座的快速优化设计. 需要用到matlab 和 STK 来进行联合调试仿真,但是这第一步的环境配置就让我头疼了几天.在好几次重装,失败和查找资料之后,我终于成功实现了matl ...

  5. matlab 解方程组_一文读懂MATLAB微分方程

    此教程说明如何使用 MATLAB 构造几种不同类型的微分方程并求解.MATLAB 提供了多种数值算法来求解各种微分方程: 初始值问题 边界值问题 时滞微分方程 偏微分方程 初始值问题 vanderpo ...

  6. burg算法的matlab代码实现_导向滤波算法及其matlab代码实现

    导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...

  7. matlab meshc函数_有那些相见恨晚的MATLAB绘图命令

    有那些相见恨晚的MATLAB绘图命令 MATLAB的绘图功能可谓非常的强大,常用的有plot,plot3,subplot,scatter等等,这些函数有许多的参数设置,可以画出各种需求的图.但是这些强 ...

  8. matlab 图案 柱状图_值得收藏 | 如何用matlab做出酷炫的图像

    1.基础知识 1.1 二维图形绘制 plot函数是Matlab绘制二维图形的常用函数,该函数将数组中的数据点绘连起来构成一条连续的曲线. plot(x,y,'PropertyName',Propert ...

  9. matlab多种分配方案_分配问题匈牙利算法的Matlab实现

    function [x,fVal]=Hungary(C) % 输出参数: % x--Decision Varables, n*n矩阵 % fval--Objective function Value ...

  10. 基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析

    基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析 1 背景知识 2 实际操作部分 2.1 空间数据读取 2.2 异常数据剔除 2.3 验证集筛选 2.4 最小二乘法 ...

最新文章

  1. HarmonyOS 怎样打印log/日志的打印
  2. 科技竞赛:阿广带大家免费使用GPU打比赛,普通人也有机会拿奖金!
  3. c语言程序设计家庭收支类,家庭支出管理系统—c语言程序设计
  4. 【响应式Web前端设计】:link、:hover、:active和:visited的区别
  5. Transformation XML(TCODE-STRANS)
  6. PAT (Basic Level) Practice (中文)1076 Wifi密码 (15 分)
  7. php JS 导出表格特殊处理
  8. linux/windows双系统安装、启动顺序设置及重新设置
  9. struts2源码系列(3)--拦截器
  10. 【LeetCode-SQL】1179. 重新格式化部门表
  11. 什么是安全性测试(security testing)?
  12. 乐动手环app下载安装_乐动健康安卓版
  13. 在 Linux shell 字符串中,百分比符号是什么?
  14. 面试攻略!Java 基础面试 100 问
  15. 优秀工程师应该具备哪些素质_优秀的工程师该具备什么能力?
  16. jzoj(senior)4208. 【五校联考1day1】线段树什么的最讨厌了
  17. 服务器安装360文档卫士,360文档卫士的安装使用方法
  18. 28335的启动步骤介绍
  19. python爬虫——使用requests库和xpath爬取猎聘网职位详情
  20. 基于Spark的用户行为分析系统

热门文章

  1. spss——主成分分析详解
  2. SPSS时序全局主成分分析方法
  3. Mybatis 拦截器简述
  4. 对JSP内置对象的部分总结
  5. tkinter GUI 客户端页面编程 登录注册案例开发
  6. 怎么使用水经注万能地图下载器制作百度个性化建筑地图
  7. libhv网络库源码剖析
  8. 通证实战派— WBTO区块链孵化工厂(企业痛点终结站)
  9. excel android版,Microsoft Excel手机版
  10. Java、JSP小区车辆停车管理系统