问题描述
1.项目功能
运用0.618法(近似黄金分割法)、Fibonacci法(斐波那契法),根据已知条件,来解决一维搜索问题(线性搜索问题),求得函数最优值。
2.运用算法原理
0.618法(近似黄金分割法);
Fibonacci法(斐波那契法);
二.详细设计
1、0.618法(近似黄金分割法)
2、Fibonacci法(斐波那契法)
三.源程序
1、0.618法(近似黄金分割法)
def gold(x):
y=2*x**2-x-1
return y
min = float(input("请输入下限"))
max = float(input("请输入上限"))
ans = float(input('请输入精确度'))
a = min + 0.618*(max - min)
b = min + 0.382*(max - min)
q = gold(a)
w = gold(b)
i = 0
while i < 10:
print("i=%s" % i)
print("min=%s,max=%s" % (min, max))
print("x下限=%s,x上限=%s" % (a, b))
print("y上限=%s,y上限=%s" % (w, q))
c = max - min
if c > ans:
i = i + 1
if q > w:
max = a
a = b
b = min + 0.382*(max - min)
q = w
w = gold(b)
else:#q
min = b
b = a
a = min + 0.618 * (max - min)
w = q
q = gold(a)
else:
break
2、Fibonacci法(斐波那契法)
def fibonacci(n):
i=0
a = -1
b = 3
for i in range(n):
i=i+1
c = a+b
a = b
b = c
return c
def bn(x):
ert = x**2 - x + 2
return ert
z = 2
p = 0
left = 0.00000
right = 10.00000
L1 = right - left
while z < 100:
m = fibonacci(z)
l = L1/m
k = 1.000/m
if k < 0.03:
print("n=%s,Fn=%s"%(z,m))
L2 = l*fibonacci(z-1)
t = left + L2
r = right -L2
while p < 3:
p = p + 1
l3 = t - r
e= bn(t)
o = bn(r)
if e>o :
right = t
t = r
r = left + l3
else:#o>e
left = r
r = t
t = right - l3
break
else:
z = z + 1
min=(left+right)/2
max=bn(min)
print(left)
print(right)
print("极小值x=",min)
print("极小值y=",max)
四.运行结果
1、0.618法(近似黄金分割法)
2、Fibonacci法(斐波那契法)
五.结论与总结
1、问题与解决
(1)在开始的时候,完全没有思路,在各种语言中不断切换,还尝试使用了matlab,最后在尝试中选择了较为熟悉的python.
(2)在两个一维搜索的代码中,都出现了对于循环嵌套的问题,导致迭代中断,最后通过网络查找学习相关知识后解决。
(3)在黄金分割法的时候,出现多次未迭代到最优解便停止的现象,最后严格对照课本,发现是判定条件不完全,导致的迭代失败,增加判定条件后解决
(4)在代码都正确后,又出现了运算结果与人工计算结果有极小的偏差的现象,经过分析,发现是因为人工计算的过程中便对某些数据进行了四舍五入,而计算机只会在最后一步进行四舍五入,所以导致了这极小的偏差。
2、心得体会
本次为期一周的课程设计,让我对最优化又有了新的认识与了解,之前都是学习课本知识,通过人工计算来解决问题,而与计算机结合后我发现可以更加迅速以及便捷的解决最优化问题,为生活带来了极大的便利。而本次我选择的精确一维搜索方法课题中,让我对黄金分割法和斐波那契额数列法有了更加深刻的认识,巩固了一遍知识,同时也学习到了更多的内容,以后在遇到相关问题的时候就可以直接使用计算机来解决问题,同时也对于这两个程序的代码更加熟悉,从中也可以举一反三,学习经验,以后在实现其他最优化方法的时候会更加的顺畅。
总的来说,本次课设我收获了许多专业性的知识,同时也让我的计算机水平有所提高,对我来收收获十足,同时也感到十分不易,在西安疫情如此严重的时候,我们还能完成线上课程,这也使得这次课设的意义非凡。