当前位置: 首页 > news >正文

【最优化方法】实验三 无约束最优化方法的MATLAB实现

实验的目的和要求:通过本次实验使学生进一步熟悉掌握使用MATLAB软件,并能利用该软件进行无约束最优化方法的计算。

实验内容:

1、最速下降法的MATLAB实现

2、牛顿法的MATLAB实现

3、共轭梯度法的MATLAB实现

学习建议:

本次实验就是要通过对一些具体问题的分析进一步熟悉软件的操作并加深对理论知识的理解。

重点和难点:

通过同一个具体问题用不同的方法解决的比较,加深理解恰当选用优化问题解决方法的重要性。

一 最速下降法

1.最速下降法基本原理和步骤

img 思想:寻求最速下降方向即负梯度方向

img

MATLAB实现:

2.代码及数值算例:

(1) 程序源代码:

function [ X,FMIN,K ] = zuisuxiajiang( f,x,x0,e )%  [ X,FMIN,N ] =zuisuxiajiang()法求解无约束问题%  X     极小点%  FMIN   极小值%  K     迭代次数%  f     问题函数%  x     变量%  x0    初始点%  e     终止误差%  张超编写于2014/04/15 count=0;td=jacobian(f,x)';while norm(subs(td,x,x0))>eP=-subs(td,x,x0);syms ry=x0+r*P;ft(r)=subs(f,x,y);    [r0]=fibonacci(ft,0,100,0.01);x0=x0+r0*P;count=count+1;endX=x0;FMIN=subs(f,x,x0);K=count;end

二 牛顿法

1.牛顿法基本原理和步骤

思想:在第k次迭代的迭代点x(k)邻域内,用一个二次函数(如二阶泰勒多项式)去近似代替原目标函数f(x),然后求出该二次函数的极小点作为对原目标函数求优的下一个迭代点,依次类推,通过多次重复迭代,使迭代点逐步逼近原目标函数的极小点。

设*f(x)*二次连续可微,在点 x(k) 处的Hesse矩阵正定。

img

MATLAB实现:

2.代码及数值算例:

(2) 程序源代码:

function [ X,FMIN,K ] = ysNewton( f,x,x0,e )%  [ X,FMIN,N ] =ysNewton()原始牛顿法求解无约束问题%  X     极小点%  FMIN   极小值%  K     迭代次数%  f     问题函数%  x     变量%  x0    初始点%  e     终止误差%  张超编写于2014/04/15count=0;td=jacobian(f,x)';H=jacobian(td',x);while norm(subs(td,x,x0))>eP=-subs(H,x,x0)^(-1)*subs(td,x,x0);x0=x0+P;count=count+1;endX=x0;FMIN=subs(f,x,x0);K=count;end

牛顿法对于二次正定函数只需做一次迭代就得到最优解。特别在极小点附近,收敛性很好速度也很快。

但牛顿法也有缺点,它要求初始点离最优解不远,若初始点选的离最优解太远时,牛顿法并不能保证其收敛,甚至也不是下降方向。

为了克服牛顿法的缺点,人们保留了从牛顿法中选取牛顿方向作为搜索方向,摒弃其步长恒取1的作法,而用一维搜索确定最优步长来构造算法。

img

(3) 程序源代码:

function [ X,FMIN,K ] = xzNewton( f,x,x0,e )%  [ X,FMIN,N ] =xzNewton()带步长牛顿法求解无约束问题%  X     极小点%  FMIN   极小值%  K     迭代次数%  f     问题函数%  x     变量%  x0    初始点%  e     终止误差%  张超编写于2014/04/15count=0;td=jacobian(f,x)';H=jacobian(td',x);while norm(subs(td,x,x0))>eP=-subs(H,x,x0)^(-1)*subs(td,x,x0);syms ry=x0+r*P;ft(r)=subs(f,x,y);    [r0]=fibonacci(ft,0,100,0.01);x0=x0+r0*P;count=count+1;endX=x0;FMIN=subs(f,x,x0);K=count;end

三 共轭梯度法

