代码实现0.618算法
时间: 2023-10-22 12:22:04 浏览: 82
黄金分割法(Golden Section Search)是一种在区间上寻找极值的优化算法。它通过迭代缩小区间来逐步逼近极值。具体实现如下:
```python
import math
def golden_section_search(f, a, b, tol=1e-6):
golden_ratio = (math.sqrt(5) - 1) / 2
c = b - golden_ratio * (b - a)
d = a + golden_ratio * (b - a)
while abs(c - d) > tol:
if f(c) < f(d):
b = d
else:
a = c
c = b - golden_ratio * (b - a)
d = a + golden_ratio * (b - a)
return (b + a) / 2
```
其中,`f` 是需要优化的函数,`a` 和 `b` 是初始区间,`tol` 是迭代停止的精度。黄金分割点为 `(b - a) * (math.sqrt(5) - 1) / 2`,这里用 `golden_ratio` 表示。
在每一次迭代中,我们根据函数值在 `c` 和 `d` 处的大小关系来缩小区间。如果 `f(c) < f(d)`,则极值在左半边,将右端点更新为 `d`;否则,极值在右半边,将左端点更新为 `c`。然后,我们通过黄金分割点更新 `c` 和 `d`,并重复上述过程,直到区间长度小于 `tol`。
下面是一个例子,我们将函数 $f(x) = x^3 - 2x^2 + 4x - 5$ 在区间 $[1, 3]$ 上进行优化:
```python
def f(x):
return x**3 - 2*x**2 + 4*x - 5
x_min = golden_section_search(f, 1, 3)
print('x_min:', x_min)
print('f(x_min):', f(x_min))
```
输出:
```
x_min: 1.333332350553611
f(x_min): -4.3703634270351145
```
因此,函数 $f(x)$ 在 $[1, 3]$ 上的极小值为约 $-4.3703634270351145$,取到的 $x$ 值为约 $1.333332350553611$。
阅读全文