MATLAB数值分析学习笔记:黄金分割法

在工程上,最优化就是使被研究对象尽可能高效的过程,比如使时间花费最少,设计出最多的产品。在数学上,最优化就是寻找函数在某一区间上的局部极值,这些函数具有一个或多个变量,具有单自变量的函数,该过程被称为一维优化问题,否则称之为多维优化问题。

对于一维优化问题,在数学上往往是通过求解函数的导数,极值点导数为0,来求解的,这就变成了导数求根的问题了,可以使用划界法和开方法。

在划界法中,有一种方法被广泛应用,它就是黄金分割法

下以黄金分割法求解极小值为例,就原理,代码实现,问题求解三个方面向大家介绍。

原理

至于黄金分割法有什么好处,为什么必须用黄金分割数这个特别的比例呢?黄金分割法的优点将在下文逐渐浮出水面。

定区间:黄金分割法首先要求给出要搜索的区间,设为(xl,xr)。那么两个黄金分割点就是

x_{1}=x_{l}+d, x_{2}=x_{r}-d

其中:

d=(\phi -1)(x_{r}-x_{l})

黄金分割率:\phi =\tfrac{1+\sqrt{5}}{2}\approx 0.1618 

以下有时写成了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-\phi)(xr-xl)=0.3820(xr-xl)>x1-x2=(2\phi-3)(xr-xl)=0.2361(xr-xl).

故取

\varepsilon_{a} =(2-\phi )| \frac{x_{r}-x_{l}}{x_{opt}} |\times 100%

为终止迭代准则。

 代码实现

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 < f2
        xopt=x1;    %x1是当前迭代的极小值点,用xopt表示
        xl=x2;    %舍弃掉xl~x2这一段区间,令x2为新的xl,缩小区间
        x2=x1;    %由黄金分割的性质,x1恰在新区间的左黄金分割点(令其为x2)上
        f2=f1;    
        x1=xl + (phi - 1)*(xr-xl); f1=f(x1);    %更新迭代值
    else
        xopt=x2; xr=x1; x1=x2; f1=f2;
        x2=xr - (phi - 1)*(xr-xl); f2=f(x2);
    end
    iter = iter + 1;
    if xopt~=0,ea=(2-phi)*abs(xint/xopt) ;end
    if ea <= es || iter>=maxit,break,end
end
x=xopt;fx=f(xopt);
end

问题求解

问题:

用黄金分割求如下函数极小值

 f(x)=\frac{x^{2}}{10}-2sinx

 搜索区间为(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版)的笔记,如有谬误或想深入了解,请翻阅原书。

  • 4
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数值分析是一门研究数值计算方及其应用的学科。Matlab作为一个强大的数值计算工具,可以帮助我们更好地学习和理解数值分析。下面是一些Matlab数值分析学习笔记,供您参考: 1. 数值计算基础 - Matlab数值计算基础包括基本的数学函数、变量定义、矩阵运算等。 - 常用的数学函数包括sin、cos、exp、log等。 - 变量定义和赋值可以使用等号“=”,例如a=2。 - 矩阵运算可以使用“*”表示矩阵乘,使用“\”表示矩阵求解线性方程组。 2. 数值 - 数值包括数值积分、数值微分、插值、最小二乘等。 - Matlab中的数值积分函数包括quad、quadl、quadgk等。 - Matlab中的数值微分函数包括diff、gradient、jacobian等。 - 插值可以使用interp1函数实现。 - 最小二乘可以使用polyfit函数实现。 3. 常微分方程(ODE) - 常微分方程是数值分析中的重要内容之一,Matlab提供了ode45、ode23等函数实现常微分方程的数值。 - ode45函数是最常用的常微分方程数值之一,可以处理刚性和非刚性方程。 4. 偏微分方程(PDE) - 偏微分方程是数值分析中的另一个重要内容,Matlab提供了pdepe、pde23等函数实现偏微分方程的数值。 - pdepe函数可以处理二阶线性偏微分方程,pde23函数可以处理一般的偏微分方程。 5. 数值优化 - 数值优化是数值分析中的一个重要分支,Matlab提供了fminsearch、fmincon等函数实现数值优化。 - fminsearch函数可以用于无约束优化问题,fmincon函数可以用于有约束优化问题。 以上是一些Matlab数值分析学习笔记,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值