简介
假设优化问题为 f ( x ) f(x) f(x)在 ( − ∞ , + ∞ ) (-\infty,+\infty) (−∞,+∞)的极小值,即 min x ∈ R f ( x ) \min_{x\in \reals}f(x) x∈Rminf(x),则可以采用“成功-失败法”来求解,具体步骤如下:
- 给定初始点 x 0 ∈ R x_0\in \reals x0∈R,搜索步长 h > 0 h>0 h>0,精度 ε > 0 \varepsilon>0 ε>0
- 判断 h h h是否大于 ε \varepsilon ε,若是,计算 x 1 = x 0 + h x_1=x_0+h x1=x0+h和 f ( x 1 ) f(x_1) f(x1);反之,终止程序,输出此时的 x 0 x_0 x0。
- 若 f ( x 1 ) < f ( x 0 ) f(x_1)<f(x_0) f(x1)<f(x0),表示搜索成功,下一次搜索大步前进,用 x 1 x_1 x1替换 x 0 x_0 x0, 2 h 2h 2h代替 h h h,继续进行搜索;反之,表示搜索失败,下次搜索小步后退,用 h = − h / 4 h=-h/4 h=−h/4,返回第二步,继续搜索。
优化问题
优化问题同三次插值法,求 f ( x ) = x 4 − 4 x 3 − 6 x 2 − 16 x + 4 f(x)=x^{4}-4x^{3}-6x^{2}-16x+4 f(x)=x4−4x3−6x2−16x+4的极小值点。设置初始点 x 0 = 6 x_0=6 x0=6,初始计算步长 h = 1 h=1 h=1,收敛精度 ε = 1 e − 3 \varepsilon=1e-3 ε=1e−3,计算程序如下:
def cal_fun_f(x):
"""
函数值计算函数
"""
return x**4-4*x**3-6*x**2-16*x+4
def success_failure_f(x0, h, gap):
"""
采用成功失败法进行一维搜索
:param h: 初始搜索步长
:param x0: 初始点
:param gap: 收敛精度
"""
i = 0
x = x0 # 初始点
while abs(h) > gap:
f_x0 = cal_fun_f(x)
f_x1 = cal_fun_f(x+h)
if f_x1 < f_x0:
x = x+h
h = 2*h
else:
h = -h/4
i += 1
print(f"第{i}次迭代极小值点", x)
if __name__ == "__main__":
success_failure_f(6, 1, 1e-3)
计算结果如下:
第1次迭代极小值点 6
第2次迭代极小值点 5.75
第3次迭代极小值点 5.25
第4次迭代极小值点 4.25
第5次迭代极小值点 4.25
第6次迭代极小值点 4.25
第7次迭代极小值点 4.125
第8次迭代极小值点 3.875
第9次迭代极小值点 3.875
第10次迭代极小值点 4.0
第11次迭代极小值点 4.0
第12次迭代极小值点 4.0
第13次迭代极小值点 4.0
第14次迭代极小值点 4.0