【python】二分法和黄金分割法求函数局部最小值

1. 二分法

使用二分法求最小值需要函数f(x)一阶可导,即寻找导数为0的点:f'(x)=0

因此,这一问题转化为求g(x)=f'(x)=0的根。

假设我们可以找到两个点x_lx_r,x_l<x_r,g(x_l)<0,g(x_r)>0,根据中值定理,x_lx_r之间一定有根。

二分法步骤如下:

1. 令x_m=\frac{x_l+x_r}{2}.

2. 若g(x_m)=0,直接输出x_m.

3. 否则:

        1. 若g(x_m)>0,让x_r=x_m

         2. 若g(x_m)<0,让x_l=x_m;     

4. 如果|x_r-x_l|<\epsilon,停止循环,输出\frac{x_l+x_r}{2},否则返回步骤1.

代码实现如下:

def bisection(g,xl,xr,tol,maxit=200):
    if g(xl)<0 and g(xr)>0:
        i=0
        while abs(xr-xl)>=tol and i<=maxit:
            xm=(xl+xr)/2
            #print(xl,xr)
            if g(xm)>0:
                xr=xm
            if g(xm)<0:
                xl=xm
            if g(xm)==0:
                break
            i=i+1
        return i,(xl+xr)/2
    else:
        print('wrong input')
        return

根据二分法,我们可以找到f(x)近似的一个驻点。如果f(x)是凸函数,这个驻点为全局最小值点。

二分法容易实施,在实际应用中被广泛使用。然而,它存在缺点:我们必须知道f(x)的一阶导数形式。然而有时候函数的导数是非常难计算的。

所以,我们介绍另一种方法:黄金分割法。

黄金分割法的步骤如下:

假设我们有区间[x_l,x_r],0<\phi<0.5

1. 设x_l'=\phi x_r+(1-\phi)x_l, x_r'=\phi x_l+(1-\phi)x_r.

2. 如果f(x_l')<f(x_r'),最小值点一定在[x_l,x_r'],故令x_r=x_r'

3. 否则,令x_l=x_l'

4. 如果|x_r-x_l|<\epsilon,停止循环,输出\frac{x_l+x_r}{2},否则返回步骤1.

为了节约计算时间,我们想选择\phi使得下一轮迭代的x_r等于当前的x_l,即x_r''=x_l'

解得\phi=\frac{3-\sqrt 5}{2}

代码实现:

import numpy as np
import matplotlib.pyplot as plt
def f(x):
    return np.sqrt(1-x+x**2)-0.75*x
def golden_section(f,xl,xr,tol,maxit=200):
    phi=(3-np.sqrt(5))/2
    i=0
    while abs(xr-xl)>=tol and i<=maxit:
        xl_=phi*xr+(1-phi)*xl
        xr_=phi*xl+(1-phi)*xr
        #update xl and xr
        if f(xl_)<f(xr_):
            xr=xr_
        else:
            xl=xl_
        i=i+1
        #print(xl,xr)
    return i,(xr+xl)/2

下面以

为例,分别使用二分法和黄金分割法进行求解:

def g(x):
    return x*np.sin(x)*np.arctan(x)
#Derivation of g(x)
def delta_g(x):
    return x*np.sin(x)/(1+x**2)+np.arctan(x)*(np.sin(x)+x*np.cos(x))

iter1,solution1=bisection(delta_g,-4,2,1e-5,200)
iter2,solution2=golden_section(g,-4,2,1e-5,200)
print('the bisection take %i interations get the solution %f'%(iter1,solution1))
print('the golden section take %i interations get the solution %f'%(iter2,solution2))

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超高校级退堂鼓表演艺术家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值