2.5 Método de la Secante



1. Método de la Secante

Referencia: Chapra 6.3 p154, Burden 2.3 p54,

El método de la secante busca evitar un posible inconveniente en el desarrollo el algoritmo para método de Newton-Raphson, que es el implementar la evaluación de la expresión de la primera derivada.

método de Secante gráfico animado

La derivada de la función f(x) también se puede aproximar mediante una diferencia finita dividida hacia atrás:

f'(x_i) = \frac{f(x_{i-1})-f(x_i)}{x_{i-1}-x_i}
Método de la Secante concepto gráfico animado

la que se sustituye en la ecuación del método de Newton-Raphson para obtener:

x_{i+1}= x_i - f(x_i)\frac{(x_{i-1} - x_i)}{f(x_{i-1}) - f(x_i)}

Los métodos de la secante y de la falsa posición tienen ecuaciones idénticas, usan dos valores iniciales x[i-1] , x[i], para proyectar el nuevo valor de x[i+1].

Sin embargo, existe una diferencia importante entre ambos métodos en la forma en que uno de los valores iniciales se reemplaza por la nueva aproximación.

En el método de la falsa posición, la última aproximación de la raíz reemplaza cualquiera de los valores iniciales que dé un valor de la función con el mismo signo. En consecuencia, las dos aproximaciones siempre encierran a la raíz, es un método cerrado y siempre converge.

En el método de la secante se reemplaza los valores en secuencia estricta: xi reemplaza a x[i – 1], con el nuevo valor x[i+1] se reemplaza a xi . Por lo que, algunas veces los dos valores están en el mismo lado de la raíz y en ciertos casos esto puede llevar a divergencias.

Observación: ¿Cuál es la diferencia con el método de Newton-Raphson?

1.1 Recta Secante para la gráfica

Si se quiere dibujar la recta secante, se inicia con la ecuación de la recta usando el valor de la pendiente del triángulo presentado en la gráfica del método, cambie la constante b por b0.

y = mx + b

Para identificar los puntos consecutivos con variables simples, se usa la siguiente conversión

xi-1xixi+1
xaxbxc
m = \frac{f(x_a)-f(x_b)}{x_a-x_b}

Se usa un punto conocido, por ejemplo (xb,fb) y se encuentra b0

f(x_b) = m x_b + b_0 f(x_b) - m x_b = b_0

reordenando, se usan tres expresiones para disponer de la función de la recta secante.

m = \frac{f(x_a)-f(x_b)}{x_a-x_b} b_0 = f(x_b) - m x_b rsc(x)= m x + b_0

2. Ejercicio

Referencia: Burden 2.1 ejemplo 1 p38

La ecuación mostrada tiene una raíz en el intervalo [1,2], ya que f(1) = -5 y f(2) = 14. Muestre los resultados parciales del algoritmo de la secante con una tolerancia de 0.0001

f(x) = x^3 + 4x^2 -10 =0
Método de la Secante

La gráfica se realiza iniciando con los valores 2.5 y 4 para observar mejor el efecto gráfico en las iteraciones.



3. Desarrollo Analítico

f(x) = x^3 + 4x^2 -10 =0 x_{i+1}= x_i - f(x_i)\frac{(x_{i-1} - x_i)}{f(x_{i-1}) - f(x_i)}

Se probará con valores iniciales dentro del tramo [1,2], tolera = 0.001

itera = 0

X-1 = 1,  X0 =2,

f(1) = (1)^3 + 4(1)^2 -10 = -5 f(2) = (2)^3 + 4(2)^2 -10 =14 x_{1}= 2 - 14\frac{(1 - 2)}{(-5 - 14)} = 1.2632 errado = |1.2632 - 2| = 0.7368

itera = 1

X0 = 2,  X1 = 1.2632

f(2) =14 f(1.2632) = ( 1.2632)^3 + 4( 1.2632)^2 -10 =-1.6023 x_{2}= 1.2632 - (-1.6023)\frac{(2 - 1.2632)}{(14 -(-1.6023))} =1.3388 errado = |1.3388 - 1.2632 | = 0.0756

itera = 2

X1 =1.2632, X2 =1.3388

