鱼C论坛

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

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

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

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

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

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

x_down = -1
x_up = 1
x_e =0.16

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

f1 = 2*x1**2 - x1 - 1
f2 = 2*x2**2 - x2 - 1

n = 0
# 精度要求
while abs(f1 - f2) > x_e:
    print(f"第{n}次迭代")
    print(f"上限为{round(x_down, 6)}, 下限为{round(x_up, 6)}, 插入的左分点为{round(x1, 6)}, 插入的右分点为{round(x2, 6)}, f1为:{round(f1, 6)}, f2为:{round(f2, 6)}")
    
    if f1 < f2:
        x_up = x2
        x_down = x_down
    if f1 >= f2:
        x_up = x_up
        x_down = x1
    x1 = x_down + 0.382 * (x_up - x_down)
    x2 = x_down + 0.618 * (x_up - x_down)
    f1 = 2*x1**2 - x1 - 1
    f2 = 2*x2**2 - x2 - 1
    n += 1

x = (x1 + x2) / 2
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的差值。修改后的代码如下:


x_down = -1

x_up = 1

x_e = 0.16



x1 = x_down + 0.382 * (x_up - x_down)

x2 = x_down + 0.618 * (x_up - x_down)



f1 = 2*x1**2 - x1 - 1

f2 = 2*x2**2 - x2 - 1



# 计算初始的f1和f2

while abs(x_up - x_down) > x_e:

    if f1 < f2:

        x_up = x2

        x2 = x1

        x1 = x_down + 0.382 * (x_up - x_down)

        f2 = f1

        f1 = 2*x1**2 - x1 - 1

    else:

        x_down = x1

        x1 = x2

        x2 = x_down + 0.618 * (x_up - x_down)

        f1 = f2

        f2 = 2*x2**2 - x2 - 1



x = (x1 + x2) / 2

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的差值。修改后的代码如下:


x_down = -1

x_up = 1

x_e = 0.16



x1 = x_down + 0.382 * (x_up - x_down)

x2 = x_down + 0.618 * (x_up - x_down)



f1 = 2*x1**2 - x1 - 1

f2 = 2*x2**2 - x2 - 1



# 计算初始的f1和f2

while abs(x_up - x_down) > x_e:

    if f1 < f2:

        x_up = x2

        x2 = x1

        x1 = x_down + 0.382 * (x_up - x_down)

        f2 = f1

        f1 = 2*x1**2 - x1 - 1

    else:

        x_down = x1

        x1 = x2

        x2 = x_down + 0.618 * (x_up - x_down)

        f1 = f2

        f2 = 2*x2**2 - x2 - 1



x = (x1 + x2) / 2

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-12-24 08:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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