黄金分割法python实现

目录

1.简介

2.程序设计步骤

3.程序代码

4.测试样例


1.简介

通过采用黄金分割法类似的解题步骤,用python编程实现,做到修改目标函数,输入初始区间[a,b]以及精度要求L,输出黄金分割迭代表和最优解。

2.程序设计步骤

黄金分割(0.618)法的步骤:

  1. 置初始区间[a1,b1]以及精度要求L>0计算λ1=a1+0.382b1-a1μ1=a1+0.618b1-a1,计算fλ1fμ1。令k=1。
  2. bk-ak<L,则停止计算;否则当fλk>fμk时,转是3);当fλk≤fμk时,转4)
  3. ak+1=λkbk+1=bkλk+1=μkμk+1=ak+1+0.618bk+1-ak+1,计算fμk+1,转5)
  4. ak+1=akbk+1=μkμk+1=λkλk+1=ak+1+0.382bk+1-ak+1,计算fλk+1,转5)
  5. 置k=k+1,返回2)

 

3.程序代码

'''
黄金分割(0.618)法
'''
import math
def getinput():
    global L,a,b
    area= list(map(float, input("初始区间为[a,b],用空格键隔开,输入a,b:").split()))
    a=area[0]
    b=area[1]
    L=input("L<=")
    L= float(L)
    while L<=0:
        print("请输入>0的数!")
        L = input("L<=")
        L = float(L)


def fg(x):#定义函数,可以自己更换
    f=math.exp(x)-5*x#样例1函数
    return f
def caculate():
    global b,a,L,sub,k,p,q
    k=1
    sub= b-a
    p = a + 0.382 * (sub)
    q = a + 0.618 * (sub)
    pr()
    while sub>=L:
        if fg(p)>fg(q):
            a=p
            b=b
            sub=b-a
            p=q
            q=a+0.618*(sub)
        else:
            a=a
            b=q
            sub=b-a
            q=p
            p=a+0.382*(sub)
        k+=1
        pr()
    prresult()

def prhead():   #输出表
    print('*'*20)
    print('k\tak\t\tbk\t\tλk\t\tμk\t\tf(λk)\tf(μk)\tb-a')

def pr():#输出表的内容
    print(str(k) + '\t' + str(format(a, '.3f')) + '\t' + str(format(b, '.3f')) + '\t' + str(
        format(p, '.3f')) + '\t' + str(format(q, '.3f')) + '\t' + str(
        format(fg(p), '.3f')) + '\t' + str(format(fg(q), '.3f')) + '\t' + str(format(sub, '.3f')))

def prresult():
    print("最优解x∈[" + str(format(a, '.3f')) + "," + str(format(b, '.3f')) + ']')
    print("x*="+str(format((a+b)/2, '.3f')))

def main():
    getinput()
    prhead()
    caculate()
if __name__ == '__main__':
   main()

4.测试样例

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别管我啦就是说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值