最优化

最优化

0.618法求极小值

  • 过程
  • 代码

过程

(黄金分割法)0.618法求极小点。
给:f(x),范围[a,b],精度ε(无,则默认为0)
过程①
x1 = b - 0.618 * (b - a)
x2 = a + 0.618 * (b - a)
过程②
当f(x1) < f(x2)时, b = x2, a不变,再求x1,x2。
当f (x1) > f(x2)时, a = x1, b不变,再求x1,x2。
过程③
当|b - a| < ε时,最优解 x* = (b + a) / 2;
例:过程②

代码

import sympy
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
x=sympy.Symbol('x')
a=sympy.Symbol('a')
b=sympy.Symbol('b')
f=(x)**2-3*x+5 #主函数
epsi=0.05 #精度
r=0.618   #乘子:0.618
xb=b-r*(b-a)
xa=a+r*(b-a)
def accucy(a1,b1):lx1 = []ly1 = []lx2 = []ly2 = []x1=xb.evalf(subs={b:b1,a:a1})x2=xa.evalf(subs={b:b1,a:a1})for i in range(1000): #主要的求解过程,默认为1000次循环,不可能无限循环fx1=f.evalf(subs={x:x1})fx2=f.evalf(subs={x:x2})lx1.append(x1)ly1.append(fx1)lx2.append(x2)ly2.append(fx2)print(a1,b1)if (b1-a1)<epsi:print((b1+a1)/2)breakif fx1>fx2:a1=x1x1=x2x2=xa.evalf(subs={b:b1,a:a1})else:b1=x2x2=x1x1=xb.evalf(subs={b:b1,a:a1})lx=lx1+lx2[:0:-1]ly=ly1+ly2[:0:-1]plt.plot(lx, ly, marker='o', color="red", label="0.168法")
def Graph():ly=[]lx=[]for i in np.arange(1,2,0.05):dk=f.evalf(subs={x:i})ly.append(dk)lx.append(i)print(i,dk)plt.plot(lx, ly, marker="o", color="blue",label="f函数")
accucy(1,2) #a,b范围:[1,2]
Graph()
plt.legend()
plt.show()

发布者:admin,转转请注明出处:http://www.yc00.com/news/1692516358a603281.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信