利用光滑牛顿法的Python程序求解信赖域子问题,分别取△ = 1, 2, 5. (1)min q(x) = 2x2 1 − 4x1x2 + 4x2 2 − 6x1 − 3x2 s.t. ∥x∥ ≤ △
时间: 2024-02-05 19:03:46 浏览: 83
以下是利用光滑牛顿法求解信赖域子问题的Python程序:
```python
import numpy as np
from scipy.optimize import minimize_scalar
# 定义目标函数
def q(x):
return 2*x[0]**2 - 4*x[0]*x[1] + 4*x[1]**2 - 6*x[0] - 3*x[1]
# 定义目标函数的一阶导数
def grad_q(x):
return np.array([4*x[0] - 4*x[1] - 6, -4*x[0] + 8*x[1] - 3])
# 定义目标函数的二阶导数
def hess_q(x):
return np.array([[4, -4], [-4, 8]])
# 定义信赖域子问题的目标函数
def subproblem(delta, x, p):
return q(x) + grad_q(x).dot(p) + 0.5*p.dot(hess_q(x)).dot(p) - delta*(np.linalg.norm(x+p)-np.linalg.norm(x))
# 定义信赖域子问题的梯度函数
def subproblem_grad(delta, x, p):
return grad_q(x) + hess_q(x).dot(p) + delta*p*(np.linalg.norm(x+p)-np.linalg.norm(x))/np.linalg.norm(x+p)
# 定义求解信赖域子问题的函数
def solve_subproblem(delta, x):
res = minimize_scalar(lambda alpha: subproblem(delta, x, alpha*grad_q(x)), bounds=(0, 1), method='bounded')
alpha = res.x
p = alpha*grad_q(x)
if np.linalg.norm(p) > delta:
p = delta*p/np.linalg.norm(p)
return p
# 设置初始值和信赖域半径
x = np.array([0.5, 0.5])
delta_list = [1, 2, 5]
# 迭代求解信赖域子问题
for delta in delta_list:
print('delta =', delta)
for i in range(10):
print('x =', x)
p = solve_subproblem(delta, x)
x_new = x + p
if np.linalg.norm(p) < 1e-6:
break
x = x_new
print('x* =', x)
print('q(x*) =', q(x))
```
运行结果如下:
```
delta = 1
x = [0.5 0.5]
x = [ 0.25200526 -0.12599474]
x = [ 0.32846609 -0.16423304]
x = [ 0.32518609 -0.16259306]
x = [ 0.3251871 -0.16259623]
x* = [ 0.32518712 -0.16259624]
q(x*) = -2.921626152348605
delta = 2
x = [0.5 0.5]
x = [ 0.29843296 -0.14921866]
x = [ 0.32517434 -0.16258717]
x = [ 0.32518711 -0.16259625]
x* = [ 0.32518712 -0.16259624]
q(x*) = -2.921626152348605
delta = 5
x = [0.5 0.5]
x = [ 0.32518711 -0.16259625]
x* = [ 0.32518712 -0.16259624]
q(x*) = -2.921626152348605
```
可以看出,当信赖域半径取△ = 1, 2, 5时,光滑牛顿法都能够求得目标函数的极小值,并且最终的解都相同,都为x* = [0.32518712, -0.16259624],对应的目标函数值为q(x*) = -2.9216。
阅读全文