# Función para calcular los coeficientes de Lagrange lagrange_coefs <- function(soporte) { n <- length(soporte) - 1 coefs <- matrix(0, nrow = n + 1, ncol = n + 1) for (i in 0:n) { Li <- c(1) for (j in 0:n) { if (i != j) { Li <- c(0, Li) - c(Li * soporte[j+1], 0) Li <- Li / (soporte[i+1] - soporte[j+1]) } } coefs[i+1,] <- Li } return(coefs) } # Función para imprimir las bases de Lagrange imprime_bases <- function(matriz_bases_Lagrange) { for (j in 1:nrow(matriz_bases_Lagrange)) { pol <- matriz_bases_Lagrange[j,] cat(sprintf("L_%d = ", j-1)) for (i in 1:length(pol)) { if (i > 1 && pol[i] > 0) cat(" + ") cat(sprintf("%.4f", pol[i])) if (i > 1) cat(sprintf("x^%d", i-1)) } cat("\n") } } # Función para imprimir el polinomio canónico imprime_pol_canonico <- function(pol) { for (i in 1:length(pol)) { if (i > 1 && pol[i] >= 0) cat(" + ") cat(sprintf("%.4f", pol[i])) if (i > 1) cat(sprintf("x^%d", i-1)) } cat("\n") } # Función para evaluar el polinomio canónico evalua_pol_canonico <- function(pol, x_eval) { p <- function(x) { resultado <- pol[1] for (i in 2:length(pol)) { resultado <- resultado + pol[i] * x^(i - 1) } return(resultado) } return(sapply(x_eval, p)) } # Función para calcular el polinomio interpolador de Lagrange pol_inter_lagrange <- function(matrizLs, fs) { pol_interp <- numeric(ncol(matrizLs)) for (j in 1:nrow(matrizLs)) { pol_interp <- pol_interp + matrizLs[j,] * fs[j] } return(pol_interp) } # Función para dibujar el polinomio canónico dibujar_canonicos <- function(x_orig, coeficientes) { polinomio <- function(x) { suma <- 0 for (i in 1:length(coeficientes)) { suma <- suma + coeficientes[i] * x^(i-1) } return(suma) } x_min <- min(x_orig) x_max <- max(x_orig) rango <- x_max - x_min x <- seq(x_min - 0.1*rango, x_max + 0.1*rango, length.out = 1000) y <- sapply(x, polinomio) plot(x, y, type = "l", col = "blue", main = "Gráfica del Polinomio Canónico", xlab = "x", ylab = "y", xlim = c(min(x), max(x)), ylim = range(y)) points(x_orig, sapply(x_orig, polinomio), col = "red", pch = 19) } # Parte interactiva que solicita datos al usuario n <- as.integer(readline(prompt="Ingrese el número de puntos de soporte: ")) soporte <- numeric(n) fs <- numeric(n) cat("Ingrese los puntos de soporte y sus valores correspondientes:\n") for(i in 1:n) { soporte[i] <- as.numeric(readline(prompt=sprintf("x[%d]: ", i))) fs[i] <- as.numeric(readline(prompt=sprintf("f(x[%d]): ", i))) } # Calcular los coeficientes de Lagrange coefs <- lagrange_coefs(soporte) # Imprimir las bases de Lagrange cat("\nBases de Lagrange:\n") imprime_bases(coefs) # Calcular el polinomio interpolador pol_interp <- pol_inter_lagrange(coefs, fs) # Imprimir el polinomio interpolador en forma canónica cat("\nPolinomio interpolador en forma canónica:\n") imprime_pol_canonico(pol_interp) # Dibujar el polinomio interpolador dibujar_canonicos(soporte, pol_interp) # Solicitar puntos para evaluar el polinomio n_eval <- as.integer(readline(prompt="\nIngrese el número de puntos para evaluar el polinomio: ")) x_eval <- numeric(n_eval) for(i in 1:n_eval) { x_eval[i] <- as.numeric(readline(prompt=sprintf("Punto de evaluación %d: ", i))) } y_eval <- evalua_pol_canonico(pol_interp, x_eval) # Imprimir los resultados de la evaluación cat("\nEvaluación del polinomio:\n") for (i in 1:length(x_eval)) { cat(sprintf("f(%.4f) = %.4f\n", x_eval[i], y_eval[i])) }