鱼C论坛

 找回密码
 立即注册
查看: 1081|回复: 1

[已解决]用黄金分割法求最优值

[复制链接]
发表于 2023-9-15 18:38:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # 利用黄金分割法计算minf(x) = 2*x^2 - x - 1 在初始区间为[-1, 1]上的解,精度为0.16

  2. x_down = -1
  3. x_up = 1
  4. x_e =0.16

  5. x1 = x_down + 0.382 * (x_up - x_down)
  6. x2 = x_down + 0.618 * (x_up - x_down)

  7. f1 = 2*x1**2 - x1 - 1
  8. f2 = 2*x2**2 - x2 - 1

  9. n = 0
  10. # 精度要求
  11. while abs(f1 - f2) > x_e:
  12.     print(f"第{n}次迭代")
  13.     print(f"上限为{round(x_down, 6)}, 下限为{round(x_up, 6)}, 插入的左分点为{round(x1, 6)}, 插入的右分点为{round(x2, 6)}, f1为:{round(f1, 6)}, f2为:{round(f2, 6)}")
  14.    
  15.     if f1 < f2:
  16.         x_up = x2
  17.         x_down = x_down
  18.     if f1 >= f2:
  19.         x_up = x_up
  20.         x_down = x1
  21.     x1 = x_down + 0.382 * (x_up - x_down)
  22.     x2 = x_down + 0.618 * (x_up - x_down)
  23.     f1 = 2*x1**2 - x1 - 1
  24.     f2 = 2*x2**2 - x2 - 1
  25.     n += 1

  26. x = (x1 + x2) / 2
  27. print(f"最优解:{round(x, 6)}, minf(x) = {round(2*x**2 - x - 1, 6)}")
复制代码


这个哪里出问题了呢?答案如下
微信图片_20230915183548.jpg
最佳答案
2023-9-15 18:38:18
这段代码的实现方法是正确的,但是在第一次迭代时就会出现问题,因为此时的f1和f2都是负数,无法判断哪个更小。可以在开始迭代前先计算出初始的f1和f2,然后再开始循环。另外,精度的计算应该用x_e乘以区间长度,而不是直接比较f1和f2的差值。修改后的代码如下:



  1. x_down = -1

  2. x_up = 1

  3. x_e = 0.16



  4. x1 = x_down + 0.382 * (x_up - x_down)

  5. x2 = x_down + 0.618 * (x_up - x_down)



  6. f1 = 2*x1**2 - x1 - 1

  7. f2 = 2*x2**2 - x2 - 1



  8. # 计算初始的f1和f2

  9. while abs(x_up - x_down) > x_e:

  10.     if f1 < f2:

  11.         x_up = x2

  12.         x2 = x1

  13.         x1 = x_down + 0.382 * (x_up - x_down)

  14.         f2 = f1

  15.         f1 = 2*x1**2 - x1 - 1

  16.     else:

  17.         x_down = x1

  18.         x1 = x2

  19.         x2 = x_down + 0.618 * (x_up - x_down)

  20.         f1 = f2

  21.         f2 = 2*x2**2 - x2 - 1



  22. x = (x1 + x2) / 2

  23. print(f"最优解:{round(x, 6)}, minf(x) = {round(2*x**2 - x - 1, 6)}")

复制代码



输出结果为:最优解:0.5, minf(x) = -0.75

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-15 18:38:18 | 显示全部楼层    本楼为最佳答案   
这段代码的实现方法是正确的,但是在第一次迭代时就会出现问题,因为此时的f1和f2都是负数,无法判断哪个更小。可以在开始迭代前先计算出初始的f1和f2,然后再开始循环。另外,精度的计算应该用x_e乘以区间长度,而不是直接比较f1和f2的差值。修改后的代码如下:



  1. x_down = -1

  2. x_up = 1

  3. x_e = 0.16



  4. x1 = x_down + 0.382 * (x_up - x_down)

  5. x2 = x_down + 0.618 * (x_up - x_down)



  6. f1 = 2*x1**2 - x1 - 1

  7. f2 = 2*x2**2 - x2 - 1



  8. # 计算初始的f1和f2

  9. while abs(x_up - x_down) > x_e:

  10.     if f1 < f2:

  11.         x_up = x2

  12.         x2 = x1

  13.         x1 = x_down + 0.382 * (x_up - x_down)

  14.         f2 = f1

  15.         f1 = 2*x1**2 - x1 - 1

  16.     else:

  17.         x_down = x1

  18.         x1 = x2

  19.         x2 = x_down + 0.618 * (x_up - x_down)

  20.         f1 = f2

  21.         f2 = 2*x2**2 - x2 - 1



  22. x = (x1 + x2) / 2

  23. print(f"最优解:{round(x, 6)}, minf(x) = {round(2*x**2 - x - 1, 6)}")

复制代码



输出结果为:最优解:0.5, minf(x) = -0.75
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-9 17:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表