GIF animado: [ Bisección ] [ Posicion Falsa ] [ Newton-Raphson ] [ Punto Fijo ] [ Secante ]
Solo para fines didácticos, y como complemento para los ejercicios presentados en la unidad para raíces de ecuaciones, se presentan las instrucciones para las animaciones usadas en la presentación de los conceptos y ejercicios. Los algoritmos para animación NO son necesarios para realizar los ejercicios, que requieren una parte analítica con al menos tres iteraciones en papel y lápiz. Se lo adjunta como una herramienta didáctica de asistencia para las clases.
La gráfica (graf_ani
) se crea en una ventana (fig_ani
), inicializando con la linea a partir f(x) y configurando los parámetros base para el gráfico.
Se usan procedimientos para crear unatrama()
para marca de iteración y en cada cambio se limpia la trama manteniendo la base con limpiatrama()
.
En caso de requerir un archivo .gif animado se proporciona un nombre de archivo. Para crear el archivo se requiere de un complemento ‘imagemagick‘ a ser instalado.
otros ejemplos de animación en el curso de Fundamentos de Programación:
Movimiento circular – Una partícula, animación con matplotlib-Python
GIF animado: [ Bisección ] [ Posicion Falsa ] [ Newton-Raphson ] [ Punto Fijo ] [ Secante ]
..
Método de la Bisección con gráfico animado en Python
# Algoritmo de Bisección, Tabla
# Los valores de [a,b] son aceptables
# y seleccionados desde la gráfica de la función
# error = tolera
import numpy as np
def biseccion_tabla(fx,a,b,tolera,iteramax = 20,
vertabla=False, precision=6):
'''Algoritmo de Bisección
Los valores de [a,b] son seleccionados
desde la gráfica de la función
error = tolera
'''
fa = fx(a)
fb = fx(b)
tramo = np.abs(b-a)
itera = 0
cambia = np.sign(fa)*np.sign(fb)
tabla=[]
if cambia<0: # existe cambio de signo f(a) vs f(b)
if vertabla==True:
print('método de Bisección')
print('i', ['a','c','b'],[ 'f(a)', 'f(c)','f(b)'])
print(' ','tramo')
np.set_printoptions(precision)
while (tramo>=tolera and itera<=iteramax):
c = (a+b)/2
fc = fx(c)
cambia = np.sign(fa)*np.sign(fc)
unafila = [a,c,b,fa,fc,fb]
if vertabla==True:
print(itera,[a,c,b],np.array([fa,fc,fb]))
if (cambia<0):
b = c
fb = fc
else:
a = c
fa = fc
tramo = np.abs(b-a)
unafila.append(tramo)
tabla.append(unafila)
if vertabla==True:
print(' ',tramo)
itera = itera + 1
respuesta = c
# Valida respuesta
if (itera>=iteramax):
respuesta = np.nan
else:
print(' No existe cambio de signo entre f(a) y f(b)')
print(' f(a) =',fa,', f(b) =',fb)
respuesta=np.nan
tabla = np.array(tabla,dtype=float)
return(respuesta,tabla)
# PROGRAMA #######################
# INGRESO
fx = lambda x: x**3 + 4*x**2 - 10
a = 1
b = 2
tolera = 0.001
# PROCEDIMIENTO
[raiz,tabla] = biseccion_tabla(fx,a,b,tolera,vertabla=True)
# SALIDA
print('raíz en: ', raiz)
# GRAFICA
import matplotlib.pyplot as plt
muestras = 21
xi = np.linspace(a,b,muestras)
fi = fx(xi)
xc = tabla[:,1]
yc = tabla[:,4]
plt.plot(xi,fi, label='f(x)')
plt.plot([a,b],[fx(a),fx(b)],'o',
color='red',label='[[a,b],[f(a),f(b)]]')
plt.scatter(xc,yc,color='orange', label='[c,f(c)]')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Bisección')
plt.grid()
plt.legend()
#plt.show()
# GRAFICA CON ANIMACION ------------
import matplotlib.animation as animation
xa = tabla[:,0]
ya = tabla[:,3]
xb = tabla[:,2]
yb = tabla[:,5]
xc = tabla[:,1]
yc = tabla[:,4]
# Inicializa parametros de trama/foto
narchivo = 'Biseccion' # nombre archivo
retardo = 700 # milisegundos entre tramas
tramas = len(xa)
# GRAFICA animada en fig_ani
fig_ani, graf_ani = plt.subplots()
ymax = np.max(fi)
ymin = np.min(fi)
deltax = np.abs(b-a)
deltay = np.abs(ymax-ymin)
graf_ani.set_xlim([a-0.05*deltax,b+0.05*deltax])
graf_ani.set_ylim([ymin-0.05*deltay,ymax+0.05*deltay])
# Lineas y puntos base
lineafx,= graf_ani.plot(xi,fi, label='f(x)')
puntoa, = graf_ani.plot(xa[0], ya[0],'o',
color='red', label='a')
puntob, = graf_ani.plot(xb[0], yb[0],'o',
color='green', label='b')
puntoc, = graf_ani.plot(xc[0], yc[0],'o',
color='orange', label='c')
lineaa, = graf_ani.plot([xa[0],xa[0]],
[0,ya[0]],color='red',
linestyle='dashed')
lineab, = graf_ani.plot([xb[0],xb[0]],
[0,yb[0]],color='green',
linestyle='dashed')
lineac, = graf_ani.plot([xc[0],xc[0]],
[0,yc[0]],
color='orange',
linestyle='dashed')
# Configura gráfica
linea0 = graf_ani.axhline(0, color='k')
graf_ani.set_title('Bisección')
graf_ani.set_xlabel('x')
graf_ani.set_ylabel('f(x)')
graf_ani.legend()
graf_ani.grid()
# Cada nueva trama
def unatrama(i,xa,ya,xb,yb,xc,yc):
# actualiza cada punto
puntoa.set_xdata(xa[i])
puntoa.set_ydata(ya[i])
puntob.set_xdata(xb[i])
puntob.set_ydata(yb[i])
puntoc.set_xdata(xc[i])
puntoc.set_ydata(yc[i])
# actualiza cada linea
lineaa.set_ydata([ya[i], 0])
lineaa.set_xdata([xa[i], xa[i]])
lineab.set_ydata([yb[i], 0])
lineab.set_xdata([xb[i], xb[i]])
lineac.set_ydata([yc[i], 0])
lineac.set_xdata([xc[i], xc[i]])
return (puntoa, puntob, puntoc, lineaa, lineab, lineac,)
# Limpia trama anterior
def limpiatrama():
puntoa.set_ydata(np.ma.array(xa, mask=True))
puntob.set_ydata(np.ma.array(xb, mask=True))
puntoc.set_ydata(np.ma.array(xc, mask=True))
lineaa.set_ydata(np.ma.array([0,0], mask=True))
lineab.set_ydata(np.ma.array([0,0], mask=True))
lineac.set_ydata(np.ma.array([0,0], mask=True))
return (puntoa, puntob, puntoc, lineaa, lineab, lineac,)
# contador de tramas
i = np.arange(0,tramas,1)
ani = animation.FuncAnimation(fig_ani,unatrama,
i ,
fargs=(xa, ya,
xb, yb,
xc, yc),
init_func=limpiatrama,
interval=retardo,
blit=True)
# Graba Archivo GIFAnimado y video
ani.save(narchivo+'_animado.gif', writer='imagemagick')
#ani.save(narchivo+'_animado.mp4')
plt.show()
GIF animado: [ Bisección ] [ Posicion Falsa ] [ Newton-Raphson ] [ Punto Fijo ] [ Secante ]
..
Método de la Posición Falsa con gráfico animado en Python
# Algoritmo de falsa posicion para raices
# Los valores de [a,b] son seleccionados
# desde la gráfica de la función
# error = tolera
import numpy as np
def posicionfalsa_tabla(fx,a,b,tolera,iteramax = 20,
vertabla=False, precision=6):
'''fx en forma numérica lambda
Los valores de [a,b] son seleccionados
desde la gráfica de la función
error = tolera
'''
fa = fx(a)
fb = fx(b)
tramo = np.abs(b-a)
itera = 0
cambia = np.sign(fa)*np.sign(fb)
tabla = []
if cambia<0: # existe cambio de signo f(a) vs f(b)
if vertabla==True:
print('método de la Posición Falsa ')
print('i', ['a','c','b'],[ 'f(a)', 'f(c)','f(b)'])
print(' ','tramo')
np.set_printoptions(precision)
while (tramo >= tolera and itera<=iteramax):
c = b - fb*(a-b)/(fa-fb)
fc = fx(c)
cambia = np.sign(fa)*np.sign(fc)
unafila = [a,c,b,fa, fc, fb]
if vertabla==True:
print(itera,np.array([a,c,b]),
np.array([fa,fc,fb]))
if (cambia > 0):
tramo = np.abs(c-a)
a = c
fa = fc
else:
tramo = np.abs(b-c)
b = c
fb = fc
unafila.append(tramo)
tabla.append(unafila)
if vertabla==True:
print(' ',tramo)
itera = itera + 1
respuesta = c
# Valida respuesta
if (itera>=iteramax):
respuesta = np.nan
else:
print(' No existe cambio de signo entre f(a) y f(b)')
print(' f(a) =',fa,', f(b) =',fb)
respuesta=np.nan
tabla = np.array(tabla,dtype=float)
return(respuesta,tabla)
# PROGRAMA ----------------------
# INGRESO
fx = lambda x: x**3 + 4*x**2 - 10
a = 1
b = 2
tolera = 0.001
# PROCEDIMIENTO
[raiz,tabla] = posicionfalsa_tabla(fx,a,b,tolera,
vertabla=True)
# SALIDA
print('raíz en: ', raiz)
# GRAFICA
import matplotlib.pyplot as plt
muestras = 21
xi = np.linspace(a,b,muestras)
fi = fx(xi)
xc = tabla[:,1]
yc = tabla[:,4]
plt.plot(xi,fi, label='f(x)')
plt.plot([a,b],[fx(a),fx(b)],'o',
color='red',label='[[a,b],[f(a),f(b)]]')
plt.scatter(xc,yc,color='orange', label='[c,f(c)]')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Posición Falsa')
plt.grid()
plt.legend()
#plt.show()
# GRAFICA CON ANIMACION ------------
#import matplotlib.pyplot as plt
import matplotlib.animation as animation
xa = tabla[:,0]
ya = tabla[:,3]
xc = tabla[:,1]
yc = tabla[:,4]
xb = tabla[:,2]
yb = tabla[:,5]
# Inicializa parametros de trama/foto
narchivo = 'PosicionFalsa' # nombre archivo
retardo = 700 # milisegundos entre tramas
tramas = len(xa)
# GRAFICA animada en fig_ani
fig_ani, graf_ani = plt.subplots()
graf_ani.set_xlim([a,b])
graf_ani.set_ylim([np.min(fi),np.max(fi)])
# Lineas y puntos base
lineafx, = graf_ani.plot(xi,fi,label ='f(x)')
puntoa, = graf_ani.plot(xa[0], ya[0],'o',
color='red', label='a')
puntob, = graf_ani.plot(xb[0], yb[0],'o',
color='green', label='b')
puntoc, = graf_ani.plot(xc[0], yc[0],'o',
color='orange', label='c')
lineaab, = graf_ani.plot([xa[0],xb[0]],[ya[0],yb[0]],
color ='orange',
label='y=mx+b')
lineac0, = graf_ani.plot([xc[0],xc[0]],[0,yc[0]],
color='magenta',
linestyle='dashed')
# Configura gráfica
linea0 = graf_ani.axhline(0, color='k')
graf_ani.set_title('Posición Falsa')
graf_ani.set_xlabel('x')
graf_ani.set_ylabel('f(x)')
graf_ani.legend()
graf_ani.grid()
# Cada nueva trama
def unatrama(i,xa,ya,xc,yc,xb,yb):
# actualiza cada punto
puntoa.set_xdata(xa[i])
puntoa.set_ydata(ya[i])
puntob.set_xdata(xb[i])
puntob.set_ydata(yb[i])
puntoc.set_xdata(xc[i])
puntoc.set_ydata(yc[i])
# actualiza cada linea
lineaab.set_ydata([ya[i], yb[i]])
lineaab.set_xdata([xa[i], xb[i]])
lineac0.set_ydata([0, yc[i]])
lineac0.set_xdata([xc[i], xc[i]])
return (puntoa, puntob, puntoc, lineaab,lineac0,)
# Cada nueva trama
def limpiatrama():
puntoa.set_ydata(np.ma.array(xa, mask=True))
puntob.set_ydata(np.ma.array(xb, mask=True))
puntoc.set_ydata(np.ma.array(xc, mask=True))
lineaab.set_ydata(np.ma.array([0,0], mask=True))
lineac0.set_ydata(np.ma.array([0,0], mask=True))
return (puntoa, puntob, puntoc, lineaab,lineac0,)
# contador de tramas
i = np.arange(0, tramas,1)
ani = animation.FuncAnimation(fig_ani,unatrama,
i ,
fargs=(xa, ya,
xc, yc,
xb,yb),
init_func=limpiatrama,
interval=retardo,
blit=True)
# Graba Archivo GIFAnimado y video
ani.save(narchivo+'_animado.gif', writer='imagemagick')
#ani.save(narchivo+'.mp4')
plt.show()
GIF animado: [ Bisección ] [ Posicion Falsa ] [ Newton-Raphson ] [ Punto Fijo ] [ Secante ]
..
Método de Newton-Raphson con gráfico animado en Python
# Método de Newton-Raphson
# Ejemplo 1 (Burden ejemplo 1 p.51/pdf.61)
import numpy as np
def newton_raphson_tabla(fx,dfx,xi, tolera, iteramax=100,
vertabla=False, precision=4):
'''
fx y dfx en forma numérica lambda
xi es el punto inicial de búsqueda
'''
itera=0
tramo = abs(2*tolera)
tabla = []
if vertabla==True:
print('método de Newton-Raphson')
print('i', ['xi','fi','dfi', 'xnuevo', 'tramo'])
np.set_printoptions(precision)
while (tramo>=tolera):
fi = fx(xi)
dfi = dfx(xi)
xnuevo = xi - fi/dfi
tramo = abs(xnuevo-xi)
if vertabla==True:
print(itera,np.array([xi,fi,dfi,xnuevo,tramo]))
tabla.append([xi,fi,dfi,xnuevo,tramo])
xi = xnuevo
itera = itera + 1
if itera>=iteramax:
xi = np.nan
print('itera: ',itera,
'No converge,se alcanzó el máximo de iteraciones')
tabla = np.array(tabla,dtype=float)
return(xi,tabla)
# PROGRAMA ----------------------
# INGRESO
fx = lambda x: x**3 + 4*x**2 - 10
dfx = lambda x: 3*(x**2) + 8*x
a = 1
b = 4
x0 = 3
tolera = 0.001
# PROCEDIMIENTO
[raiz,tabla] = newton_raphson_tabla(fx, dfx, x0,
tolera, vertabla=True)
# SALIDA
print('raiz en :', raiz)
# GRAFICA
import matplotlib.pyplot as plt
muestras = 21
xi = np.linspace(a,b,muestras)
fi = fx(xi)
xc = tabla[:,3]
yc = fx(xc)
plt.plot(xi,fi, label='f(x)')
plt.plot(x0,fx(x0),'o',
color='red',label='[x0,f(x0)]')
plt.scatter(xc,yc,color='orange', label='[c,f(c)]')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid()
plt.legend()
#plt.show()
# GRAFICA CON ANIMACION ------------
#import matplotlib.pyplot as plt
import matplotlib.animation as animation
xa = tabla[:,0]
ya = tabla[:,1]
xb = tabla[:,3]
dfi = tabla[:,2]
# Aproximacion con tangente
b0 = ya[0] - dfi[0]*x0
tangentei = dfi[0]*xi + b0
ci = -b0/dfi[0]
# Inicializa parametros de trama/foto
narchivo = 'NewtonRaphson' # nombre archivo
retardo = 700 # milisegundos entre tramas
tramas = len(xa)
# GRAFICA animada en fig_ani
fig_ani, graf_ani = plt.subplots()
graf_ani.set_xlim([a,b])
graf_ani.set_ylim([np.min(fi),np.max(fi)])
# Lineas y puntos base
lineafx, = graf_ani.plot(xi,fi,label ='f(x)')
puntoa, = graf_ani.plot(xa[0], ya[0],'o',
color='red', label='x[i]')
puntob, = graf_ani.plot(xb[0], 0,'o',
color='green', label='x[i+1]')
lineatanx, = graf_ani.plot(xi,tangentei,
color='orange',label='tangente')
lineaa, = graf_ani.plot([xa[0],xa[0]],
[ya[0],0], color='magenta',
linestyle='dashed')
lineab, = graf_ani.plot([xb[0],xb[0]],
[0,fx(xb[0])], color='magenta',
linestyle='dashed')
# Configura gráfica
linea0 = graf_ani.axhline(0, color='k')
graf_ani.set_title('Newton-Raphson')
graf_ani.set_xlabel('x')
graf_ani.set_ylabel('f(x)')
graf_ani.legend()
graf_ani.grid()
# Cada nueva trama
def unatrama(i,xa,ya,xb,dfi):
# actualiza cada punto
puntoa.set_xdata(xa[i])
puntoa.set_ydata(ya[i])
puntob.set_xdata(xb[i])
puntob.set_ydata(0)
# actualiza cada linea
lineaa.set_ydata([ya[i], 0])
lineaa.set_xdata([xa[i], xa[i]])
lineab.set_ydata([0, fx(xb[i])])
lineab.set_xdata([xb[i], xb[i]])
# Aproximacion con tangente
b0 = ya[i] - dfi[i]*xa[i]
tangentei = dfi[i]*xi+b0
lineatanx.set_ydata(tangentei)
return (puntoa, puntob, lineaa, lineab,lineatanx,)
# Limpia trama anterior
def limpiatrama():
puntoa.set_ydata(np.ma.array(xa, mask=True))
puntob.set_ydata(np.ma.array(xb, mask=True))
lineaa.set_ydata(np.ma.array([0,0], mask=True))
lineab.set_ydata(np.ma.array([0,0], mask=True))
lineatanx.set_ydata(np.ma.array(xi, mask=True))
return (puntoa, puntob, lineaa, lineab,lineatanx,)
# contador de tramas
i = np.arange(0,tramas,1)
ani = animation.FuncAnimation(fig_ani,unatrama,
i ,
fargs=(xa, ya,
xb, dfi),
init_func=limpiatrama,
interval=retardo,
blit=True)
# Graba Archivo GIFAnimado y video
ani.save(narchivo+'_animado.gif', writer='imagemagick')
#ani.save(narchivo+'.mp4')
plt.show()
GIF animado: [ Bisección ] [ Posicion Falsa ] [ Newton-Raphson ] [ Punto Fijo ] [ Secante ]
..
Método del Punto Fijo con gráfico animado en Python
Instrucciones en Python
# Algoritmo de punto fijo, Tabla
# Los valores de [a,b] son seleccionados
# desde la gráfica de la función
# error = tolera
import numpy as np
def puntofijo_tabla(gx,a,tolera, iteramax=20,
vertabla=True, precision=6):
'''g(x) se obtiene al despejar una x de f(x)
máximo de iteraciones predeterminado: iteramax
si no converge hasta iteramax iteraciones
la respuesta es NaN (Not a Number)
'''
itera = 0
b = gx(a)
tramo = abs(b-a)
tabla = [[a,b,tramo]]
if vertabla==True:
print('método del Punto Fijo')
print('i', ['xi','gi','tramo'])
np.set_printoptions(precision)
print(itera,np.array([a,b,tramo]))
while(tramo>=tolera and itera<=iteramax):
a = b
b = gx(a)
tramo = abs(b-a)
itera = itera + 1
if vertabla==True:
print(itera,np.array([a,b,tramo]))
tabla.append([a,b,tramo])
respuesta = b
# Valida respuesta
if itera>=iteramax:
respuesta = np.nan
print('itera: ',itera,
'No converge,se alcanzó el máximo de iteraciones')
tabla = np.array(tabla,dtype=float)
return(respuesta,tabla)
# PROGRAMA ----------------------
# INGRESO
fx = lambda x: np.exp(-x) - x
gx = lambda x: np.exp(-x)
a = 0
b = 1
tolera = 0.001
# PROCEDIMIENTO
[raiz,tabla] = puntofijo_tabla(gx,a,tolera, vertabla=True)
# SALIDA
print('raiz en :', raiz)
# GRAFICA
import matplotlib.pyplot as plt
muestras = 21
xi = np.linspace(a,b,muestras)
fi = fx(xi)
gi = gx(xi)
yi = xi
plt.plot(xi,fi, label='f(x)',
linestyle='dashed')
plt.plot(xi,gi, label='g(x)')
plt.plot(xi,yi, label='y=x')
plt.axvline(raiz, color='magenta',
linestyle='dotted')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Punto Fijo')
plt.grid()
plt.legend()
#plt.show()
# GRAFICA CON ANIMACION ------------
#import matplotlib.pyplot as plt
import matplotlib.animation as animation
xc = tabla[:,0]
yc = tabla[:,1]
# Inicializa parametros de trama/foto
narchivo = 'PuntoFijo' # nombre archivo
retardo = 700 # milisegundos entre tramas
tramas = len(xc)
# GRAFICA animada en fig_ani
fig_ani, graf_ani = plt.subplots()
dx = np.abs(b-a)
dy = np.abs(gx(b)-gx(a))
graf_ani.set_xlim([a-0.05*dx,b+0.05*dx])
graf_ani.set_ylim([np.min(fi)-0.05*dy,np.max(fi)+0.05*dy])
# Lineas y puntos base
puntoa, = graf_ani.plot(xc[0], yc[0], 'ro')
puntob, = graf_ani.plot(xc[0], xc[0], 'go') # y=x
lineafx, = graf_ani.plot(xi,fi, color='blue',
linestyle='dashed', label='f(x)')
lineagx, = graf_ani.plot(xi,gi, color='orange', label='g(x)')
lineayx, = graf_ani.plot(xi,yi, color='green', label='y=x')
linearaiz = graf_ani.axvline(raiz, color='magenta',linestyle='dotted')
# Configura gráfica
linea0 = graf_ani.axhline(0, color='k')
graf_ani.set_title('Punto Fijo')
graf_ani.set_xlabel('x')
graf_ani.set_ylabel('f(x)')
graf_ani.legend()
graf_ani.grid()
# Cada nueva trama
def unatrama(i,xc,yc):
# actualiza cada punto
puntoa.set_xdata(xc[i])
puntoa.set_ydata(yc[i])
puntob.set_xdata(xc[i]) # y=x
puntob.set_ydata(xc[i])
# actualiza cada flecha
dx = xc[i+1]-xc[i]
dy = yc[i]-xc[i]
flecha01 = graf_ani.arrow(xc[i],xc[i], 0,dy,
length_includes_head = True,
head_width = 0.05*abs(dy),
head_length = 0.1*abs(dy))
flecha02 = graf_ani.arrow(xc[i],yc[i], dx,0,
length_includes_head = True,
head_width = 0.05*abs(dx),
head_length = 0.1*abs(dx))
return (puntoa, puntob, flecha01, flecha02)
# Limpia trama anterior
def limpiatrama():
puntoa.set_ydata(np.ma.array(xc[0], mask=True))
puntob.set_ydata(np.ma.array(xc[0], mask=True))
return (puntoa, puntob)
# contador de tramas
i = np.arange(0, tramas-1,1)
ani = animation.FuncAnimation(fig_ani,unatrama,
i ,
fargs=(xc, yc),
init_func=limpiatrama,
interval=retardo,
blit=True)
# Graba Archivo GIFAnimado y video
ani.save(narchivo+'_animado.gif', writer='imagemagick')
#ani.save(narchivo+'.mp4')
plt.show()
GIF animado: [ Bisección ] [ Posicion Falsa ] [ Newton-Raphson ] [ Punto Fijo ] [ Secante ]
..
Método de la Secante con gráfico animado en Python
Instrucciones en Python
# Método de la secante
# Ejemplo 1 (Burden ejemplo 1 p.51/pdf.61)
import numpy as np
def secante_raiz_tabla(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
'''
xi_1 = a
xi = b
itera = 0
tramo = np.abs(xi-xi_1)
tabla = []
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):
fi_1 = fx(xi_1)
fi = fx(xi)
xi1 = xi-fi*(xi_1 - xi)/(fi_1-fi)
tramo = np.abs(xi1-xi)
if vertabla==True:
print(itera,np.array([xi_1,xi,xi1,fi_1,fi]),tramo)
tabla.append([xi_1,xi,xi1,fi_1,fi])
xi_1 = xi
xi = xi1
itera = itera + 1
if itera>=iteramax:
xi = np.nan
print('itera: ',itera,
'No converge,se alcanzó el máximo de iteraciones')
respuesta = xi
tabla = np.array(tabla,dtype=float)
return(respuesta,tabla)
# PROGRAMA ----------------------
# INGRESO
fx = lambda x: x**3 + 4*x**2 - 10
a = 1
b = 4
c = (a+b)/2
tolera = 0.001
tramos = 100
# PROCEDIMIENTO
[raiz,tabla] = secante_raiz_tabla(fx,c,b,tolera,
vertabla=True)
# SALIDA
print('raiz en :', raiz)
# GRAFICA
import matplotlib.pyplot as plt
muestras = 21
xi = np.linspace(a,b,muestras)
fi = fx(xi)
xc = tabla[:,2]
yc = fx(xc)
plt.plot(xi,fi, label='f(x)')
plt.plot([a,b],[fx(a),fx(b)],'o',
color='red',label='[x0,f(x0)]')
plt.scatter(xc,yc,color='orange', label='[c,f(c)]')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid()
plt.legend()
#plt.show()
# GRÁFICO CON ANIMACION ######
import matplotlib.animation as animation
xa = tabla[:,0]
ya = tabla[:,3]
xb = tabla[:,1]
yb = tabla[:,4]
xc = tabla[:,2]
# Inicializa parametros de trama/foto
narchivo = 'SecanteMetodo' # nombre archivo
retardo = 700 # milisegundos entre tramas
tramas = len(xa)
# GRAFICA animada en fig_ani
fig_ani, graf_ani = plt.subplots()
graf_ani.set_xlim([a,b])
graf_ani.set_ylim([np.min(fi),np.max(fi)])
# Lineas y puntos base
lineafx, = graf_ani.plot(xi,fi,label ='f(x)')
puntoa, = graf_ani.plot(xa[0], ya[0],'o',
color='red', label='x[i-1]')
puntob, = graf_ani.plot(xb[0], yb[0],'o',
color='green', label='x[i]')
puntoc, = graf_ani.plot(xc[0], yc[0],'o',
color='orange', label='x[i+1]')
lineatan1, = graf_ani.plot([xa[0],xb[0]],
[ya[0],yb[0]],
color='orange',label='secante ac')
lineatan2, = graf_ani.plot([xc[0],xb[0]],
[0,yb[0]],
color='orange',label='secante cb')
linea_a, = graf_ani.plot([xa[0],xa[0]],
[ya[0],0], color='magenta',
linestyle='dashed')
linea_b, = graf_ani.plot([xb[0],xb[0]],
[0,yb[0]], color='magenta',
linestyle='dashed')
# Configura gráfica
linea0 = graf_ani.axhline(0, color='k')
graf_ani.set_title('Método de la Secante')
graf_ani.set_xlabel('x')
graf_ani.set_ylabel('f(x)')
graf_ani.legend()
graf_ani.grid()
# Cada nueva trama
def unatrama(i,xa,ya,xb,yb,xc):
# actualiza cada punto
puntoa.set_xdata(xa[i])
puntoa.set_ydata(ya[i])
puntob.set_xdata(xb[i])
puntob.set_ydata(yb[i])
puntoc.set_xdata(xc[i])
puntoc.set_ydata(0)
# actualiza cada linea
linea_a.set_ydata([ya[i], 0])
linea_a.set_xdata([xa[i], xa[i]])
linea_b.set_ydata([0, yb[i]])
linea_b.set_xdata([xb[i], xb[i]])
lineatan1.set_ydata([ya[i], 0])
lineatan1.set_xdata([xa[i], xc[i]])
lineatan2.set_ydata([0, yb[i]])
lineatan2.set_xdata([xc[i], xb[i]])
return (puntoa, puntob, puntoc,
linea_a, linea_b,
lineatan1, lineatan2,)
# Limpia trama anterior
def limpiatrama():
puntoa.set_ydata(np.ma.array(xa, mask=True))
puntob.set_ydata(np.ma.array(xb, mask=True))
puntoc.set_ydata(np.ma.array(xc, mask=True))
linea_a.set_ydata(np.ma.array([0,0], mask=True))
linea_b.set_ydata(np.ma.array([0,0], mask=True))
lineatan1.set_ydata(np.ma.array([0,0], mask=True))
lineatan2.set_ydata(np.ma.array([0,0], mask=True))
return (puntoa, puntob, puntoc,
linea_a, linea_b,
lineatan1, lineatan2,)
# contador de tramas
i = np.arange(0,tramas,1)
ani = animation.FuncAnimation(fig_ani,unatrama,
i ,
fargs=(xa, ya,
xb, yb,
xc),
init_func=limpiatrama,
interval=retardo,
blit=True)
# Graba Archivo GIFAnimado y video
ani.save(narchivo+'_animado.gif', writer='imagemagick')
#ani.save(narchivo+'.mp4')
plt.show()
GIF animado: [ Bisección ] [ Posicion Falsa ] [ Newton-Raphson ] [ Punto Fijo ] [ Secante ]