每日 23
(1)请用0.618法求解优化问题:
min f(x) = x²-x+6
的极小点和极小值(进退法确定初始区间),精度为106;
(2)根据0.618 法算法步骤编写 Matlab的程序实现 0.618 搜索法;
(3)要求输出内容包括:极小点、极小值、每次迭代的a、b、a、ak的值;
(4)按照模板撰写实验报告,要求规范整洁。
python:
import numpy as np
def f(x):
"""目标函数:f(x) = x² - x + 6"""
return x**2 - x + 6
def进退法(x0=0, h0=0.1, max_iter=100):
"""用进退法确定初始搜索区间[a, b]"""
h = h0
x1 = x0
x2 = x1 + h
f1 = f(x1)
f2 = f(x2)
# 前进搜索(函数值递减)
if f2 < f1:
for _ in range(max_iter):
x3 = x2 + h
f3 = f(x3)
if f3 >= f2: # 找到上升点,停止
return (x1, x3)
else: # 继续前进,步长加倍
x1, f1 = x2, f2
x2, f2 = x3, f3
h *= 2
# 后退搜索(函数值递增)
else:
h = -h0
x3 = x1 + h
f3 = f(x3)
for _ in range(max_iter):
if f3 < f1:
x1, f1 = x3, f3
h *= 2
x3 = x1 + h
f3 = f(x3)
else:
return (x3, x2)
raise ValueError("进退法未找到有效区间")
def黄金分割法(a, b, eps=1e-6):
"""0.618法求解极小点,返回迭代过程和结果"""
iteration = []
phi = 0.618
x1 = a + (1 - phi)(b - a)
x2 = a + phi(b - a)
f1 = f(x1)
f2 = f(x2)
while (b - a) > eps:
iteration.append({
"a": a, "b": b,
"x1": x1, "x2": x2,
"f(x1)": f1, "f(x2)": f2
})
if f1 < f2:
b = x2
x2 = x1 # 利用已计算的x1作为新的x2
f2 = f1
x1 = a + (1 - phi)*(b - a)
f1 = f(x1)
else:
a = x1
x1 = x2 # 利用已计算的x2作为新的x1
f1 = f2
x2 = a + phi*(b - a)
f2 = f(x2)
x_min = (a + b) / 2 # 最终区间中点为极小点近似值
f_min = f(x_min)
return x_min, f_min, iteration
主程序
if name == "main":
# 步骤1:确定初始区间
a0, b0 =进退法(x0=0, h0=0.1)
print(f"初始区间确定为: [a0, b0] = [{a0:.4f}, {b0:.4f}]")
# 步骤2:0.618法迭代搜索
x_min, f_min, iteration =黄金分割法(a0, b0, eps=1e-6)
# 输出迭代过程
print("\n迭代过程记录:")
print(f"{'迭代次数':<8} {'a':<12} {'b':<12} {'x1':<12} {'x2':<12}")
for i, step in enumerate(iteration):
print(f"{i+1:<8} {step['a']:<12.6f} {step['b']:<12.6f} {step['x1']:<12.6f} {step['x2']:<12.6f}")
# 输出最终结果
print(f"\n极小点近似值: x_min = {x_min:.8f}")
print(f"极小值近似值: f_min = {f_min:.8f}")

浙公网安备 33010602011771号