El método de Horner ayuda a calcular el valor de un polinomio de una forma eficiente. El algoritmo destaca por usar únicamente operaciones de suma y multiplicación, lo cual reduce la cantidad de cálculos necesarios y mejora la eficiencia del método.
Algoritmo del método de Horner:
- Escoger un valor inicial \( x_i \).
- Determinar la tolerancia \( E_s \).
- Realizar la división sintética dos veces:
- La primera para evaluar el valor del polinomio \( R \).
- La segunda para evaluar el valor de la derivada del polinomio \( S \).
- Calcular la siguiente aproximación utilizando:
\[ x_{i+1} = x_i - \frac{R}{S} \]
- Calcular el error aproximado \( E_a \) desde la primera iteración.
- Si \( E_a \leq E_s \), se finaliza y \( x_{i+1} \) es la raíz aproximada.
- En caso contrario, se repite el proceso regresando al paso 3 con \( x_i = x_{i+1} \).
Ejemplos del Método de Horner
Ejemplo 1: Polinomio \( F(x) = 2x^3 - 4x^2 + 1 \)
En esta animación se observa cómo el método de Horner evalúa el polinomio \( P(x) \) en distintos puntos utilizando divisiones sintéticas. Se muestra visualmente la actualización de los coeficientes y la convergencia hacia la raíz mediante aproximaciones sucesivas.
Ejemplo 2: Polinomio \( F(x) = x^4 - 4x^2 + 3 \)
El video ilustra cómo se emplea el método de Horner para hallar una raíz del polinomio de cuarto grado. Se representa paso a paso cómo se reduce el polinomio y cómo se calcula la derivada aproximada mediante una segunda división sintética, lo que permite aplicar la fórmula iterativa hasta alcanzar la tolerancia deseada.
Explicación en video del código en Python
Método de Horner en Python
# Función que aplica la división sintética (método de Horner)
def horner_division(coeficientes_polinomio, valor_x):
grado = len(coeficientes_polinomio) - 1 # Grado del polinomio
coeficientes_horner = [0.0] * (grado + 1) # Lista auxiliar para coeficientes intermedios
coeficientes_horner[0] = coeficientes_polinomio[0] # Primer coeficiente se copia directamente
# Aplicar la regla de Horner para evaluar f(x)
for i in range(1, grado + 1):
coeficientes_horner[i] = coeficientes_polinomio[i] + valor_x * coeficientes_horner[i - 1]
valor_funcion = coeficientes_horner[-1] # Último valor = f(x)
polinomio_derivado = coeficientes_horner[:-1] # f'(x) (nuevo conjunto de coeficientes sin el residuo)
return valor_funcion, polinomio_derivado
# Función principal que implementa el método de Horner iterativo
def metodo_horner_iterativo(coeficientes_polinomio, valor_inicial, tolerancia_porcentual=0.05, maximo_iteraciones=50):
print("\nIteración | x_i | f(x) | f'(x) | x_(i+1) | Error (%)")
print("-" * 80)
iteracion = 0
error_relativo = 100.0
aproximacion_actual = valor_inicial
while iteracion < maximo_iteraciones and error_relativo > tolerancia_porcentual:
# Primera división sintética: calcula f(x)
valor_funcion, polinomio_derivado = horner_division(coeficientes_polinomio, aproximacion_actual)
# Validar que el polinomio tenga grado mayor a cero
if not polinomio_derivado:
print("No se puede realizar la segunda división (grado cero).")
break
# Segunda división sintética: calcula f'(x)
valor_derivada, _ = horner_division(polinomio_derivado, aproximacion_actual)
# Verificar que la derivada no sea cero
if valor_derivada == 0:
print("Derivada igual a cero. No se puede continuar. Cambia el valor inicial.")
break
# Calcular la siguiente aproximación
nueva_aproximacion = aproximacion_actual - valor_funcion / valor_derivada
# Calcular error relativo porcentual
error_relativo = abs((nueva_aproximacion - aproximacion_actual) / nueva_aproximacion) * 100 if nueva_aproximacion != 0 else 0
# Mostrar resultados de la iteración
print(f"{iteracion + 1:^9} | {aproximacion_actual:^9.6f} | {valor_funcion:^10.6f} | {valor_derivada:^10.6f} | {nueva_aproximacion:^10.6f} | {error_relativo:^9.5f}")
# Actualizar valores para la siguiente iteración
aproximacion_actual = nueva_aproximacion
iteracion += 1
# Mostrar el resultado final
print("\nRaíz aproximada:", round(aproximacion_actual, 6))
print("=" * 60)
return aproximacion_actual
# -------------------------------
# EJEMPLO DE USO
# -------------------------------
if __name__ == "__main__":
coeficientes_polinomio = [2, -6, 4, -3, 1, -5]
# Valor inicial estimado
valor_inicial = 0.75
# Ejecutar el método de Horner iterativo
raiz = metodo_horner_iterativo(coeficientes_polinomio, valor_inicial, tolerancia_porcentual=0.05, maximo_iteraciones=20)