Horner

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:

  1. Escoger un valor inicial \( x_i \).
  2. Determinar la tolerancia \( E_s \).
  3. 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 \).
  4. Calcular la siguiente aproximación utilizando:

\[ x_{i+1} = x_i - \frac{R}{S} \]

  1. Calcular el error aproximado \( E_a \) desde la primera iteración.
  2. Si \( E_a \leq E_s \), se finaliza y \( x_{i+1} \) es la raíz aproximada.
  3. 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)