ex337.py
import numpy as np
import matplotlib.pyplot as plt
def get_next_point(a0, b0, gamma):
# Get the next point $(a_1, b_1)$ starting from the current point $(a_0,b_0)$
# using exact line search. The close-form of $t_{exact}$ is
# $\dfrac{a_0^2+\gamma^2 b_0^2}{a_0^2+\gamma^3 b_0^2}$.
r = gamma
t = (a0**2 + r**2 * b0**2) / (a0**2 + r**3 * b0**2)
a1 = (1 - t)*a0
b1 = (1 - t*r)*b0
return a1, b1
def plot_quadratic_convergence():
# plot the convergence of $x$ during the minimization on a quadratic
# objective function $f(x_1, x_2)=\frac{1}{2}(x_1^2+\gamma x_2^2)$,
# where $\gamma=10$, starting from $x_0=(\gamma, 3)$
gamma = 10
a0 = gamma
b0 = 3
num_iteration = 100
x = np.zeros((num_iteration, 1))
y = np.zeros((num_iteration, 1))
for iteration in range(num_iteration):
print("({}, {})".format(a0, b0))
x[iteration] = a0
y[iteration] = b0
a1, b1 = get_next_point(a0, b0, gamma)
a0, b0 = a1, b1
fig, ax = plt.subplots()
ax.set_xlim([-gamma * 1, gamma * 1])
ax.set_ylim([-1 * 4, 1 * 4])
ax.plot(x, y, marker="o",markerfacecolor='red',
markeredgecolor='red',
markeredgewidth=2)
delta = gamma * 1.0 / 100
x = np.arange(-gamma * 1, gamma * 1, delta)
y = np.arange(-4.0, 4.0, delta)
X, Y = np.meshgrid(x, y)
Z = 0.5 * (X ** 2 + gamma * Y ** 2)
levels = np.exp(np.arange(-2, 10, 0.25))
CS = ax.contour(X, Y, Z, levels=levels, vmin=0,vmax=100)
ax.set_aspect(aspect='2')
ax.clabel(CS, fontsize=6, inline=True)
ax.set_xlabel(r'$x_1$')
ax.set_ylabel(r'$x_2$')
ax.set_title(r'$f(x)=\frac{1}{2}\left(x_1^2+\gamma x_2^2\right),\gamma=10,x^{0}=(\gamma, 3)$')
plt.savefig('ex337.png', dpi=100)
plt.show()
if __name__ == "__main__":
plot_quadratic_convergence()
Last Updated on 2023-01-15 by gantovnik

Recent Comments