最优化-黄金分割法 原理及代码实现

1.黄金分割法介绍

黄金分割法,也叫0.618法,主要用于单峰函数,通过不断地分割迭代,从而找到近似于最小值的函数值。

1.1单峰函数:

如图所示,

设f(x)是定义在D上的实值函数,如果存在x_0\epsilon D,使得对D中当任何x_1<x_2<x_0时,f(x_1)<f(x_2),当x_0<x_3<x_4时有f(x_3)<f(x_4),那么就说是定义在D上的单峰函数

1.2算法原理

为了找出最小点,我们通过不断试探的方法,首先我们需要给定区间[a,b],然受在给定区间内取两点

x_1,x_2,

 x_1 = a + (1-\tau )(b-a)

x_2 = b - (1-\tau)(b-a)

\tau = \frac{\sqrt{5}-1}{2}\approx 0.618

黄金分割的核心原理就是在于对点的选取:

对于x_1和x_2的选取分为以下两种情况:

f(x_1) < f(x_2) : b =x_2 ,x_2 = x_1,x_1= a+(b-a)*\tau

f(x_1) \geq f(x_2): a= x_1,x_1 =x_2,x_2 = b - (b-a) * \tau

通过两式的不断迭代,a,b在逐渐靠近,我们设置一个精度epi,当

a-b<epi 停止迭代。

2.代码实现

2.1输入函数

我们自己定义区间a,b的值,并且输入所要求的方程形式如(x^2 + 5*x +2)

a = float(input("初始左端点"))
b = float(input("初始右端点"))
def function(a):
     fx = str_fx.replace("x", "a")  # 所有的"x"换为方法所输入的参数a
     return eval(fx)  #eval类型用于对字符串公式进行转换
init_str = input("请输入一个函数,默认变量为x:\n")  # 输入的最初字符串
str_fx = init_str.replace("^", "**")  # 将所有的“^"替换为python的幂形式"**"

2.2画出函数并判断是否为单峰函数

通过定义drawf函数,并且传入参数a,b和间隔interp,来画出图像,通过图像判断是否可以使用黄金分割法进行一维线性搜索。

from pylab import *
def drawf(a, b, interp):
    x = [a+ele*interp for ele in range(0, int((b-a)/interp))]
    y = [function(ele) for ele in x]
    # y = [function(x)]
    plt.figure(1)
    plt.plot(x, y)
    xlim(a, b)
    #title(color="b")
    plt.show()
draw(a,b,0.05)

如图像所示,我们输入函数(x^2 + 5*x +2)在区间a,b上为凸函数

2.3不断迭代求出最小值和最小值点

def golden_section_search(a, b, eps=1e-8):
    phi = (1 + 5 ** 0.5) / 2  # 黄金分割常数phi
    x1 = b - (b - a) / phi
    x2 = a + (b - a) / phi
    while abs(b - a) > eps:  # 终止条件为区间长度小于给定的值
        if function(x1) < function(x2):
            b = x2
            x2 = x1
            x1 = a + (b - a) / phi
            #plt.plot(x1, function(x1), 'y*')
        else:
            a = x1
            x1 = x2
            x2 = b - (b - a) / phi
            #plt.plot(x2, function(x2), 'y*')
    return (a + b) / 2  # 返回最小值所在的位置
#这里我们设置eps为1e-8
x_min = golden_section_search(a,b)
y_min = function(x_min)
print('输入函数最小值点为:{:.5f}\n最小值为{:.5f}'.format(x_min,y_min))

输出结果为

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python黄金分割法可以用于求解函数的极值点。黄金分割法的示例代码如下: ```python # 多项式函数 def f(x): return -x*(350-2*x)*(260 -2*x) # 黄金分割法求极值 def G(a,b,e): a1 = b-0.618*(b-a) a2 = a + 0.618*(b-a) f1,f2 = f(a1),f(a2) while abs(b-a)>e: if f1<f2: b,a2,f2= a2,a1,f1 a1 = b-0.618*(b-a) f1 = f(a1) else: a,a1,f1=a1,a2,f2 a2 = a + 0.618*(b-a) f2 = f(a2) a = (a+b)/2 print("黄金切割法下的极值点为a* = {:.4f}".format(a)) return a if __name__ == '__main__': print("**************输入参数**************") a,b = map(float,input("请输入区间:").split(' ')) e = eval(input("请输入精度:")) print("极值f(a*) = {:.4f}".format(f(G(a,b,e)))) print("************************************") ``` 这段代码使用了黄金分割法来求解多项式函数的极值点。首先定义了函数f(x),然后定义了黄金分割法实现函数G(a,b,e)。函数G的参数a和b是极值点所在的区间的边界,而e是计算精度。在函数G中,通过迭代计算来逼近极值点。最终得到的极值点通过打印输出给出。 黄金分割法是一种搜索极点的优化算法,它通过不断缩小搜索范围来逼近极点。每次迭代,黄金分割法会根据当前的搜索范围计算出两个内部点,然后根据函数值的大小关系来更新搜索范围。通过反复迭代,黄金分割法可以逐渐逼近极点。 在使用黄金分割法时,需要指定搜索范围的初始边界和计算精度。初始边界确定了搜索范围,而计算精度决定了迭代的停止条件。黄金分割法的迭代过程中,会根据函数值的大小关系不断更新搜索范围,直到满足停止条件为止。 黄金分割法是一种简单且有效的优化算法,适用于求解一维函数的极值点。它具有较好的搜索效率和收敛性,常被应用于各种优化问题的求解中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [黄金分割法(Python)](https://blog.csdn.net/weixin_46327567/article/details/114891272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [最优化方法Python计算:一元函数搜索算法——黄金分割法](https://blog.csdn.net/u012958850/article/details/130358684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值