<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Método de la secante
El método de la secante es una extensión del método de Newton-Raphson, la derivada de la función se calcula usando una diferencia finita hacia atrás
\begin{equation}
    f'(x_{i}) = \frac{f(x_{i-1}) - f(x_{i})}{x_{i-1} - x_{i}}
\end{equation}
y se reemplaza en la fórmula del método de Newton-Raphson 
\begin{equation}
    x_{i+1} = x_{i} - \frac{1}{f'(x_{i})} f(x_{i}) = x_{i} - \frac{x_{i-1} - x_{i}}{f(x_{i-1}) - f(x_{i})} f(x_{i})
\end{equation}
Algoritmo
x_-1 es la raiz aproximada anterior
x_0 es la raiz aproximada actual
x_1 = x_0 - f(x_0)*(x_-1 - x_0)/f(x_-1) - f(x_0)
x_2 = x_1 - f(x_1)*(x_0 - x_1)/f(x_0) - f(x_1)
x_3 = x_2 - f(x_2)*(x_1 - x_2)/f(x_1) - f(x_2)
...
Ejemplo 1
Encontrar la raiz de
\begin{equation}
    y = x^{5} + x^{3} + 3
\end{equation}
usar $x = 0$ y $x = -1$ como valores iniciales
Iteración 0
Raíz aproximada anterior
\begin{equation}
    x_{-1} = 0
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{0} = -1
\end{equation}
Error relativo
\begin{equation}
    e_{r} = ? 
\end{equation}
Iteración 1
Calculando las ordenadas en los puntos anteriores
\begin{align}
    f(x_{-1}) &= f(0) = 3 \
    f(x_{0}) &= f(-1) = 1
\end{align}
Raíz aproximada anterior
\begin{equation}
    x_{0} = -1
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{1} = x_{0} - \frac{x_{-1} - x_{0}}{f(x_{-1}) - f(x_{0})} f(x_{0}) = -1 - \frac{0 - (-1)}{3 - 1} 1 = -1.5
\end{equation}
Error relativo
\begin{equation}
    e_{r} = \bigg|\frac{x_{1} - x_{0}}{x_{1}}\bigg| \times 100\% = \bigg|\frac{-1.5 - (-1)}{-1.5}\bigg| \times 100\% = 33.33\% 
\end{equation}
Iteración 2
Calculando las ordenadas en los puntos anteriores
\begin{align}
    f(x_{0}) &= f(-1) = 1 \
    f(x_{1}) &= f(-1.5) = -7.96875
\end{align}
Raíz aproximada anterior
\begin{equation}
    x_{1} = -1.5
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{2} = x_{1} - \frac{x_{0} - x_{1}}{f(x_{0}) - f(x_{1})} f(x_{1}) = -1.5 - \frac{-1 - (-1.5)}{1 - (-7.96875)} (-7.96875) = -1.055749
\end{equation}
Error relativo
\begin{equation}
    e_{r} = \bigg|\frac{x_{2} - x_{1}}{x_{2}}\bigg| \times 100\% = \bigg|\frac{-1.055749 - (-1.5)}{-1.055749}\bigg| \times 100\% = 42.08\% 
\end{equation}
Iteración 3
Calculando las ordenadas en los puntos anteriores
\begin{align}
    f(x_{1}) &= f(-1.5) = -7.96875 \
    f(x_{2}) &= f(-1.055749) = 0.511650
\end{align}
Raíz aproximada anterior
\begin{equation}
    x_{2} = -1.055749
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{3} = x_{2} - \frac{x_{1} - x_{2}}{f(x_{1}) - f(x_{2})} f(x_{2}) = -1.055749 - \frac{-1.5 - (-1.055749)}{-7.96875 - 0.511650} 0.511650 = -1.082552
\end{equation}
Error relativo
\begin{equation}
    e_{r} = \bigg|\frac{x_{3} - x_{2}}{x_{3}}\bigg| \times 100\% = \bigg|\frac{-1.082552 - (-1.055749)}{-1.082552}\bigg| \times 100\% = 2.48\% 
\end{equation}
Implementación de funciones auxiliares
Seudocódigo para la derivada
pascal
function diferencia_atras(f(x), x_0, x_1)
    f'(x) = f(x_0) - f(x_1)/x_0 - x_1 
    return f'(x)
end function
Seudocódigo para obtener las últimas dos raices
pascal    
function raiz(f(x), a, b)
Step1:  Implementación no vectorizada
Seudocódigo
pascal
function secante(f(x), x_0, x_1)
    x_anterior = x_0
    x_actual = x_1
    error_permitido = 0.000001
    while(True)
        x_anterior, x_actual = raiz(f(x), x_anterior, x_actual)
        if x_raiz_actual != 0
            error_relativo = abs((x_raiz_actual - x_raiz_anterior)/x_raiz_actual)*100
        end if
        if error_relativo &lt; error_permitido
            exit
        end if
    end while
    mostrar x_actual
end function
o también
pascal
function secante(f(x), x_0, x_1)
    x_anterior = x_0
    x_actual = x_1
    for 1 to maxima_iteracion do
        x_anterior, x_actual = raiz(f(x), x_anterior, x_actual)
    end for
    mostrar x_actual
end function
Step2:  Ejemplo 2
Encontrar la raiz de
\begin{equation}
    y = x^{5} + x^{3} + 3
\end{equation}
usar $x_{-1} = 0$ y $x_{0} = -1$
Step3:  Ejemplo 3
Encontrar la raiz de
\begin{equation}
    y = x^{5} + x^{3} + 3
\end{equation}
usar $x_{-1} = 0$ y $x_{0} = -0.5$
<ASSISTANT_TASK:>
Python Code:
def diferencia_atras(f, x_0, x_1):
    pendiente = (f(x_0) - f(x_1))/(x_0 - x_1) 
    return pendiente
def raiz(f, a, b):
    c = b - f(b)/diferencia_atras(f, a, b)
    return b, c
Explanation: Método de la secante
El método de la secante es una extensión del método de Newton-Raphson, la derivada de la función se calcula usando una diferencia finita hacia atrás
\begin{equation}
    f'(x_{i}) = \frac{f(x_{i-1}) - f(x_{i})}{x_{i-1} - x_{i}}
\end{equation}
y se reemplaza en la fórmula del método de Newton-Raphson 
\begin{equation}
    x_{i+1} = x_{i} - \frac{1}{f'(x_{i})} f(x_{i}) = x_{i} - \frac{x_{i-1} - x_{i}}{f(x_{i-1}) - f(x_{i})} f(x_{i})
\end{equation}
Algoritmo
x_-1 es la raiz aproximada anterior
x_0 es la raiz aproximada actual
x_1 = x_0 - f(x_0)*(x_-1 - x_0)/f(x_-1) - f(x_0)
x_2 = x_1 - f(x_1)*(x_0 - x_1)/f(x_0) - f(x_1)
x_3 = x_2 - f(x_2)*(x_1 - x_2)/f(x_1) - f(x_2)
...
Ejemplo 1
Encontrar la raiz de
\begin{equation}
    y = x^{5} + x^{3} + 3
\end{equation}
usar $x = 0$ y $x = -1$ como valores iniciales
Iteración 0
Raíz aproximada anterior
\begin{equation}
    x_{-1} = 0
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{0} = -1
\end{equation}
Error relativo
\begin{equation}
    e_{r} = ? 
\end{equation}
Iteración 1
Calculando las ordenadas en los puntos anteriores
\begin{align}
    f(x_{-1}) &= f(0) = 3 \
    f(x_{0}) &= f(-1) = 1
\end{align}
Raíz aproximada anterior
\begin{equation}
    x_{0} = -1
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{1} = x_{0} - \frac{x_{-1} - x_{0}}{f(x_{-1}) - f(x_{0})} f(x_{0}) = -1 - \frac{0 - (-1)}{3 - 1} 1 = -1.5
\end{equation}
Error relativo
\begin{equation}
    e_{r} = \bigg|\frac{x_{1} - x_{0}}{x_{1}}\bigg| \times 100\% = \bigg|\frac{-1.5 - (-1)}{-1.5}\bigg| \times 100\% = 33.33\% 
\end{equation}
Iteración 2
Calculando las ordenadas en los puntos anteriores
\begin{align}
    f(x_{0}) &= f(-1) = 1 \
    f(x_{1}) &= f(-1.5) = -7.96875
\end{align}
Raíz aproximada anterior
\begin{equation}
    x_{1} = -1.5
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{2} = x_{1} - \frac{x_{0} - x_{1}}{f(x_{0}) - f(x_{1})} f(x_{1}) = -1.5 - \frac{-1 - (-1.5)}{1 - (-7.96875)} (-7.96875) = -1.055749
\end{equation}
Error relativo
\begin{equation}
    e_{r} = \bigg|\frac{x_{2} - x_{1}}{x_{2}}\bigg| \times 100\% = \bigg|\frac{-1.055749 - (-1.5)}{-1.055749}\bigg| \times 100\% = 42.08\% 
\end{equation}
Iteración 3
Calculando las ordenadas en los puntos anteriores
\begin{align}
    f(x_{1}) &= f(-1.5) = -7.96875 \
    f(x_{2}) &= f(-1.055749) = 0.511650
\end{align}
Raíz aproximada anterior
\begin{equation}
    x_{2} = -1.055749
\end{equation}
Raíz aproximada actual
\begin{equation}
    x_{3} = x_{2} - \frac{x_{1} - x_{2}}{f(x_{1}) - f(x_{2})} f(x_{2}) = -1.055749 - \frac{-1.5 - (-1.055749)}{-7.96875 - 0.511650} 0.511650 = -1.082552
\end{equation}
Error relativo
\begin{equation}
    e_{r} = \bigg|\frac{x_{3} - x_{2}}{x_{3}}\bigg| \times 100\% = \bigg|\frac{-1.082552 - (-1.055749)}{-1.082552}\bigg| \times 100\% = 2.48\% 
\end{equation}
Implementación de funciones auxiliares
Seudocódigo para la derivada
pascal
function diferencia_atras(f(x), x_0, x_1)
    f'(x) = f(x_0) - f(x_1)/x_0 - x_1 
    return f'(x)
end function
Seudocódigo para obtener las últimas dos raices
pascal    
function raiz(f(x), a, b):
    c = b - f(b)/diferencia_atras(f(x), a, b)
    return b, c
end function
End of explanation
def secante(f, x_0, x_1):
    print("{0:s} \t {1:15s} \t {2:15s} \t {3:15s}".format('i', 'x anterior', 'x actual', 'error relativo %'))
    x_anterior = x_0
    x_actual = x_1
    i = 0
    print("{0:d} \t {1:.15f} \t {2:.15f} \t {3:15s}".format(i, x_anterior, x_actual, '???????????????'))
    error_permitido = 0.000001
    while True:
        x_anterior, x_actual = raiz(f, x_anterior, x_actual)
        if x_actual != 0:
            error_relativo = abs((x_actual - x_anterior)/x_actual)*100
        i = i + 1
        print("{0:d} \t {1:.15f} \t {2:.15f} \t {3:15.11f}".format(i, x_anterior, x_actual, error_relativo))
        if (error_relativo < error_permitido) or (i>=20):
            break
    print('\nx =', x_actual)
Explanation: Implementación no vectorizada
Seudocódigo
pascal
function secante(f(x), x_0, x_1)
    x_anterior = x_0
    x_actual = x_1
    error_permitido = 0.000001
    while(True)
        x_anterior, x_actual = raiz(f(x), x_anterior, x_actual)
        if x_raiz_actual != 0
            error_relativo = abs((x_raiz_actual - x_raiz_anterior)/x_raiz_actual)*100
        end if
        if error_relativo &lt; error_permitido
            exit
        end if
    end while
    mostrar x_actual
end function
o también
pascal
function secante(f(x), x_0, x_1)
    x_anterior = x_0
    x_actual = x_1
    for 1 to maxima_iteracion do
        x_anterior, x_actual = raiz(f(x), x_anterior, x_actual)
    end for
    mostrar x_actual
end function
End of explanation
def f(x):
    # f(x) = x^5 + x^3 + 3
    y = x**5 + x**3 + 3
    return y
diferencia_atras(f, 0, -1)
raiz(f, 0, -1)
secante(f, 0, -1)
Explanation: Ejemplo 2
Encontrar la raiz de
\begin{equation}
    y = x^{5} + x^{3} + 3
\end{equation}
usar $x_{-1} = 0$ y $x_{0} = -1$
End of explanation
secante(f, 0, -0.5)
Explanation: Ejemplo 3
Encontrar la raiz de
\begin{equation}
    y = x^{5} + x^{3} + 3
\end{equation}
usar $x_{-1} = 0$ y $x_{0} = -0.5$
End of explanation
<END_TASK>