"""
Vectores-27-Denso-Gradiente-AULA-G-86-SEP.py
Ejecutado bajo consola Linux.
Ubuntu 20.04.6 LTS.
Deben estar instalados los módulos:
-----------------------------------
python3 Vectores-27-Denso-Gradiente-AULA-G-86-SEP.py.
numpy, y matplotlib.
También se puede ejecutar con Google Colab.
"""
import numpy as np
import matplotlib.pyplot as plt
# Definir la función cuadrática de ejemplo
def funcion_cuadratica(x, y, z):
return x**2 + y**2 + z**2
# Inicializar el punto de inicio y la tasa de aprendizaje
inicio = np.array([3.0, -2.0, 4.0])
tasa_aprendizaje = 0.1
n_iteraciones = 50
# Listas para almacenar el historial de puntos y valores de la función
historial_puntos = [inicio]
historial_valores = [funcion_cuadratica(*inicio)]
# Descenso de gradiente
for i in range(n_iteraciones):
# Calcular el gradiente de la función en el punto actual
gradiente = np.array([2 * inicio[0], 2 * inicio[1], 2 * inicio[2]])
# Actualizar el punto utilizando el descenso de gradiente
inicio = inicio - tasa_aprendizaje * gradiente
# Calcular el valor de la función en el nuevo punto
valor = funcion_cuadratica(*inicio)
# Registrar el punto y el valor en el historial
historial_puntos.append(inicio)
historial_valores.append(valor)
# Convertir las listas en arreglos numpy para facilitar la manipulación
historial_puntos = np.array(historial_puntos)
historial_valores = np.array(historial_valores)
# Graficar la función y el descenso de gradiente
fig = plt.figure(figsize=(12, 6))
# Superficie de la función
ax1 = fig.add_subplot(121, projection='3d')
x = np.linspace(-4, 4, 100)
y = np.linspace(-4, 4, 100)
X, Y = np.meshgrid(x, y)
Z = funcion_cuadratica(X, Y, 0)
ax1.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.set_zlabel('Valor de la Función')
ax1.set_title('Superficie de la Función Cuadrática')
# Descenso de gradiente
ax2 = fig.add_subplot(122, projection='3d')
ax2.plot(historial_puntos[:, 0], historial_puntos[:, 1], historial_valores, marker='o', linestyle='-', color='r')
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('Valor de la Función')
ax2.set_title('Descenso de Gradiente')
plt.show()