牛顿法解决无约束优化求解代码
时间: 2023-06-21 18:07:12 浏览: 99
以下是用Python实现的牛顿法求解无约束优化问题的代码:
```python
import numpy as np
# 定义目标函数及其一阶、二阶导数
def f(x):
return x[0]**2 + x[1]**2
def grad_f(x):
return np.array([2*x[0], 2*x[1]])
def hess_f(x):
return np.array([[2, 0], [0, 2]])
# 定义牛顿法函数
def newton_method(x0, tol=1e-6, max_iter=100):
x = x0
for i in range(max_iter):
grad = grad_f(x)
hess = hess_f(x)
# 判断是否达到精度要求
if np.linalg.norm(grad) < tol:
break
# 计算搜索方向
p = np.linalg.solve(hess, -grad)
# 更新x
x = x + p
return x
# 测试
x0 = np.array([1., 1.])
x_opt = newton_method(x0)
print("最优解为:", x_opt)
print("最优值为:", f(x_opt))
```
在上述代码中,我们定义了目标函数$f(x)=x_1^2+x_2^2$,一阶导数$g(x)=\begin{bmatrix}2x_1 \\ 2x_2\end{bmatrix}$,二阶导数$H(x)=\begin{bmatrix}2 & 0 \\ 0 & 2\end{bmatrix}$。然后,我们实现了牛顿法函数`newton_method()`,其中使用`np.linalg.solve()`函数求解线性方程组。最后,我们使用初始点$x_0=[1,1]$进行测试,并输出最优解及最优值。
需要注意的是,牛顿法只有在目标函数是凸函数且Hessian矩阵正定时才能保证收敛到全局最优解。如果Hessian矩阵不正定,可以使用拟牛顿法等其他优化算法。
阅读全文