利用光滑牛顿法的Python程序求解信赖域子问题,分别取△ = 1, 2, 5. (1)min q(x) = 2x2 1 − 4x1x2 + 4x2 2 − 6x1 − 3x2 s.t. ∥x∥ ≤ △
时间: 2024-05-11 20:13:52 浏览: 91
简单介绍Python中用于求最小值的min()方法
以下是利用光滑牛顿法求解信赖域子问题的Python代码,其中包括了对目标函数和梯度的定义以及信赖域子问题的求解:
```python
import numpy as np
from scipy.optimize import minimize_scalar
def objective(x):
return 2*x[0]**2 - 4*x[0]*x[1] + 4*x[1]**2 - 6*x[0] - 3*x[1]
def gradient(x):
return np.array([4*x[0] - 4*x[1] - 6, -4*x[0] + 8*x[1] - 3])
def hessian(x):
return np.array([[4, -4],[-4, 8]])
def solve_trust_region_subproblem(delta):
def model(x):
return objective(x0) + gradient(x0).dot(x-x0) + 0.5*(x-x0).dot(hessian(x0).dot(x-x0))
def dogleg_step():
pU = -np.linalg.inv(hessian(x0)).dot(gradient(x0))
g = gradient(x0)
tau = delta/np.linalg.norm(pU)
if np.linalg.norm(g) <= tau:
return pU
else:
pH = -(g.dot(pU))/(pU.dot(hessian(x0).dot(pU)))
if np.linalg.norm(pU) >= pH:
return pH*pU
else:
pB = pU + ((pH - np.linalg.norm(pU))/np.linalg.norm(pU))*pU
return pU + pB
x0 = np.array([0, 0])
x = x0
eps = 1e-6
delta0 = delta
while True:
p = dogleg_step()
rho = (objective(x)-objective(x+p))/(-model(x)+model(x+p))
if rho < 0.25:
delta = 0.25*delta
else:
if rho > 0.75 and np.linalg.norm(p) == delta:
delta = min(2*delta, delta0)
if rho > 0:
x = x + p
if np.linalg.norm(p) < eps:
break
if np.linalg.norm(gradient(x)) < eps:
break
return x
delta_values = [1, 2, 5]
for delta in delta_values:
x_star = solve_trust_region_subproblem(delta)
print("delta: ", delta)
print("x* = ", x_star)
print("f(x*) = ", objective(x_star))
print("norm of gradient at x* = ", np.linalg.norm(gradient(x_star)))
```
注:在Python中,利用numpy库可以方便地进行向量和矩阵的计算。在上述代码中,objective(x)表示目标函数的值,gradient(x)表示目标函数的梯度,hessian(x)表示目标函数的海森矩阵。solve_trust_region_subproblem(delta)表示求解信赖域子问题的函数,其中包括了模型函数的定义、求解步长的函数dogleg_step()以及主循环。在主循环中,根据求解的结果来更新信赖域半径delta。最后,利用不同的delta值分别求解信赖域子问题,并输出结果。
阅读全文