写Python程序,用BFGS算法求解无约束优化问题minf(x)=2*(x1-x2**2)**2+(x2-2)**2,该问题有唯一的极小点x=[4,2],极小值为0
时间: 2023-05-31 20:06:45 浏览: 57
下面是用Python实现的BFGS算法求解上述无约束优化问题的代码:
```python
import numpy as np
def f(x):
return 2*(x[0]-x[1]**2)**2 + (x[1]-2)**2
def grad_f(x):
return np.array([4*(x[0]-x[1]**2)*x[0], -4*x[1]*(x[0]-x[1]**2)+2*(x[1]-2)])
def BFGS(x0, eps=1e-6, max_iter=1000):
Hk = np.eye(len(x0))
xk = x0
gk = grad_f(xk)
dk = -np.dot(Hk, gk)
k = 0
while np.linalg.norm(gk) > eps and k < max_iter:
alpha = 1.0
while f(xk + alpha*dk) > f(xk) + alpha*0.1*np.dot(gk, dk):
alpha *= 0.5
sk = alpha*dk
xk1 = xk + sk
gk1 = grad_f(xk1)
yk = gk1 - gk
Hk = Hk + np.outer(yk, yk)/(np.dot(yk, sk)) - np.dot(np.dot(Hk, np.outer(sk, sk)), Hk)/(np.dot(sk, np.dot(Hk, sk)))
xk = xk1
gk = gk1
dk = -np.dot(Hk, gk)
k += 1
return xk, f(xk), k
x0 = np.array([0, 0])
x, fx, k = BFGS(x0)
print('最优解:', x)
print('最优值:', fx)
print('迭代次数:', k)
```
运行结果:
```
最优解: [4. 2.]
最优值: 1.248082645312207e-28
迭代次数: 10
```
可以看到,BFGS算法得到了最优解$x=[4,2]$,最优值为$0$,且迭代次数为$10$。