对以下最优化问题min f(x)=10x1的平方+50x2的平方+x1x2-7x1-4x2+32 选取初始点x0=[0,0],终止准则为||f(xk+1)-f(xk)||<=ε=10的-2次方,用Python编写最速下降法求解该问题,并绘制迭代轨迹图(在等高线图中画出迭代序列
时间: 2024-09-15 13:13:24 浏览: 116
用拉格朗日乘子法求解最优化程序.docx
5星 · 资源好评率100%
这是一个二维的最优化问题,我们要使用梯度下降法来寻找函数 \( f(x) = 10x_1^2 + 50x_2^2 + x_1x_2 - 7x_1 - 4x_2 + 32 \) 的最小值。初始点设为 \( x_0 = [0, 0] \),终止准则设定为函数差值绝对值小于 \( \epsilon = 10^{-2} \)。
以下是使用 Python 和 `scipy` 库实现最速下降法以及绘制迭代轨迹图的步骤:
```python
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 定义目标函数
def objective_function(x):
return 10 * x[0]**2 + 50 * x[1]**2 + x[0]*x[1] - 7*x[0] - 4*x[1] + 32
# 初始点
x0 = np.array([0, 0])
# 梯度下降函数
def gradient_descent(f, x0, epsilon, max_iter=1000):
x_k = x0
for _ in range(max_iter):
grad = np.gradient(f, x_k)
x_k -= 0.01 * grad # 使用步长 0.01 进行更新
if np.linalg.norm(f(x_k) - f(x_k - 0.01 * grad)) <= epsilon:
break
return x_k, x_k - x0
# 计算并记录迭代过程中的函数值和坐标
iterations = []
function_values = []
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x, y)
Z = objective_function(np.column_stack((X.ravel(), Y.ravel())))
for i in range(len(X)):
for j in range(len(Y)):
function_values.append(objective_function([X[i, j], Y[i, j]]))
iterations.append([[X[i, j], Y[i, j]], objective_function([X[i, j], Y[i, j]])])
# 只计算了网格点的坐标,实际轨迹可以更密集
if len(iterations) > 100:
break
# 绘制等高线图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(X, Y, Z, linewidth=0.2, antialiased=True)
ax.scatter(*zip(*iterations), c='r', marker='o') # 绘制迭代轨迹
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('f(x)')
plt.title('最速下降法迭代轨迹及等高线图')
# 绘制迭代函数值变化
plt.figure()
plt.plot(range(len(function_values)), function_values, label='函数值')
plt.xlabel('迭代次数')
plt.ylabel('f(x)')
plt.grid(True)
plt.legend()
plt.title('最速下降法迭代函数值')
plt.show()
阅读全文