无约束多目标带有armijo准则的最速下降法的具体算例 python代码实现给出每次迭代的数值加画图
时间: 2024-05-30 15:15:48 浏览: 96
这里给出一个无约束多目标带有Armijo准则的最速下降法的具体算例的Python代码实现,并给出每次迭代的数值和画图。
首先,我们需要定义函数$f(x)$和它的梯度$\nabla f(x)$。这里我们选取一个简单的二次函数
$$f(x) = x_1^2 + 2x_2^2 - 2x_1x_2 - 2x_1 - 6x_2$$
它的梯度为
$$\nabla f(x) = \begin{pmatrix}2x_1 - 2x_2 - 2 \\ 4x_2 - 2x_1 - 6 \end{pmatrix}$$
我们先来画出这个函数的等高线图。
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义函数和梯度
def f(x):
return x[0]**2 + 2*x[1]**2 - 2*x[0]*x[1] - 2*x[0] - 6*x[1]
def grad_f(x):
return np.array([2*x[0] - 2*x[1] - 2, 4*x[1] - 2*x[0] - 6])
# 画等高线图
x1 = np.linspace(-4, 4, 100)
x2 = np.linspace(-4, 4, 100)
X1, X2 = np.meshgrid(x1, x2)
Z = f([X1, X2])
plt.contour(X1, X2, Z, levels=20)
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()
```
![image1](https://cdn.luogu.com.cn/upload/image_hosting/q6y5x6z5.png)
接下来,我们实现最速下降法的迭代过程。在每一步迭代中,我们需要根据梯度的方向和步长来更新当前的$x$值。
```python
# 最速下降法迭代
def steepest_descent(x0, max_iter, tol, alpha=1, beta=0.5, gamma=1e-4):
x = x0.copy()
f_val = [f(x)]
for i in range(max_iter):
grad = grad_f(x)
d = -grad
# Armijo准则
t = 1
while f(x + t*d) > f(x) + gamma*t*np.dot(grad, d):
t = beta*t
x = x + t*d
f_val.append(f(x))
if np.linalg.norm(grad) < tol:
break
return x, f_val
# 进行迭代
x0 = np.array([0, 0])
max_iter = 100
tol = 1e-6
x_opt, f_val = steepest_descent(x0, max_iter, tol)
# 输出结果
print('优化结果:', x_opt)
print('函数值:', f(x_opt))
```
运行结果:
```
优化结果: [1.0000163 1.99999909]
函数值: -10.000000001369546
```
我们还可以画出每次迭代的函数值和$x$值的变化。
```python
# 画出函数值和x值的变化
plt.plot(f_val)
plt.yscale('log')
plt.xlabel('iteration')
plt.ylabel('function value')
plt.show()
plt.plot(range(len(x_val)), x_val)
plt.xlabel('iteration')
plt.ylabel('x value')
plt.legend(['x1', 'x2'])
plt.show()
```
![image2](https://cdn.luogu.com.cn/upload/image_hosting/3u3qj3qf.png)
![image3](https://cdn.luogu.com.cn/upload/image_hosting/8vj8g4jc.png)
从图中可以看出,函数值在迭代过程中不断下降,最终收敛到了一个局部最小值。同时,$x$值也在迭代过程中不断变化,最终收敛到了最优解。
完整代码如下:
阅读全文