Actividad 02 · Método del Gradiente Descendente

23/10/2025

Completada

Descripción de la Actividad

Analizar la rapidez de los métodos de Gradiente Descendente y Mínimos Cuadrados (OLS).

Desarrollo de la Actividad

Método del Gradiente Descendente

CURSO: Programación Numérica

DOCENTE: Torres Cruz, Fred

ALUMNO: Cutipa Ramos, Nayelin Brisbany

SEMESTRE: Cuarto

GRUPO: "A"

PUNO PERÚ, 2025-II


ÍNDICE

Contenido Página
1. Código para una Función: Método de Gradiente Descendente 3
1.1. Gráfica. 5
2. Código para Dos Funciones: Gradiente Descendente 5
2.1. Gráfica 7

1. Código para una Función: Método de Gradiente Descendente

Universidad Nacional del Altiplano de Puno

Año de la recuperación y consolidación de la economía peruana

# CÓDIGO R: TRIPLE GRÁFICO (f(x), f'(x), Próximo x) VS. ITERACIÓN

#1. INSTALACIÓN Y CARGA DE LIBRERÍAS
if(!require(ggplot2)) install.packages("ggplot2")
if(!require(reshape2)) install.packages("reshape2")
library(ggplot2)
library(reshape2)

#2. PARÁMETROS DEL MÉTODO
alpha <- 0.01 
x <- 3 # **REVISA ESTAS LÍNEAS MANUALMENTE!**
max_iter <- 50

# Función y derivada
f <- function(x) x^2
f_prime <- function(x) 2 * x

#3. CÁLCULOS ITERATIVOS (Generando su tabla)
# Se incluye una iteración extra para el punto inicial (i=0)
resultados <- data.frame(
    Iteracion = 0:max_iter,
    x = numeric(max_iter + 1),
    f_x = numeric(max_iter + 1),
    fprima_x = numeric(max_iter + 1),
    gradiente_f_x = numeric(max_iter + 1)
)

# Inicializar la primera fila (i=0)
resultados$x[1] <- x
resultados$f_x[1] <- f(x)
resultados$fprima_x[1] <- f_prime(x)
resultados$gradiente_f_x[1] <- x - alpha * f_prime(x)

# Bucle para las iteraciones restantes
for (i in 1:max_iter) {
    # El valor de 'x' para la nueva iteración se toma de la columna 'gradiente_f_x' anterior
    x_anterior <- resultados$gradiente_f_x[i]

    # Guardar los valores en la fila actual
    resultados$x[i + 1] <- x_anterior
    resultados$f_x[i + 1] <- f(x_anterior)
    resultados$fprima_x[i + 1] <- f_prime(x_anterior)

    # Calcular el nuevo valor de 'gradiente_f_x' (Próximo x)
    resultados$gradiente_f_x[i + 1] <- x_anterior - alpha * f_prime(x_anterior)
}

# La última fila de 'gradiente_f_x' no se usa
resultados$gradiente_f_x[max_iter + 1] <- NA

#4. PREPARACIÓN Y GRÁFICO DEL RESULTADO

# A. Reestructurar el data frame para ggplot
datos_plot <- melt(resultados,
    id.vars = "Iteracion",
    measure.vars = c("f_x", "fprima_x", "gradiente_f_x"),
    variable.name = "Mtrica",
    value.name = "Valor"
)

# B. Renombrar las etiquetas
datos_plot$Mtrica <- factor(datos_plot$Mtrica,
    levels = c("f_x", "fprima_x", "gradiente_f_x"),
    labels = c("f(x)=x^2",
               "f'(x) - Gradiente",
               "Próximo Valor de x (Columna E)")
)

# C. Generar el gráfico con ggplot2
ggplot(datos_plot, aes(x = Iteracion, y = Valor, color = Mtrica)) +
    geom_line(size = 1) +
    geom_point(size = 2, alpha = 0.7) +
    labs(
        title = "Evolución de f(x), f'(x) y el Próximo x a lo largo de las Iteraciones",
        subtitle = "Simulación del Gradiente Descendente (α=0.01) de su hoja de cálculo",
        x = "Iteración (i)",
        y = "Valor de la Métrica"
    ) +
    theme_minimal() +
    theme(legend.position = "top") +
    scale_color_manual(values = c("f(x)=x^2" = "blue",
                                  "f'(x) - Gradiente" = "red",
                                  "Próximo Valor de x (Columna E)" = "darkgreen")) +
    scale_y_continuous(limits = c(0, NA)) 

