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}) \tag{7} \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)
...
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*} $$
Seudocódigo para la derivada
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
function raiz(f(x), a, b):
c = b - f(b)/diferencia_atras(f(x), a, b)
return b, c
end function
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
Seudocódigo
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 < error_permitido
exit
end if
end while
mostrar x_actual
end function
O también
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
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)
Encontrar la raiz de $$ \begin{equation*} y = x^{5} + x^{3} + 3 \end{equation*} $$
usar \( x_{-1} = 0 \) y \( x_{0} = -1 \)
def f(x):
# f(x) = x^5 + x^3 + 3
y = x**5 + x**3 + 3
return y
diferencia_atras(f, 0, -1)
2.0
raiz(f, 0, -1)
(-1, -1.5)
secante(f, 0, -1)
i x anterior x actual error relativo %
0 0.000000000000000 -1.000000000000000 ???????????????
1 -1.000000000000000 -1.500000000000000 33.33333333333
2 -1.500000000000000 -1.055749128919861 42.07920792079
3 -1.055749128919861 -1.082552156595056 2.47591097684
4 -1.082552156595056 -1.107095365872601 2.21690109399
5 -1.107095365872601 -1.105235826838816 0.16824816828
6 -1.105235826838816 -1.105298375884311 0.00565901904
7 -1.105298375884311 -1.105298546022297 0.00001539294
8 -1.105298546022297 -1.105298546006170 0.00000000146
x = -1.1052985460061695
Encontrar la raiz de $$ \begin{equation*} y = x^{5} + x^{3} + 3 \end{equation*} $$
usar \( x_{-1} = 0 \) y \( x_{0} = -0.5 \)
secante(f, 0, -0.5)
i x anterior x actual error relativo %
0 0.000000000000000 -0.500000000000000 ???????????????
1 -0.500000000000000 -9.600000000000000 94.79166666667
2 -9.600000000000000 -0.500313971661081 1818.79510542695
3 -0.500313971661081 -0.500627895630576 0.06270604819
4 -0.500627895630576 -3.169956277328793 84.20710407866
5 -3.169956277328793 -0.522201219983924 507.03731742074
6 -0.522201219983924 -0.543418645947658 3.90443466045
7 -0.543418645947658 -2.768143161922103 80.36883881503
8 -2.768143161922103 -0.577263290052511 379.52870200187
9 -0.577263290052511 -0.610021560159145 5.37001841346
10 -0.610021560159145 -2.210887327971188 72.40829270486
11 -2.210887327971188 -0.677993562925393 226.09267238935
12 -0.677993562925393 -0.739746925039866 8.34790386065
13 -0.739746925039866 -1.594891722781221 53.61773376378
14 -1.594891722781221 -0.887371034445026 79.73222709243
15 -0.887371034445026 -0.981746729543170 9.61303890893
16 -0.981746729543170 -1.158598872903698 15.26431170413
17 -1.158598872903698 -1.094888106874658 5.81892940740
18 -1.094888106874658 -1.104485964038430 0.86898860432
19 -1.104485964038430 -1.105311436713077 0.07468236076
20 -1.105311436713077 -1.105298530164615 0.00116769797
x = -1.1052985301646152