f(1.2632) = -1.6023 f(1.3388) = (1.3388)^3 + 4(1.3388)^2 -10 =-0.4304 x_{3}= 1.3388 - (-0.4304)\frac{(1.2632 - 1.3388)}{(-1.6023 -(-0.4304))} = 1.3666 errado = | 1.3388- 1.3666| =0.0277

desarrollando una tabla con el algoritmo se tiene:

método de la Secante
i [ x[i-1], xi, x[i+1], f[i-1], fi ] tramo
0 [ 1.      2.      1.2632 -5.     14.    ] 0.736842105263158
1 [ 2.      1.2632  1.3388 14.     -1.6023] 0.0756699440909967
2 [ 1.2632  1.3388  1.3666 -1.6023 -0.4304] 0.027788555891506528
3 [ 1.3388  1.3666  1.3652 -0.4304  0.0229] 0.001404492087488718
4 [ 1.3666e+00  1.3652e+00  1.3652e+00  2.2909e-02 -2.9907e-04] 1.809847900258177e-05
raíz:  1.3652300011108591
tramo: 1.809847900258177e-05
itera: 5


4. Algoritmo en Python

Para identificar los puntos consecutivos con variables simples, se usa la siguiente conversión:

xi-1xixi+1
xaxbxc

Instrucciones en Python

# Método de secante
import numpy as np

# INGRESO
fx = lambda x: x**3 + 4*x**2 - 10
a = 1 # intervalo de búsqueda
b = 2
tolera = 0.001
iteramax = 20

# PROCEDIMIENTO
xa = a
xb = b
itera = 0
tramo = 2*tolera
while tramo>tolera and itera<iteramax:
fa = fx(xa)
fb = fx(xb)
xc = xb - fb*(xa - xb)/(fa - fb)
tramo = abs(xc - xb)
xa = xb
xb = xc
itera = itera + 1

if itera>=iteramax: # revisa convergencia
xc = np.nan

# SALIDA
print('raiz:',xc)
print('tramo:',tramo)
print('itera:',itera)


5. Gráfica en Python

La gráfica presentada para revisar f(x) se realiza con las instrucciones:

# GRAFICA
import matplotlib.pyplot as plt
a = 1
b = 2
muestras = 21

xj = np.linspace(a,b,muestras)
fj = fx(xj)
plt.plot(xj,fj, label='f(x)')
plt.plot(xi,0, 'o')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid()
plt.legend()
plt.show()


6. Función en Python

Una función resumida, se recomienda realizar la validación de cambio de signo entre [a,b]

# Método de secante
import numpy as np

def secante_raiz(fx,a,b,tolera, iteramax=20,
vertabla=True, precision=6):
'''fx en forma numérica lambda
Los valores de [a,b] son seleccionados
desde la gráfica de la función
'''

xa = a
xb = b
itera = 0
tramo = np.abs(xb-xa)
if vertabla==True:
print('método de la Secante')
print('i','[ x[i-1], xi, x[i+1], f[i-1], fi ]','tramo')
np.set_printoptions(precision)
while not(tramo<tolera or itera>iteramax):
fa = fx(xa)
fb = fx(xb)
xc = xb - fb*(xa - xb)/(fa - fb)
tramo = abs(xc - xb)
if vertabla==True:
print(itera,np.array([xa,xb,xc,fa,fb]),tramo)
xa = xb
xb = xc
itera = itera + 1
if itera>=iteramax:
xc = np.nan
print('itera: ',itera,
'No converge,se alcanzó el máximo de iteraciones')
respuesta = xc

return(respuesta)

# INGRESO
fx = lambda x: x**3 + 4*x**2 - 10
a = 1
b = 2
tolera = 0.001

# PROCEDIMIENTO
respuesta = secante_raiz(fx,a,b,tolera,
vertabla=True,precision=4)
# SALIDA
print('raíz: ', respuesta)


7. Función en librería Scipy.optimize.newton - Secante

El método de la secante se encuentra implementado en Scipy en la forma de algoritmo de newton, que al no incluir como parámetro de la función para la derivada de f(x), usa el método de la secante:

>>> import scipy as sp
>>> sp.optimize.newton(fx,xa, tol=tolera)
1.3652320383201266

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html




Unidades