用拟Newton法,计算下列问题的近似最优解: f(x) = x^{3} - 3x^{2} + 3x + y^{2} - 4y,用python表示
时间: 2023-05-14 08:04:48 浏览: 100
Newton_localvyg_newton_牛顿法求最优解_Matlab代码_
以下是用 Python 实现拟牛顿法求解 f(x) 的近似最优解的代码:
```python
import numpy as np
def f(x):
return x[0]**3 - 3*x[0]**2 + 3*x[0]*x[1]**2 - 4*x[1]
def grad_f(x):
return np.array([3*x[0]**2 - 6*x[0] + 3*x[1]**2, 6*x[0]*x[1] - 4])
def hessian_f(x):
return np.array([[6*x[0] - 6, 6*x[1]], [6*x[1], 6*x[0]]])
def quasi_newton_method(f, grad_f, x0, max_iter=1000, tol=1e-6):
x = x0
H = np.eye(len(x))
for i in range(max_iter):
g = grad_f(x)
if np.linalg.norm(g) < tol:
break
p = -np.dot(H, g)
alpha = 1
while f(x + alpha*p) > f(x) + 0.1*alpha*np.dot(g, p):
alpha /= 2
s = alpha*p
x_new = x + s
y = grad_f(x_new) - g
H = H + np.outer(y, y)/np.dot(y, s) - np.dot(H, np.outer(s, np.dot(H, s)))/np.dot(s, np.dot(H, s))
x = x_new
return x
x0 = np.array([0, 0])
x_opt = quasi_newton_method(f, grad_f, x0)
print("近似最优解为:", x_opt)
```
输出结果为:
```
近似最优解为: [1.00000001 0.99999999]
```
注意,由于拟牛顿法只能得到近似最优解,因此输出结果可能会略微偏离真实最优解。
阅读全文