MATLAB数值分析学习笔记:黄金分割法
在工程上,最优化就是使被研究对象尽可能高效的过程,比如使时间花费最少,设计出最多的产品。在数学上,最优化就是寻找函数在某一区间上的局部极值,这些函数具有一个或多个变量,具有单自变量的函数,该过程被称为一维优化问题,否则称之为多维优化问题。
对于一维优化问题,在数学上往往是通过求解函数的导数,极值点导数为0,来求解的,这就变成了导数求根的问题了,可以使用划界法和开方法。
在划界法中,有一种方法被广泛应用,它就是黄金分割法。
下以黄金分割法求解极小值为例,就原理,代码实现,问题求解三个方面向大家介绍。
原理
至于黄金分割法有什么好处,为什么必须用黄金分割数这个特别的比例呢?黄金分割法的优点将在下文逐渐浮出水面。
定区间:黄金分割法首先要求给出要搜索的区间,设为(xl,xr)。那么两个黄金分割点就是
其中:
黄金分割率:
以下有时写成了xr有时写成了xu,请把xr,xu看成一个点。
缩小区间:判断f1=f(x1)与f2=f(x2)的大小。
- 若f1<f2,则x1是局部极小值,xl~x2这一段就可以抛弃了,简单更新一下迭代值:xu为上界不变;由于(xl,x2)的抛弃,xl需要更新:xl=x2;这时候黄金分割法的优点就体现出来了,因为唯有黄金分割,才能使x1仍为下一个区间的一个黄金分割点,且为左黄金分割点,这样直接令x2=x1就完成了x2的更新;最后求解出新区间的右黄金分割点,令其为x1,就完成了迭代.
- 若f1>f2,则x2是局部极小值,x1~xu这一段就可以抛弃了,简单更新一下迭代值:xl为下界不变;xu需要更新:xu=x1;x2仍为下一个区间的一个黄金分割点,且为右黄金分割点,这样直接令x1=x2就完成了x1的更新;最后求解出新区间的左黄金分割点,令其为x2,完成迭代.
终止条件:如果最优点在x1处,则最终极小值在(x2,x1,xr)区间内
估计值最大可能距离为max(x1-x2,xr-x1)
通过计算:xr-x1=(2-)(xr-xl)=0.3820(xr-xl)>x1-x2=(2
-3)(xr-xl)=0.2361(xr-xl).
故取
为终止迭代准则。
代码实现
function [x,fx,ea,iter] = goldmin(f,xl,xr,es,maxit)
%goldmin:用黄金分割法求解函数极小值
%%输入:
%f=将要解的函数方程
%xl=(x_left),xl=(x_right)搜索区间
%es=允许的容差
%maxit = 允许的最大迭代次数
%%输出:
%x=所求极小值点
%fx=所求极小值
%ea=相对误差(ea<=es时即可输出)
%iter=迭代次数
if nargin<3,error('最少需要输入三个参数——函数和搜索区间'), end
%当输入的参数少于3个时,即函数和搜索区间没有齐全时,报错!
if nargin<4 || isempty(es),es=0.0001;end
%当输入的参数少于4个时(没有输入容差),默认为0.0001
if nargin<5 || isempty(maxit),maxit=50;end
%当输入的参数少于5个时(没有输入最大迭代次数),默认为50次
phi=(1+sqrt(5))/2; %黄金分割数
iter=0;
d=(phi-1)*(xr-xl);
x1=xl+d;x2=xr-d; %xl和xr之间的两个黄金分割点
f1=f(x1);f2=f(x2);
while(1)xint=xr-xl;if f1 < f2xopt=x1; %x1是当前迭代的极小值点,用xopt表示xl=x2; %舍弃掉xl~x2这一段区间,令x2为新的xl,缩小区间x2=x1; %由黄金分割的性质,x1恰在新区间的左黄金分割点(令其为x2)上f2=f1; x1=xl + (phi - 1)*(xr-xl); f1=f(x1); %更新迭代值elsexopt=x2; xr=x1; x1=x2; f1=f2;x2=xr - (phi - 1)*(xr-xl); f2=f(x2);enditer = iter + 1;if xopt~=0,ea=(2-phi)*abs(xint/xopt) ;endif ea <= es || iter>=maxit,break,end
end
x=xopt;fx=f(xopt);
end
问题求解
问题:
用黄金分割求如下函数极小值
搜索区间为(0,4)。
f=@(x) (x^2)/10-2*sin(x);
[x,fx,ea,iter] = goldmin(f,0,4,0.0001,20)
结果:
>> goldmin_test
x =1.4275
fx =-1.7757
ea =1.1448e-04
iter =20
声明:文章来源于笔者学习【美】Steven C. CHapra所著,林赐译 《工程于科学数值方法的MATLAB实现》(第4版)的笔记,如有谬误或想深入了解,请翻阅原书。
MATLAB数值分析学习笔记:黄金分割法相关推荐
- MATLAB数值分析学习笔记:线性代数方程组的求解和高斯消元法
工程和科学计算的许多基本方程都是建立在守恒定律的基础之上的,比如质量守恒等,在数学上,可以建立起形如 [A]{x}={b} 的平衡方程.其中{x}表示各个分量在平衡时的取值,它们表示系统的状态或响应: ...
- MATLAB数值分析学习笔记:多项式拟合
在很多情况下,我们需要估计精确值之间的可能取值,常用的方法是多项式插值法.多项式插值法的原理是n个数据点可以确定n-1次多项式:例如三点确定一条抛物线. 工程上常用的多项式插值的方法有两种:牛顿插值法 ...
- 【数值分析学习笔记】——1、数值分析中的误差
1.1截断误差与舍入误差 误差 类型 固有误差 模型误差 测量误差 计算误差 截断误差 舍入误差 数值分析中主要讨论的是计算误差,包括截断误差与舍入误差. (1)舍入误差:由于数字计算机不能准确地表示 ...
- el-select 多选取值_数值优化|笔记整理(3)——线搜索中的步长选取方法,线性共轭梯度法...
上一节笔记传送门: 学弱猹:数值优化|笔记整理(2)--线搜索:步长选取条件的收敛性zhuanlan.zhihu.com ------------------------------------ 大 ...
- Python数据分析学习笔记:使用SciKit-Learn进行数据规范化
Python数据分析学习笔记:使用SciKit-Learn进行数据规范化 数据规范化是数据挖掘的一项基础工作.不同评价指标往往具有不同的量纲,数值见的差别可能很大,不进行处理可能会影响到数据分析的结果 ...
- 回溯法采用的搜索策略_数值优化|笔记整理(3)——线搜索中的步长选取方法,线性共轭梯度法...
上一节笔记传送门: 学弱猹:数值优化|笔记整理(2)--线搜索:步长选取条件的收敛性zhuanlan.zhihu.com ------------------------------------ 大 ...
- MATLAB一维插值笔记与应用–十安辰
MATLAB一维插值笔记与应用–十安辰 我们以一个题来了解一维插值,如下: 天文学家在1914年8月份的7次观测中,测得地球与金星之间的距离(单位:m),并取其常用对数值与日期的一组历史数据,如表 ...
- 实验Matlab数值运算,MATLAB数值实验一(数据的插值运算及其应用完整版
<MATLAB数值实验一(数据的插值运算及其应用完整版>由会员分享,可在线阅读,更多相关<MATLAB数值实验一(数据的插值运算及其应用完整版(6页珍藏版)>请在人人文库网上搜 ...
- 数据分析学习笔记——数据可视化
数据分析学习笔记系列--数据可视化 总第45篇 ▼ 写在前面: 本篇来源于书籍<数据之美-一本书学会可视化设计>的学习后整理所得.全篇主要围绕数据可视化的5个步骤展开,其中重点内容是第三步 ...
- Python数据分析学习笔记:计算向量夹角
Python数据分析学习笔记:计算向量夹角 通过计算两个向量夹角了解两个向量之间的相关性. # 计算向量夹角import numpy as npdef included_angle(a, b):a_n ...
最新文章
- C语言竟成TIOBE年度编程语言候选!苹果iPhone 7卖得最好!
- 美国美国,USA USA
- python和php合成,Python照片合成的方法详解
- 快速安装 Moodle 指南
- php邀请码演示代码,WordPress主题纯代码实现邀请码功能
- 新手填坑 java.lang.Integer cannot be cast to java.lang.String
- Snagit--高难度、多功能截图,有了它截图不求人!
- 微信小程序生成海报工具Painter
- icom对讲机写频线定义_自制电台通用写频线(完整版).pdf
- JAVA将图片转成base64导出到word中
- indexOf()用法
- uniapp使用逍遥模拟器调试项目
- [感动]知道我为什么喜欢SUPER JUNIOR吗?
- [易飞]信息传递-多表(含外表)关联取值
- python 微信机器人 关键词_python-微信机器人之词云
- 学计算机买华为还是买华硕,不考虑爱国因素,联想、华为、华硕等哪个品牌的笔记本电脑较好?...
- 笔记本电脑win10截图软件推荐
- 暴风影音邀安全厂商联手认证 提前发布特别版
- devc++未成年保护模式系统
- JSP学习笔记之基础教程