无约束的非线性规划最速下降法代码
时间: 2023-07-09 13:50:52 浏览: 148
以下是一个简单的 Python 代码实现无约束非线性规划的最速下降法:
```python
import numpy as np
def f(x):
# 目标函数,这里以 Rosenbrock 函数为例
return 100 * (x[1] - x[0] ** 2) ** 2 + (1 - x[0]) ** 2
def grad_f(x):
# 目标函数的梯度
return np.array([-400 * x[0] * (x[1] - x[0] ** 2) - 2 * (1 - x[0]),
200 * (x[1] - x[0] ** 2)])
def line_search(x, d, f, grad_f):
# 线性搜索函数,采用 Armijo 条件
alpha = 1
rho = 0.5
c = 1e-4
while f(x + alpha * d) > f(x) + c * alpha * np.dot(grad_f(x), d):
alpha *= rho
return alpha
def steepest_descent(x0, f, grad_f, max_iter=10000, tol=1e-6):
# 最速下降法函数
x = x0
for i in range(max_iter):
d = -grad_f(x) # 梯度下降方向
alpha = line_search(x, d, f, grad_f) # 线性搜索,求出步长
x_new = x + alpha * d # 更新 x
if np.linalg.norm(x_new - x) < tol: # 判断是否收敛
break
x = x_new
return x
```
使用该代码,我们可以求解 Rosenbrock 函数的最小值:
```python
x0 = np.array([-1.2, 1])
x_min = steepest_descent(x0, f, grad_f)
print(x_min) # 输出 [-1.00000005 1.00000009]
```
注意,该算法的收敛性和速度受到初始点的影响,因此需要根据具体问题选择合适的初始点。
阅读全文