1.共轭梯度法基本原理和步骤

思想:将共轭性和最速下降方向相结合,利用已知迭代点处的梯度方向构造一组共轭方向,并沿此方向进行搜索,求出函数的极小点。

img

MATLAB实现:

2.代码及数值算例:

(1) 程序源代码:

function [ X,FMIN,K ] = gongetidu( f,x,x0,e )%  [ X,FMIN,N ] =gongetidu()共轭梯度法求解无约束问题%  X     极小点%  FMIN   极小值%  K     迭代次数%  f     问题函数%  x     变量%  x0    初始点%  e     终止误差%  张超编写于2014/04/15count=1;td=jacobian(f,x)';H=jacobian(td',x);if norm(subs(td,x,x0))>eP=-subs(td,x,x0);r0=-subs(td,x,x0)'*P/(P'*H*P);x0=x0+r0*P;else x0;endwhile norm(double(subs(td,x,x0)))>eb0=subs(td,x,x0)'*subs(td,x,x0)/(P'*P);P=-subs(td,x,x0)+b0*P;r0=-subs(td,x,x0)'*P/(P'*H*P);x0=x0+r0*P;count=count+1;endX=x0;FMIN=subs(f,x,x0);K=count;end

四 一个算例

分别用上述三中方法计算下题,并比较各算法.

Min f(x)=(x1 - 2)^2 + (x1 – 2*x2)^2

初始点x0=(0,3)T

允许误差e=0.1

键入命令并输出结果:

syms x1 x2\>> f=(x1-2)^2+(x1-2*x2)^2;\>> x=[x1;x2];\>> x0=[0;3];\>> e=0.1;[X,FMIN,N]=zuisuxiajiang(f,x,x0,e)X =1.97630.9818FMIN =7.2076e-04N =10\>> [X,FMIN,N]=ysNewton(f,x,x0,e)X =21FMIN =0N =1[X,FMIN,N]=gongetidu(f,x,x0,e)X =21FMIN =0N =2

由上述结果我们发现:

对于二次正定函数newton法只需一次迭代就得到正确结果,共轭梯度法只需进行两次(因为目标函数是二元函数)迭代就得出正确结果。但最速下降法却迭代了10次,虽然一维搜索存在误差,但实际上最速下降法也需迭代多次。

http://www.lryc.cn/news/356870.html

相关文章:

  • kafka-偏移量图解
  • 内网安全--隧道技术-MSF上线本地
  • 初识STM32单片机-TIM定时器
  • NSSCTF-Web题目3
  • 基于Java实现震中附近风景区预警可视化分析实践
  • 【CTF Web】CTFShow web7 Writeup(SQL注入+PHP+进制转换)
  • ABAP WRITE换行输出
  • VUE3学习第一篇:启动ruoyi
  • python-数据可视化(总)
  • 使用git生成SSH公钥,并设置SSH公钥
  • iPhone win10更改备份路径
  • Jmeter元件及基本作用域
  • GB-T 43696-2024 网络安全技术 零信任参考体系架构
  • Java使用apache.poi生成excel插入word中
  • 斯坦福报告解读3:图解有趣的评估基准(上)
  • C语言---扫雷游戏的实现
  • 《征服数据结构》块状链表
  • leetCode.86. 分隔链表
  • Java进阶学习笔记5——Static应用知识:单例设计模式
  • Vue 前端加框 给div加红色框框 js实现
  • Percona Toolkit 神器全攻略(实用类)
  • ARM GIC 和NVIC的区别
  • CSS文本粒子动画特效之爱心粒子文字特效-Canvas
  • 小熊家务帮day5 客户管理模块1 (小程序认证,手机验证码认证等)
  • Blender 学习笔记(一)快捷键记录
  • ubuntu linux (20.04) 源码编译cryptopp库 - apt版本过旧
  • 机器学习-3-特征工程的重要性及常用特征选择方法
  • QGis3.34.5工具软件保存样式,软件无反应问题
  • JavaScript(ES6)入门
  • 深入分析 Android Activity (十)