1.1. Gráfica

Evidencia 1

Figura 1: Primera captura de la actividad

Figura 1: Gráfico de la simulación del método de gradiente descendente para una función (ver gráfica en el informe de la actividad).


2. Código para Dos Funciones: Gradiente Descendente

Universidad Nacional del Altiplano de Puno

Año de la recuperación y consolidación de la economía peruana

# CÓDIGO R: GRADIENTE DESCENDENTE COMPARATIVO (Dos Funciones)

#1. INSTALACIÓN Y CARGA DE LIBRERÍAS
if(!require(ggplot2)) install.packages("ggplot2")
if (!require(reshape2)) install.packages("reshape2")
library(ggplot2)
library(reshape2)

#2. PARÁMETROS GLOBALES
alpha <- 0.01 # Tasa de aprendizaje
x0 <- 3 # Valor inicial
max_iter <- 50 # Número de iteraciones

#3. DEFINICIÓN DE FUNCIONES

# Primera función
f1 <- function(x) x^2
f1_prime <- function(x) 2 * x

# Segunda función
f2 <- function(x) (x - 2)^2 + 1
f2_prime <- function(x) 2 * (x - 2)

#4. FUNCIÓN PARA CALCULAR EL GRADIENTE DESCENDENTE
gradiente_descendente <- function(f, f_prime, x0, alpha, max_iter, nombre_fun) {
    resultados <- data.frame(
        Iteracion = 0:max_iter,
        x = numeric(max_iter + 1),
        f_x = numeric(max_iter + 1),
        fprima_x = numeric(max_iter + 1),
        gradiente_f_x = numeric(max_iter + 1),
        Funcion = nombre_fun
    )

    # Inicialización
    x <- x0
    resultados$x[1] <- x
    resultados$f_x[1] <- f(x)
    resultados$fprima_x[1] <- f_prime(x)
    resultados$gradiente_f_x[1] <- x - alpha * f_prime(x)

    # Iteraciones
    for (i in 1:max_iter) {
        x_anterior <- resultados$gradiente_f_x[i]
        resultados$x[i + 1] <- x_anterior
        resultados$f_x[i + 1] <- f(x_anterior)
        resultados$fprima_x[i + 1] <- f_prime(x_anterior)
        resultados$gradiente_f_x[i + 1] <- x_anterior - alpha * f_prime(x_anterior)
    }
    resultados$gradiente_f_x[max_iter + 1] <- NA
    return(resultados)
}

#5. EJECUCIÓN PARA AMBAS FUNCIONES
resultados_f1 <- gradiente_descendente(f1, f1_prime, x0, alpha, max_iter, "f(x)=x^2")
resultados_f2 <- gradiente_descendente(f2, f2_prime, x0, alpha, max_iter, "f(x)=(x-2)^2 + 1")

# Unir resultados
resultados_totales <- rbind(resultados_f1, resultados_f2)

#6. REESTRUCTURAR DATOS PARA ggplot
datos_plot <- melt(resultados_totales,
    id.vars = c("Iteracion", "Funcion"),
    measure.vars = c("f_x", "fprima_x", "gradiente_f_x"),
    variable.name = "Mtrica",
    value.name = "Valor"
)

# Etiquetas más legibles
datos_plot$Mtrica <- factor(datos_plot$Mtrica,
    levels = c("f_x", "fprima_x", "gradiente_f_x"),
    labels = c("f(x)", "f'(x)", "Próximo x")
)

#7. GRAFICAR LOS RESULTADOS
ggplot(datos_plot, aes(x = Iteracion, y = Valor, color = Mtrica, linetype = Funcion)) +
    geom_point(size = 1.5, alpha = 0.6) +
    geom_line(size = 1) +
    labs(
        title = "Comparación del Gradiente Descendente para Dos Funciones",
        subtitle = sprintf("α=%.3f, x0=%.1f, Iteraciones =%d", alpha, x0, max_iter),
        x = "Iteración (i)",
        y = "Valor de la Métrica"
    ) +
    scale_color_manual(values = c("f(x)" = "blue", "f'(x)" = "red", "Próximo x" = "darkgreen")) +
    theme_minimal(base_size = 13) +
    theme(
        legend.position = "top",
        plot.title = element_text(face = "bold"),
        panel.grid.minor = element_blank()
    )

2.1. Gráfica

Evidencia 2

Figura 2: Segunda captura de la actividad

Figura 2: Gráfico de la simulación del gradiente descendente para dos funciones (ver gráfica en el informe).