最速下降法matlab全局最小值_最速下降和Newton法:Matlab实现
本文是关于数值优化算法里最基础的最速下降法(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实现相关推荐
- 最速下降法matlab全局最小值_梯度下降概念
1.梯度概念 (1)从几何意义上讲,就是函数变化最快的地方. 在单变量的函数中,梯度只是导数,其实就是函数在某个给定点的切线的斜率: 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数 ...
- matlab雨流计数,雨流计数法matlab程度源代码
<雨流计数法matlab程度源代码>由会员分享,可在线阅读,更多相关<雨流计数法matlab程度源代码(3页珍藏版)>请在人人文库网上搜索. 1. RAINFLOW cycle ...
- matlab svm工具箱_机器学习笔记--SVM(MATLAB 实现代码)
我们知道SVM的基本原理就是找一个超平面(广义平面)将样本分为几个部分,即分类. MATLAB中自带SVM包,使用起来也十分方便,假如X是特征矩阵,Y是分类标签(可以是数值(1.2)也可以是strin ...
- hfss matlab联合仿真_一文搞定matlab 与 STK 联合调试仿真环境配置(文末附软件下载链接)...
最近在做导师给的课题:卫星星座的快速优化设计. 需要用到matlab 和 STK 来进行联合调试仿真,但是这第一步的环境配置就让我头疼了几天.在好几次重装,失败和查找资料之后,我终于成功实现了matl ...
- matlab 解方程组_一文读懂MATLAB微分方程
此教程说明如何使用 MATLAB 构造几种不同类型的微分方程并求解.MATLAB 提供了多种数值算法来求解各种微分方程: 初始值问题 边界值问题 时滞微分方程 偏微分方程 初始值问题 vanderpo ...
- burg算法的matlab代码实现_导向滤波算法及其matlab代码实现
导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...
- matlab meshc函数_有那些相见恨晚的MATLAB绘图命令
有那些相见恨晚的MATLAB绘图命令 MATLAB的绘图功能可谓非常的强大,常用的有plot,plot3,subplot,scatter等等,这些函数有许多的参数设置,可以画出各种需求的图.但是这些强 ...
- matlab 图案 柱状图_值得收藏 | 如何用matlab做出酷炫的图像
1.基础知识 1.1 二维图形绘制 plot函数是Matlab绘制二维图形的常用函数,该函数将数组中的数据点绘连起来构成一条连续的曲线. plot(x,y,'PropertyName',Propert ...
- matlab多种分配方案_分配问题匈牙利算法的Matlab实现
function [x,fVal]=Hungary(C) % 输出参数: % x--Decision Varables, n*n矩阵 % fval--Objective function Value ...
- 基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析
基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析 1 背景知识 2 实际操作部分 2.1 空间数据读取 2.2 异常数据剔除 2.3 验证集筛选 2.4 最小二乘法 ...
最新文章
- HarmonyOS 怎样打印log/日志的打印
- 科技竞赛:阿广带大家免费使用GPU打比赛,普通人也有机会拿奖金!
- c语言程序设计家庭收支类,家庭支出管理系统—c语言程序设计
- 【响应式Web前端设计】:link、:hover、:active和:visited的区别
- Transformation XML(TCODE-STRANS)
- PAT (Basic Level) Practice (中文)1076 Wifi密码 (15 分)
- php JS 导出表格特殊处理
- linux/windows双系统安装、启动顺序设置及重新设置
- struts2源码系列(3)--拦截器
- 【LeetCode-SQL】1179. 重新格式化部门表
- 什么是安全性测试(security testing)?
- 乐动手环app下载安装_乐动健康安卓版
- 在 Linux shell 字符串中,百分比符号是什么?
- 面试攻略!Java 基础面试 100 问
- 优秀工程师应该具备哪些素质_优秀的工程师该具备什么能力?
- jzoj(senior)4208. 【五校联考1day1】线段树什么的最讨厌了
- 服务器安装360文档卫士,360文档卫士的安装使用方法
- 28335的启动步骤介绍
- python爬虫——使用requests库和xpath爬取猎聘网职位详情
- 基于Spark的用户行为分析系统