animación: [ EDO Taylor 3t ] [ Runge Kutta dy/dx ] [ Sistemas EDO con RK ]
Solo para fines didácticos, y como complemento para los ejercicios presentados en la unidad para la solución de Ecuaciones Diferenciales Ordinarias, 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.
animación: [ EDO Taylor 3t ] [ Runge Kutta dy/dx ] [ Sistemas EDO con RK ]
EDO con Taylor de 3 términos
Tabla de resultados:
EDO con Taylor 3 términos [xi, yi, d1yi, d2yi, término 1, término 2 ] [[0. 1. 0. 0. 0. 0. ] [0.1 1.215 2. 3. 0.2 0.015 ] [0.2 1.461025 2.305 3.105 0.2305 0.015525 ] [0.3 1.73923262 2.621025 3.221025 0.2621025 0.01610513] [0.4 2.05090205 2.94923262 3.34923262 0.29492326 0.01674616] [0.5 2.39744677 3.29090205 3.49090205 0.32909021 0.01745451]] >>>
Instrucciones en Python
# EDO. Método de Taylor con3 términos # estima solucion para muestras separadas h en eje x # valores iniciales x0,y0 import numpy as np def edo_taylor3t(d1y,d2y,x0,y0,h,muestras, vertabla=False, precision=6): ''' solucion a EDO usando tres términos de Taylor, x0,y0 son valores iniciales, h es el tamaño de paso, muestras es la cantidad de puntos a calcular. ''' tamano = muestras + 1 tabla = np.zeros(shape=(tamano,6),dtype=float) # incluye el punto [x0,y0] tabla[0] = [x0,y0,0,0,0,0] x = x0 y = y0 for i in range(1,tamano,1): d1yi = d1y(x,y) d2yi = d2y(x,y) y = y + h*d1yi + ((h**2)/2)*d2yi x = x + h term1 = h*d1yi term2 = ((h**2)/2)*d2yi tabla[i] = [x,y,d1yi,d2yi,term1,term2] if vertabla==True: titulo = ' [xi, yi, d1yi, d2yi,' titulo = titulo + ' término 1, término 2 ]' np.set_printoptions(precision) print(' EDO con Taylor 3 términos') print(titulo) print(tabla) return(tabla) # PROGRAMA ----------------- # Ref Rodriguez 9.1.1 p335 ejemplo. # prueba y'-y-x+(x**2)-1 =0, y(0)=1 # INGRESO. # d1y = y', d2y = y'' d1y = lambda x,y: y - x**2 + x + 1 d2y = lambda x,y: y - x**2 - x + 2 x0 = 0 y0 = 1 h = 0.1 muestras = 5 # PROCEDIMIENTO tabla = edo_taylor3t(d1y,d2y,x0,y0,h,muestras, vertabla=True) # SALIDA ##print(' EDO con Taylor 3 términos') ##print(' [xi, yi, d1yi,', ## ' d2yi, término 1, término 2 ]') ##print(tabla) # GRAFICA import matplotlib.pyplot as plt xi = tabla[:,0] yi = tabla[:,1] plt.plot(xi,yi) plt.plot(xi[0],yi[0],'o', color='r', label ='[x0,y0]') plt.plot(xi[1:],yi[1:],'o', color='g', label ='y estimada') plt.title('EDO: Solución con Taylor 3 términos') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.grid() #plt.show() #comentar para la siguiente gráfica # GRAFICA CON ANIMACION -------- # import matplotlib.pyplot as plt import matplotlib.animation as animation unmetodo = 'Edo con Taylor 3 términos' narchivo = 'EdoTaylor3t' # nombre archivo GIF muestras = 51 # Puntos para la gráfica a = xi[0] b = xi[1] term1 = tabla[:,4] term2 = tabla[:,5] dfi = tabla[:,2] n = len(xi) # Parametros de trama/foto retardo = 1000 # milisegundos entre tramas tramas = len(xi) # GRAFICA animada en fig_ani fig_ani, graf_ani = plt.subplots() ymax = np.max([yi[0],yi[2]]) ymin = np.min([yi[0],yi[2]]) deltax = np.abs(xi[2]-xi[0]) deltay = np.abs(yi[2]-yi[0]) graf_ani.set_xlim([xi[0],xi[2]+0.05*deltax]) graf_ani.set_ylim([ymin-0.05*deltay,ymax+0.05*deltay]) # Lineas y puntos base linea_fx, = graf_ani.plot(xi, yi,color='blue', linestyle='dashed') puntof, = graf_ani.plot(xi[0], yi[0],'o', color='green', label='xi,yi') puntoa, = graf_ani.plot(xi[0], yi[0],'o', color='Blue') puntob, = graf_ani.plot(xi[1], yi[1],'o', color='orange') linea_h, = graf_ani.plot(xi, xi, color='orange', label='h', linestyle='dashed') linea_term1, = graf_ani.plot(xi, xi, color='green',label="h*y'[i]", linestyle='dashed') linea_term2, = graf_ani.plot(xi, yi, linewidth=4, color='magenta', label="((h**2)/2!)*y''[i]") # Aproximacion con tangente b0 = yi[0] - dfi[1]*xi[0] tangentei = dfi[1]*xi + b0 linea_tang, = graf_ani.plot(xi, tangentei, color='dodgerblue', label="tangente", linestyle='dotted') # Cuadros de texto en gráfico txt_i = graf_ani.text(xi[0], yi[0]+0.03*deltay,'[x[i],y[i]]', horizontalalignment='center') txt_i1 = graf_ani.text(xi[1], xi[1]+0.03*deltay,'[x[i+1],y[i+1]]', horizontalalignment='center') # Configura gráfica graf_ani.axhline(0, color='black') # Linea horizontal en cero graf_ani.set_title(unmetodo) graf_ani.set_xlabel('x') graf_ani.set_ylabel('f(x)') graf_ani.legend() graf_ani.grid() # Nueva Trama def unatrama(i,xi,yi,dfi,term1,term2): if i>1: ymax = np.max([yi[0:i+2]]) ymin = np.min([yi[0:i+2]]) deltax = np.abs(xi[i+1]-xi[0]) deltay = np.abs(ymax-ymin) graf_ani.set_xlim([xi[0]-0.05*deltax,xi[i+1]+0.05*deltax]) graf_ani.set_ylim([ymin-0.05*deltay,ymax+0.1*deltay]) else: ymax = np.max([yi[0],yi[2]]) ymin = np.min([yi[0],yi[2]]) deltax = np.abs(xi[2]-xi[0]) deltay = np.abs(ymax-ymin) graf_ani.set_xlim([xi[0]-0.05*deltax,xi[2]+0.05*deltax]) graf_ani.set_ylim([ymin-0.05*deltay,ymax+0.1*deltay]) # actualiza cada punto puntoa.set_xdata(xi[i]) puntoa.set_ydata(yi[i]) puntob.set_xdata(xi[i+1]) puntob.set_ydata(yi[i+1]) puntof.set_xdata(xi[0:i]) puntof.set_ydata(yi[0:i]) # actualiza cada linea linea_fx.set_xdata(xi[0:i+1]) linea_fx.set_ydata(yi[0:i+1]) linea_h.set_xdata([xi[i],xi[i+1]]) linea_h.set_ydata([yi[i],yi[i]]) linea_term1.set_xdata([xi[i+1],xi[i+1]]) linea_term1.set_ydata([yi[i],yi[i]+term1[i+1]]) linea_term2.set_xdata([xi[i+1],xi[i+1]]) linea_term2.set_ydata([yi[i]+term1[i+1], yi[i]+term1[i+1]+term2[i+1]]) b0 = yi[i] - dfi[i+1]*xi[i] tangentei = dfi[i+1]*xi + b0 linea_tang.set_ydata(tangentei) # actualiza texto txt_i.set_position([xi[i], yi[i]+0.03*deltay]) txt_i1.set_position([xi[i+1], yi[i+1]+0.03*deltay]) return (puntoa,puntob,puntof, linea_fx,linea_h,linea_tang, linea_term1,linea_term2, txt_i,txt_i1,) # Limpia Trama anterior def limpiatrama(): puntoa.set_ydata(np.ma.array(xi, mask=True)) puntob.set_ydata(np.ma.array(xi, mask=True)) puntof.set_ydata(np.ma.array(xi, mask=True)) linea_h.set_ydata(np.ma.array(xi, mask=True)) linea_term1.set_ydata(np.ma.array(xi, mask=True)) linea_term2.set_ydata(np.ma.array(xi, mask=True)) linea_tang.set_ydata(np.ma.array(xi, mask=True)) return (puntoa,puntob,puntof, linea_fx,linea_h,linea_tang, linea_term1,linea_term2, txt_i,txt_i1,) # Trama contador i = np.arange(0,tramas-1,1) ani = animation.FuncAnimation(fig_ani, unatrama, i , fargs = (xi,yi,dfi,term1,term2), init_func = limpiatrama, interval = retardo, blit=False) # Graba Archivo GIFAnimado y video ani.save(narchivo+'_GIFanimado.gif', writer='imagemagick') # ani.save(narchivo+'_video.mp4') plt.draw() plt.show()
animación: [ EDO Taylor 3t ] [ Runge Kutta dy/dx ] [ Sistemas EDO con RK ]
Runge Kutta de 2do Orden para primera derivada
EDO con Runge-Kutta 2do Orden primera derivada [xi, yi, K1, K2 ] [[0. 1. 0. 0. ] [0.1 1.2145 0.2 0.229 ] [0.2 1.459973 0.23045 0.260495] [0.3 1.73757 0.261997 0.293197] [0.4 2.048564 0.294757 0.327233] [0.5 2.394364 0.328856 0.362742]]
Instrucciones en Python
# EDO. Método de Runge-Kutta 2do Orden primera derivada # estima solucion para muestras separadas h en eje x # valores iniciales x0,y0 import numpy as np def rungekutta2(d1y,x0,y0,h,muestras, vertabla=False, precision=6): ''' solucion a EDO con Runge-Kutta 2do Orden primera derivada, x0,y0 son valores iniciales muestras es la cantidad de puntos a calcular con tamaño de paso h. ''' # Runge Kutta de 2do orden tamano = muestras + 1 tabla = np.zeros(shape=(tamano,2+2),dtype=float) # incluye el punto [x0,y0] tabla[0] = [x0,y0,0,0] xi = x0 yi = y0 for i in range(1,tamano,1): K1 = h * d1y(xi,yi) K2 = h * d1y(xi+h, yi + K1) yi = yi + (1/2)*(K1+K2) xi = xi + h tabla[i] = [xi,yi,K1,K2] if vertabla==True: np.set_printoptions(precision) titulo = ' [xi, yi, K1, K2 ]' print(' EDO con Runge-Kutta 2do Orden primera derivada') print(titulo) print(tabla) return(tabla) # PROGRAMA ----------------- # Ref Rodriguez 9.1.1 p335 ejemplo. # prueba y'-y-x+(x**2)-1 =0, y(0)=1 # INGRESO. # d1y = y', d2y = y'' d1y = lambda x,y: y - x**2 + x + 1 d2y = lambda x,y: y - x**2 - x + 2 x0 = 0 y0 = 1 h = 0.1 muestras = 5 # PROCEDIMIENTO tabla = rungekutta2(d1y,x0,y0,h,muestras, vertabla=True) # SALIDA ##print(' EDO con Runge-Kutta 2do Orden primera derivada') ##print(' [xi, yi, d1yi,',', K1, K2 ]') ##print(tabla) # GRAFICA import matplotlib.pyplot as plt xi = tabla[:,0] yi = tabla[:,1] plt.plot(xi,yi) plt.plot(xi[0],yi[0],'o', color='r', label ='[x0,y0]') plt.plot(xi[1:],yi[1:],'o', color='g', label ='y estimada') plt.title('EDO: Solución Runge-Kutta 2do Orden primera derivada') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.grid() #plt.show() #comentar para la siguiente gráfica # GRAFICA CON ANIMACION -------- # import matplotlib.pyplot as plt import matplotlib.animation as animation unmetodo = 'EDO: Runge-Kutta 2do Orden primera derivada' narchivo = 'EdoRK2df' # nombre archivo GIF muestras = 51 # Puntos para la gráfica a = xi[0] b = xi[1] K1 = tabla[:,2] K2 = tabla[:,3] n = len(xi) # Parametros de trama/foto retardo = 1000 # milisegundos entre tramas tramas = len(xi) # GRAFICA animada en fig_ani fig_ani, graf_ani = plt.subplots() ymax = np.max([yi[0],yi[2]]) ymin = np.min([yi[0],yi[2]]) deltax = np.abs(xi[2]-xi[0]) deltay = np.abs(yi[2]-yi[0]) graf_ani.set_xlim([xi[0]-0.05*deltax,xi[2]+0.05*deltax]) graf_ani.set_ylim([ymin-0.05*deltay,ymax+0.1*deltay]) # Lineas y puntos base linea_fx, = graf_ani.plot(xi, yi,color='blue', linestyle='dashed') puntof, = graf_ani.plot(xi[0], yi[0],'o', color='green', label='xi,yi') puntoa, = graf_ani.plot(xi[0], yi[0],'o', color='Blue') puntob, = graf_ani.plot(xi[1], yi[1],'o', color='orange') linea_h, = graf_ani.plot(xi, xi, color='orange', label='h', linestyle='dashed') linea_K1, = graf_ani.plot(xi-0.02*deltax, xi-0.02*deltax, color='green',label="K1", linestyle='dashed') linea_K2, = graf_ani.plot(xi+0.02*deltax, yi, color='magenta', label="K2", linestyle='dashed') linea_K12, = graf_ani.plot(xi, yi, color='magenta') # Cuadros de texto en gráfico txt_i = graf_ani.text(xi[0], yi[0]+0.05*deltay,'[x[i],y[i]]', horizontalalignment='center') txt_i1 = graf_ani.text(xi[1], xi[1]+0.05*deltay,'[x[i+1],y[i+1]]', horizontalalignment='center') # Configura gráfica graf_ani.axhline(0, color='black') # Linea horizontal en cero graf_ani.set_title(unmetodo) graf_ani.set_xlabel('x') graf_ani.set_ylabel('f(x)') graf_ani.legend() graf_ani.grid() # Nueva Trama def unatrama(i,xi,yi,term1,term2): if i>1: ymax = np.max([yi[0:i+2]]) ymin = np.min([yi[0:i+2]]) deltax = np.abs(xi[i+1]-xi[0]) deltay = np.abs(ymax-ymin) graf_ani.set_xlim([xi[0]-0.05*deltax,xi[i+1]+0.05*deltax]) graf_ani.set_ylim([ymin-0.05*deltay,ymax+0.1*deltay]) else: ymax = np.max([yi[0],yi[2]]) ymin = np.min([yi[0],yi[2]]) deltax = np.abs(xi[2]-xi[0]) deltay = np.abs(ymax-ymin) graf_ani.set_xlim([xi[0]-0.05*deltax,xi[2]+0.05*deltax]) graf_ani.set_ylim([ymin-0.05*deltay,ymax+0.1*deltay]) # actualiza cada punto puntoa.set_xdata(xi[i]) puntoa.set_ydata(yi[i]) puntob.set_xdata(xi[i+1]) puntob.set_ydata(yi[i+1]) puntof.set_xdata(xi[0:i]) puntof.set_ydata(yi[0:i]) # actualiza cada linea linea_fx.set_xdata(xi[0:i+1]) linea_fx.set_ydata(yi[0:i+1]) linea_h.set_xdata([xi[i],xi[i+1]]) linea_h.set_ydata([yi[i],yi[i]]) linea_K1.set_xdata([xi[i+1]-0.02*deltax,xi[i+1]-0.02*deltax]) linea_K1.set_ydata([yi[i],yi[i]+K1[i+1]]) linea_K2.set_xdata([xi[i+1]+0.02*deltax,xi[i+1]+0.02*deltax]) linea_K2.set_ydata([yi[i],yi[i]+K2[i+1]]) linea_K12.set_xdata([xi[i+1]-0.02*deltax,xi[i+1]+0.02*deltax]) linea_K12.set_ydata([yi[i]+K1[i+1],yi[i]+K2[i+1]]) # actualiza texto txt_i.set_position([xi[i], yi[i]+0.05*deltay]) txt_i1.set_position([xi[i+1], yi[i+1]+0.05*deltay]) return (puntoa,puntob,puntof, linea_fx,linea_h,linea_K1,linea_K2,linea_K12, txt_i,txt_i1,) # Limpia Trama anterior def limpiatrama(): puntoa.set_ydata(np.ma.array(xi, mask=True)) puntob.set_ydata(np.ma.array(xi, mask=True)) puntof.set_ydata(np.ma.array(xi, mask=True)) linea_h.set_ydata(np.ma.array(xi, mask=True)) linea_K1.set_ydata(np.ma.array(xi, mask=True)) linea_K2.set_ydata(np.ma.array(xi, mask=True)) linea_K12.set_ydata(np.ma.array(xi, mask=True)) return (puntoa,puntob,puntof, linea_fx,linea_h,linea_K1,linea_K2,linea_K12, txt_i,txt_i1,) # Trama contador i = np.arange(0,tramas-1,1) ani = animation.FuncAnimation(fig_ani, unatrama, i , fargs = (xi,yi,K1,K2), init_func = limpiatrama, interval = retardo, blit=False) # Graba Archivo GIFAnimado y video ani.save(narchivo+'_GIFanimado.gif', writer='imagemagick') # ani.save(narchivo+'_video.mp4') plt.draw() plt.show()
animación: [ EDO Taylor 3t ] [ Runge Kutta dy/dx ] [ Sistemas EDO con RK ]
..
Sistemas EDO. modelo depredador-presa con Runge-Kutta 2do Orden
.
Instrucciones en Python
# Modelo predador-presa de Lotka-Volterra # Sistemas EDO con Runge Kutta de 2do Orden import numpy as np def rungekutta2_fg(f,g,x0,y0,z0,h,muestras, vertabla=False, precision = 6): ''' solucion a EDO con Runge-Kutta 2do Orden Segunda derivada, x0,y0 son valores iniciales, h es tamano de paso, muestras es la cantidad de puntos a calcular. ''' tamano = muestras + 1 tabla = np.zeros(shape=(tamano,3+4),dtype=float) # incluye el punto [x0,y0,z0] tabla[0] = [x0,y0,z0,0,0,0,0] xi = x0 yi = y0 zi = z0 i=0 if vertabla==True: print('Runge-Kutta Segunda derivada') print('i ','[ xi, yi, zi',']') print(' [ K1y, K1z, K2y, K2z ]') np.set_printoptions(precision) print(i,tabla[i,0:3]) print(' ',tabla[i,3:]) for i in range(1,tamano,1): K1y = h * f(xi,yi,zi) K1z = h * g(xi,yi,zi) K2y = h * f(xi+h, yi + K1y, zi + K1z) K2z = h * g(xi+h, yi + K1y, zi + K1z) yi = yi + (K1y+K2y)/2 zi = zi + (K1z+K2z)/2 xi = xi + h tabla[i] = [xi,yi,zi,K1y,K1z,K2y,K2z] if vertabla==True: txt = ' ' if i>=10: txt=' ' print(str(i)+'',tabla[i,0:3]) print(txt,tabla[i,3:]) return(tabla) # PROGRAMA ------------------ # INGRESO # Parámetros de las ecuaciones a = 0.5 b = 0.7 c = 0.35 d = 0.35 # Ecuaciones f = lambda t,x,y : a*x -b*x*y g = lambda t,x,y : -c*y + d*x*y # Condiciones iniciales t0 = 0 x0 = 2 y0 = 1 # parámetros del algoritmo h = 0.5 muestras = 101 # PROCEDIMIENTO tabla = rungekutta2_fg(f,g,t0,x0,y0,h,muestras,vertabla=True) ti = tabla[:,0] xi = tabla[:,1] yi = tabla[:,2] # SALIDA print('Sistemas EDO: Modelo presa-predador') ##np.set_printoptions(precision=6) ##print(' [ ti, xi, yi]') ##print(tabla[:,0:4]) # GRAFICA tiempos vs población import matplotlib.pyplot as plt fig_t, (graf1,graf2) = plt.subplots(2) fig_t.suptitle('Modelo predador-presa') graf1.plot(ti,xi, color='blue',label='xi presa') #graf1.set_xlabel('t tiempo') graf1.set_ylabel('población x') graf1.legend() graf1.grid() graf2.plot(ti,yi, color='orange',label='yi predador') graf2.set_xlabel('t tiempo') graf2.set_ylabel('población y') graf2.legend() graf2.grid() # gráfica xi vs yi fig_xy, graf3 = plt.subplots() graf3.plot(xi,yi) graf3.set_title('Modelo presa-predador [xi,yi]') graf3.set_xlabel('x presa') graf3.set_ylabel('y predador') graf3.grid() #plt.show() # GRAFICA CON ANIMACION -------- # import matplotlib.pyplot as plt import matplotlib.animation as animation xi = tabla[:,0] yi = tabla[:,1] zi = tabla[:,2] unmetodo = 'Sistemas EDO Presa-Predador con Runge-Kutta' narchivo = 'EdoPresaPredador' # nombre archivo GIF muestras = 51 # Puntos para la gráfica a = xi[0] b = xi[1] n = len(ti) # Parametros de trama/foto retardo = 1000 # milisegundos entre tramas tramas = len(xi) # GRAFICA animada en fig_ani fig_ani, (graf1_ani,graf2_ani) = plt.subplots(2) ymax = np.max([yi[0],yi[2]]) ymin = np.min([yi[0],yi[2]]) deltax = np.abs(xi[2]-xi[0]) deltay = np.abs(yi[2]-yi[0]) graf1_ani.set_xlim([xi[0],xi[2]+0.05*deltax]) graf1_ani.set_ylim([ymin-0.05*deltay,ymax+0.05*deltay]) zmax = np.max([zi[0],zi[2]]) zmin = np.min([zi[0],zi[2]]) deltax = np.abs(xi[2]-xi[0]) deltaz = np.abs(zi[2]-zi[0]) graf2_ani.set_xlim([xi[0],xi[2]+0.05*deltax]) graf2_ani.set_ylim([zmin-0.05*deltaz,zmax+0.05*deltaz]) # Lineas y puntos base linea_fx, = graf1_ani.plot(xi, yi,color='blue', linestyle='dashed') puntof, = graf1_ani.plot(xi[0], yi[0],'o', color='blue', label='xi,yi') puntoa, = graf1_ani.plot(xi[0], yi[0],'o', color='green') puntob, = graf1_ani.plot(xi[1], yi[1],'o', color='dodgerblue') linea_h, = graf1_ani.plot(xi, xi, color='green', label='h', linestyle='dashed') linea_term1, = graf1_ani.plot(xi, xi, color='dodgerblue',label="(K1y+K2y)/2", linestyle='dashed') # Cuadros de texto en gráfico #txt_i = graf1_ani.text(xi[0], yi[0]+0.03*deltay,'[x[i],y[i]]', # horizontalalignment='center') #txt_i1 = graf1_ani.text(xi[1], xi[1]+0.03*deltay,'[x[i+1],y[i+1]]', # horizontalalignment='center') linea_gx, = graf2_ani.plot(xi, zi,color='orange', linestyle='dashed') puntog, = graf2_ani.plot(xi[0], zi[0],'o', color='orange', label='xi,zi') puntog_a, = graf2_ani.plot(xi[0], zi[0],'o', color='green') puntog_b, = graf2_ani.plot(xi[1], zi[1],'o', color='red') lineag_h, = graf2_ani.plot(xi, xi, color='green', label='h', linestyle='dashed') lineag_term1, = graf2_ani.plot(xi, xi, color='red',label="(K1z+K2z)/2", linestyle='dashed') # Configura gráfica graf1_ani.axhline(0, color='black') # Linea horizontal en cero graf1_ani.set_title(unmetodo) graf1_ani.set_xlabel('x') graf1_ani.set_ylabel('y(x)') graf1_ani.legend() graf1_ani.grid() graf2_ani.axhline(0, color='black') # Linea horizontal en cero #graf2_ani.set_title(unmetodo) graf2_ani.set_xlabel('x') graf2_ani.set_ylabel('z(x)') graf2_ani.legend() graf2_ani.grid() # Nueva Trama def unatrama(i,xi,yi,zi): if i>1: ymax = np.max([yi[0:i+2]]) ymin = np.min([yi[0:i+2]]) deltax = np.abs(xi[i+1]-xi[0]) deltay = np.abs(ymax-ymin) graf1_ani.set_xlim([xi[0]-0.05*deltax,xi[i+1]+0.05*deltax]) graf1_ani.set_ylim([ymin-0.05*deltay,ymax+0.1*deltay]) zmax = np.max([zi[0:i+2]]) zmin = np.min([zi[0:i+2]]) deltaz = np.abs(zmax-zmin) graf2_ani.set_xlim([xi[0]-0.05*deltax,xi[i+1]+0.05*deltax]) graf2_ani.set_ylim([zmin-0.05*deltaz,zmax+0.1*deltaz]) else: ymax = np.max([yi[0:2]]) ymin = np.min([yi[0:2]]) deltax = np.abs(xi[2]-xi[0]) deltay = np.abs(ymax-ymin) graf1_ani.set_xlim([xi[0]-0.05*deltax,xi[2]+0.05*deltax]) graf1_ani.set_ylim([ymin-0.05*deltay,ymax+0.1*deltay]) zmax = np.max([zi[0:2]]) zmin = np.min([zi[0:2]]) deltaz = np.abs(zmax-zmin) graf2_ani.set_xlim([xi[0]-0.05*deltax,xi[2]+0.05*deltax]) graf2_ani.set_ylim([zmin-0.05*deltaz,zmax+0.1*deltaz]) # actualiza cada punto puntoa.set_xdata(xi[i]) puntoa.set_ydata(yi[i]) puntob.set_xdata(xi[i+1]) puntob.set_ydata(yi[i+1]) puntof.set_xdata(xi[0:i]) puntof.set_ydata(yi[0:i]) # actualiza cada linea linea_fx.set_xdata(xi[0:i+1]) linea_fx.set_ydata(yi[0:i+1]) linea_h.set_xdata([xi[i],xi[i+1]]) linea_h.set_ydata([yi[i],yi[i]]) linea_term1.set_xdata([xi[i+1],xi[i+1]]) linea_term1.set_ydata([yi[i],yi[i+1]]) # actualiza texto #txt_i.set_position([xi[i], yi[i]+0.03*deltay]) #txt_i1.set_position([xi[i+1], yi[i+1]+0.03*deltay]) # actualiza cada punto puntog_a.set_xdata(xi[i]) puntog_a.set_ydata(zi[i]) puntog_b.set_xdata(xi[i+1]) puntog_b.set_ydata(zi[i+1]) puntog.set_xdata(xi[0:i]) puntog.set_ydata(zi[0:i]) # actualiza cada linea linea_gx.set_xdata(xi[0:i+1]) linea_gx.set_ydata(zi[0:i+1]) lineag_h.set_xdata([xi[i],xi[i+1]]) lineag_h.set_ydata([zi[i],zi[i]]) lineag_term1.set_xdata([xi[i+1],xi[i+1]]) lineag_term1.set_ydata([zi[i],zi[i+1]]) return (puntoa,puntob,puntof, linea_fx,linea_h, linea_term1,) #txt_i,txt_i1,) # Limpia Trama anterior def limpiatrama(): puntoa.set_ydata(np.ma.array(xi, mask=True)) puntob.set_ydata(np.ma.array(xi, mask=True)) puntof.set_ydata(np.ma.array(xi, mask=True)) linea_h.set_ydata(np.ma.array(xi, mask=True)) linea_term1.set_ydata(np.ma.array(xi, mask=True)) puntog_a.set_ydata(np.ma.array(xi, mask=True)) puntog_b.set_ydata(np.ma.array(xi, mask=True)) puntog.set_ydata(np.ma.array(xi, mask=True)) lineag_h.set_ydata(np.ma.array(xi, mask=True)) lineag_term1.set_ydata(np.ma.array(xi, mask=True)) return (puntoa,puntob,puntof, linea_fx,linea_h, linea_term1, puntog_a,puntog_b,puntog, linea_gx,lineag_h, lineag_term1,) #txt_i,txt_i1,) # Trama contador i = np.arange(0,tramas-1,1) ani = animation.FuncAnimation(fig_ani, unatrama, i , fargs = (xi,yi,zi), init_func = limpiatrama, interval = retardo, blit=False) # Graba Archivo GIFAnimado y video ani.save(narchivo+'_GIFanimado.gif', writer='imagemagick') # ani.save(narchivo+'_video.mp4') plt.draw() plt.show()
animación: [ EDO Taylor 3t ] [ Runge Kutta dy/dx ] [ Sistemas EDO con RK ]