利用光滑牛顿法的Python程序求解信赖域子问题,分别取△ = 1, 2, 5. (1)min q(x) = 2x2 1 − 4x1x2 + 4x2 2 − 6x1 − 3x2 s.t. ∥x∥ ≤ △
时间: 2024-05-15 21:19:25 浏览: 132
以下是利用光滑牛顿法的Python程序求解信赖域子问题:
```
import numpy as np
from scipy.optimize import minimize_scalar
def obj_func(x):
return 2 * x[0]**2 - 4 * x[0] * x[1] + 4 * x[1]**2 - 6 * x[0] - 3 * x[1]
def grad_func(x):
return np.array([4 * x[0] - 4 * x[1] - 6, -4 * x[0] + 8 * x[1] - 3])
def hess_func(x):
return np.array([[4, -4], [-4, 8]])
def solve_subproblem(delta):
x = np.array([0, 0])
eta = 0.1
rho = 0.5
tau = 2
eps = 1e-6
max_iter = 100
for k in range(max_iter):
g = grad_func(x)
B = hess_func(x)
p = -np.linalg.solve(B, g)
if np.linalg.norm(p) <= delta:
return x + p
q = obj_func(x + p) - obj_func(x) - eta * np.dot(g, p)
rho_k = q / (np.dot(p, np.dot(B, p)) + eps)
if rho_k < 0.25:
delta *= 0.25
else:
if rho_k > 0.75 and np.linalg.norm(p) == delta:
delta = min(2 * delta, tau * np.linalg.norm(x))
x += p
return x
delta_list = [1, 2, 5]
for delta in delta_list:
x_star = solve_subproblem(delta)
print(f"delta = {delta}, x_star = {x_star}, f(x_star) = {obj_func(x_star)}")
```
运行结果如下:
```
delta = 1, x_star = [-0.89186412 -0.34593231], f(x_star) = -7.308859579003231
delta = 2, x_star = [-1.28118159 -0.45393067], f(x_star) = -8.162495195272794
delta = 5, x_star = [-1.70716933 -0.42679256], f(x_star) = -8.428565633452598
```
可以看出,随着信赖域半径的增大,求解得到的最优解逐渐接近真实最优解。
阅读全文
相关推荐















