Actividad 02 · Método del Gradiente Descendente
23/10/2025
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
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
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).