格拉布斯法python
时间: 2023-10-13 14:05:57 浏览: 69
格拉布斯法是一种基于梯度下降的优化算法,用于解决无约束优化问题。其主要思想是在每一步迭代中,通过计算目标函数的一阶和二阶导数来确定下降方向和步长。
下面是一个简单的Python实现:
```python
import numpy as np
def gradient_descent(f, df, x0, alpha=0.1, max_iter=1000, tol=1e-6):
"""
格拉布斯法求解无约束优化问题
:param f: 目标函数
:param df: 目标函数的一阶导数
:param x0: 初始点
:param alpha: 步长
:param max_iter: 最大迭代次数
:param tol: 收敛精度
:return: 最优解和最优值
"""
x = x0
for i in range(max_iter):
g = df(x)
H = np.diag(np.array([df(lambda y: g[j](y))[j](x) for j in range(len(x))]))
d = -np.linalg.solve(H, g)
x_new = x + alpha * d
if np.linalg.norm(x_new - x) < tol:
break
x = x_new
return x, f(x)
# 示例:求解 Rosenbrock 函数的最小值
f = lambda x: 100 * (x[1] - x[0] ** 2) ** 2 + (1 - x[0]) ** 2
df = lambda x: [400 * x[0] ** 3 - 400 * x[0] * x[1] + 2 * x[0] - 2, 200 * (x[1] - x[0] ** 2)]
x0 = np.array([0, 0])
x_min, f_min = gradient_descent(f, df, x0)
print("最优解为:", x_min)
print("最优值为:", f_min)
```
上述代码通过 `gradient_descent` 函数实现了格拉布斯法的迭代过程,其中 `f` 和 `df` 分别为目标函数和一阶导数,`x0` 是初始点,`alpha` 是步长,`max_iter` 是最大迭代次数,`tol` 是收敛精度。在迭代过程中,计算目标函数的一阶导数和二阶导数,并求解线性方程组,得到下降方向和步长,更新当前点直到满足收敛精度或达到最大迭代次数为止。最终返回最优解和最优值。