{"id":10048,"date":"2017-09-07T10:00:45","date_gmt":"2017-09-07T15:00:45","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=10048"},"modified":"2026-03-14T11:20:02","modified_gmt":"2026-03-14T16:20:02","slug":"edo-graficos-animados-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u06\/edo-graficos-animados-python\/","title":{"rendered":"6.5 M\u00e9todos EDO con gr\u00e1ficos animados en Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>animaci\u00f3n:<\/p>\n\n\n\n<p> <a href=\"#edotaylor3t\">EDO Taylor<\/a> 3t<\/p>\n\n\n\n<p><a href=\"#RK1raDerivada\">Runge Kutta<\/a>&nbsp; dy\/dx<\/p>\n\n\n\n<p><a href=\"#RK2daDerivada\">Runge Kutta <\/a>d<sup>2<\/sup>y\/dx<sup>2<\/sup><\/p>\n\n\n\n<p><a href=\"#EDOsistemasRK\">Sistemas EDO<\/a> con RK<\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p>Solo para fines <strong>did\u00e1cticos<\/strong>, y como complemento para los <strong>ejercicios<\/strong> presentados en la unidad para la soluci\u00f3n de Ecuaciones Diferenciales Ordinarias, se presentan las instrucciones para las animaciones usadas en la presentaci\u00f3n de los conceptos y ejercicios.<strong> Los algoritmos para animaci\u00f3n NO son necesarios para realizar los ejercicios<\/strong>, que requieren una parte anal\u00edtica con al menos tres iteraciones en papel y l\u00e1piz. Se lo adjunta como una herramienta did\u00e1ctica de asistencia para las clases.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>animaci\u00f3n:<\/p>\n\n\n\n<p> <a href=\"#edotaylor3t\">EDO Taylor<\/a> 3t<\/p>\n\n\n\n<p><a href=\"#RK1raDerivada\">Runge Kutta<\/a>&nbsp; dy\/dx<\/p>\n\n\n\n<p><a href=\"#RK2daDerivada\">Runge Kutta <\/a>d<sup>2<\/sup>y\/dx<sup>2<\/sup><\/p>\n\n\n\n<p><a href=\"#EDOsistemasRK\">Sistemas EDO<\/a> con RK<\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"edotaylor3t\">EDO con Taylor de 3 t\u00e9rminos<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/09\/EdoTaylor3t_ani.gif\" alt=\"EDO con Taylor 3t\u00e9rminos gr\u00e1fico animado\" class=\"wp-image-22893\" \/><\/figure>\n\n\n\n<p>Tabla de resultados:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>EDO con Taylor 3 t\u00e9rminos\ni,&#091;xi, yi, d1yi, d2yi, t\u00e9rmino 1, t\u00e9rmino 2 ]\n0 &#091;0. 1. 0. 0. 0. 0.]\n1 &#091;0.1   1.215 2.    3.    0.2   0.015]\n2 &#091;0.2      1.461025 2.305    3.105    0.2305   0.015525]\n3 &#091;0.3        1.73923262 2.621025   3.221025   0.2621025  0.01610513]\n4 &#091;0.4        2.05090205 2.94923262 3.34923262 0.29492326 0.01674616]\n5 &#091;0.5        2.39744677 3.29090205 3.49090205 0.32909021 0.01745451]\n6 &#091;0.6        2.78042868 3.64744677 3.64744677 0.36474468 0.01823723]\n7 &#091;0.7        3.20157369 4.02042868 3.82042868 0.40204287 0.01910214]\n8 &#091;0.8        3.66278892 4.41157369 4.01157369 0.44115737 0.02005787]\n9 &#091;0.9        4.16618176 4.82278892 4.22278892 0.48227889 0.02111394]\n10 &#091;1.         4.71408085 5.25618176 4.45618176 0.52561818 0.02228091]\n11 &#091;1.1        5.30905934 5.71408085 4.71408085 0.57140808 0.0235704 ]\n12 &#091;1.2        5.95396057 6.19905934 4.99905934 0.61990593 0.0249953 ]\n13 &#091;1.3        6.65192643 6.71396057 5.31396057 0.67139606 0.0265698 ]\n14 &#091;1.4        7.4064287  7.26192643 5.66192643 0.72619264 0.02830963]\n15 &#091;1.5        8.22130371 7.8464287  6.0464287  0.78464287 0.03023214]\n16 &#091;1.6        9.1007906  8.47130371 6.47130371 0.84713037 0.03235652]\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Instrucciones en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# EDO. M\u00e9todo de Taylor con3 t\u00e9rminos \n# estima solucion para muestras separadas h en eje x\n# valores iniciales x0,y0\nimport numpy as np\n \ndef edo_taylor3t(d1y,d2y,x0,y0,h,muestras,\n                 vertabla=False, precision=6):\n    ''' solucion a EDO usando tres t\u00e9rminos de Taylor,\n    x0,y0 son valores iniciales, h es el tama\u00f1o de paso,\n    muestras es la cantidad de puntos a calcular.\n    '''\n    tamano = muestras + 1\n    tabla = np.zeros(shape=(tamano,6),dtype=float)\n    # incluye el punto &#x5B;x0,y0]\n    tabla&#x5B;0] = &#x5B;x0,y0,0,0,0,0]\n    x = x0\n    y = y0\n    for i in range(1,tamano,1):\n        d1yi = d1y(x,y)\n        d2yi = d2y(x,y)\n        y = y + h*d1yi + ((h**2)\/2)*d2yi\n        x = x + h\n        \n        term1 = h*d1yi\n        term2 = ((h**2)\/2)*d2yi\n        \n        tabla&#x5B;i] = &#x5B;x,y,d1yi,d2yi,term1,term2]\n    if vertabla==True:\n        np.set_printoptions(precision)\n        print(' EDO con Taylor 3 t\u00e9rminos')\n        print('i,&#x5B;xi, yi, d1yi, d2yi, t\u00e9rmino 1, t\u00e9rmino 2 ]')\n        for i in range(0,tamano,1):\n            print(i,tabla&#x5B;i])\n        \n    return(tabla)\n\n \n# PROGRAMA PRUEBA -----------------\n# Ref Rodriguez 9.1.1 p335 ejemplo.\n# prueba y'-y-x+(x**2)-1 =0, y(0)=1\n \n# INGRESO.\n# d1y = y', d2y = y''\nd1y = lambda x,y: y - x**2 + x + 1\nd2y = lambda x,y: y - x**2 - x + 2\nx0 = 0\ny0 = 1\nh = 0.1\nmuestras = 15+1\n \n# PROCEDIMIENTO\ntabla = edo_taylor3t(d1y,d2y,x0,y0,h,muestras)\nn = len(tabla)\n \n# SALIDA\nprint('EDO con Taylor 3 t\u00e9rminos')\nprint('i,&#x5B;xi, yi, d1yi, d2yi, t\u00e9rmino 1, t\u00e9rmino 2 ]')\nfor i in range(0,n,1):\n    print(i,tabla&#x5B;i])\n\n# GRAFICA  --------------------\nimport matplotlib.pyplot as plt\n\ntitulo = 'EDO con Taylor 3 t\u00e9rminos'\ni = muestras # iteraci\u00f3n en gr\u00e1fica\n\ntitulo = titulo+', i='+str(i)\nxi = tabla&#x5B;:,0]\nyi = tabla&#x5B;:,1]\nd1yi = tabla&#x5B;:,2]\nd2yi = tabla&#x5B;:,3]\n\nplt.plot(xi&#x5B;0:i+2],yi&#x5B;0:i+2]) # iteraciones\nplt.plot(xi&#x5B;0],yi&#x5B;0],'o',\n         color='red', label ='&#x5B;x0,y0]')\nplt.plot(xi&#x5B;1:i+2],yi&#x5B;1:i+2],'o',\n         color='green', label ='&#x5B;x&#x5B;i],y&#x5B;i]]')\n\nif i&lt;muestras: # gr\u00e1fica para una iteraci\u00f3n\n    plt.plot(xi&#x5B;i+1],yi&#x5B;i+1],'o',color='orange',\n             label ='&#x5B;x&#x5B;i+1],y&#x5B;i+1]]')\n    plt.plot(xi&#x5B;i:i+3],yi&#x5B;i:i+3],'.',color='gray')\n    plt.plot(xi&#x5B;i:i+2],&#x5B;yi&#x5B;i],yi&#x5B;i]], color='orange',\n             label='h',linestyle='dashed')\n    term_1 = h*d1yi&#x5B;i+1]\n    plt.plot(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]],&#x5B;yi&#x5B;i],yi&#x5B;i]+term_1],\n             color='green',label='term2',linestyle='dashed')\n    term_2 = (h**2)\/2*d2yi&#x5B;i+1]\n    plt.plot(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]],&#x5B;yi&#x5B;i]+term_1,yi&#x5B;i]+term_1+term_2],\n             color='magenta',label='term3',linestyle='dashed')\n# entorno de gr\u00e1fica\nplt.title(titulo)\nplt.xlabel('x')\nplt.ylabel('y')\nplt.legend()\nplt.grid()\nplt.tight_layout()\n# plt.show() #comentar para la siguiente gr\u00e1fica\n\n# GRAFICA CON ANIMACION --------\n# import matplotlib.pyplot as plt\nimport matplotlib.animation as animation\n\nunmetodo = 'Edo con Taylor 3 t\u00e9rminos'\nnarchivo = 'EdoTaylor3t' # nombre archivo GIF\n\n# Puntos para la gr\u00e1fica\na = xi&#x5B;0]\nb = xi&#x5B;1]\nterm1 = tabla&#x5B;:,4]\nterm2 = tabla&#x5B;:,5]\ndfi = tabla&#x5B;:,2]\nn = len(xi)\n\n# Parametros de trama\/foto\nretardo = 1000   # milisegundos entre tramas\ntramas = len(xi)\n\n# GRAFICA animada en fig_ani\nfig_ani, graf_ani = plt.subplots()\nymax = np.max(&#x5B;yi&#x5B;0],yi&#x5B;2]])\nymin = np.min(&#x5B;yi&#x5B;0],yi&#x5B;2]])\ndeltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\ndeltay = np.abs(yi&#x5B;2]-yi&#x5B;0])\ngraf_ani.set_xlim(&#x5B;xi&#x5B;0],xi&#x5B;2]+0.05*deltax])\ngraf_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.05*deltay])\n# Lineas y puntos base\nlinea_fx, = graf_ani.plot(xi, yi,color='blue',\n                          linestyle='dashed')\npuntof, = graf_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                        color='green',\n                        label='xi,yi')\npuntoa, = graf_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                        color='Blue')\npuntob, = graf_ani.plot(xi&#x5B;1], yi&#x5B;1],'o',\n                        color='orange')\n\nlinea_h, = graf_ani.plot(xi, xi, color='orange',\n                         label='h',\n                         linestyle='dashed')\nlinea_term1, = graf_ani.plot(xi, xi,\n                             color='green',label=&quot;h*y'&#x5B;i]&quot;,\n                             linestyle='dashed')\nlinea_term2, = graf_ani.plot(xi, yi, linewidth=4,\n                             color='magenta',\n                             label=&quot;((h**2)\/2!)*y''&#x5B;i]&quot;)\n# Aproximacion con tangente\nb0 = yi&#x5B;0] - dfi&#x5B;1]*xi&#x5B;0]\ntangentei = dfi&#x5B;1]*xi + b0\nlinea_tang, = graf_ani.plot(xi, tangentei, color='dodgerblue',\n                             label=&quot;tangente&quot;,\n                             linestyle='dotted')\n\n# Cuadros de texto en gr\u00e1fico\ntxt_i  = graf_ani.text(xi&#x5B;0], yi&#x5B;0]+0.03*deltay,'&#x5B;x&#x5B;i],y&#x5B;i]]',\n                       horizontalalignment='center')\ntxt_i1 = graf_ani.text(xi&#x5B;1], xi&#x5B;1]+0.03*deltay,'&#x5B;x&#x5B;i+1],y&#x5B;i+1]]',\n                       horizontalalignment='center')\ntxt_titulo = graf_ani.set_title(unmetodo)\n\n# Configura gr\u00e1fica\ngraf_ani.axhline(0, color='black')  # Linea horizontal en cero\ngraf_ani.set_xlabel('x')\ngraf_ani.set_ylabel('f(x)')\ngraf_ani.legend()\ngraf_ani.grid()\n\n# Nueva Trama\ndef unatrama(i,xi,yi,dfi,term1,term2):\n    \n    if i&gt;1:\n        ymax = np.max(&#x5B;yi&#x5B;0:i+2]])\n        ymin = np.min(&#x5B;yi&#x5B;0:i+2]])\n        deltax = np.abs(xi&#x5B;i+1]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;i+1]+0.05*deltax])\n        graf_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n    else:\n        ymax = np.max(&#x5B;yi&#x5B;0],yi&#x5B;2]])\n        ymin = np.min(&#x5B;yi&#x5B;0],yi&#x5B;2]])\n        deltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;2]+0.05*deltax])\n        graf_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n    # actualiza cada punto\n    puntoa.set_xdata(&#x5B;xi&#x5B;i]]) \n    puntoa.set_ydata(&#x5B;yi&#x5B;i]])\n    puntob.set_xdata(&#x5B;xi&#x5B;i+1]]) \n    puntob.set_ydata(&#x5B;yi&#x5B;i+1]])\n    puntof.set_xdata(&#x5B;xi&#x5B;0:i]]) \n    puntof.set_ydata(&#x5B;yi&#x5B;0:i]])\n    # actualiza cada linea\n    linea_fx.set_xdata(xi&#x5B;0:i+1])\n    linea_fx.set_ydata(yi&#x5B;0:i+1])\n    linea_h.set_xdata(&#x5B;xi&#x5B;i],xi&#x5B;i+1]])\n    linea_h.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i]])\n    linea_term1.set_xdata(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]])\n    linea_term1.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i]+term1&#x5B;i+1]])\n    linea_term2.set_xdata(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]])\n    linea_term2.set_ydata(&#x5B;yi&#x5B;i]+term1&#x5B;i+1],\n                           yi&#x5B;i]+term1&#x5B;i+1]+term2&#x5B;i+1]])\n    \n    b0 = yi&#x5B;i] - dfi&#x5B;i+1]*xi&#x5B;i]\n    tangentei = dfi&#x5B;i+1]*xi + b0\n    linea_tang.set_ydata(tangentei)\n    # actualiza texto\n    txt_i.set_position(&#x5B;xi&#x5B;i], yi&#x5B;i]+0.03*deltay])\n    txt_i1.set_position(&#x5B;xi&#x5B;i+1], yi&#x5B;i+1]+0.03*deltay])\n    txt_titulo.set_text(unmetodo+', i='+str(i))\n\n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,linea_tang,\n            linea_term1,linea_term2,\n            txt_i,txt_i1)\n# Limpia Trama anterior\ndef limpiatrama(): \n    puntoa.set_ydata(np.ma.array(xi, mask=True))\n    puntob.set_ydata(np.ma.array(xi, mask=True))\n    puntof.set_ydata(np.ma.array(xi, mask=True))\n    linea_h.set_ydata(np.ma.array(xi, mask=True))\n    linea_term1.set_ydata(np.ma.array(xi, mask=True))\n    linea_term2.set_ydata(np.ma.array(xi, mask=True))\n    linea_tang.set_ydata(np.ma.array(xi, mask=True))\n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,linea_tang,\n            linea_term1,linea_term2,\n            txt_i,txt_i1)\n\n# Trama contador\ni = np.arange(0,tramas-1,1)\nani = animation.FuncAnimation(fig_ani,\n                              unatrama,\n                              i ,\n                              fargs = (xi,yi,dfi,term1,term2),\n                              init_func = limpiatrama,\n                              interval = retardo,\n                              blit=False)\n# Graba Archivo GIFAnimado y video\nani.save(narchivo+'_ani.gif', writer='pillow')\n# ani.save(narchivo+'_video.mp4')\nplt.draw()\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>animaci\u00f3n:<\/p>\n\n\n\n<p> <a href=\"#edotaylor3t\">EDO Taylor<\/a> 3t<\/p>\n\n\n\n<p><a href=\"#RK1raDerivada\">Runge Kutta<\/a>&nbsp; dy\/dx<\/p>\n\n\n\n<p><a href=\"#RK2daDerivada\">Runge Kutta <\/a>d<sup>2<\/sup>y\/dx<sup>2<\/sup><\/p>\n\n\n\n<p><a href=\"#EDOsistemasRK\">Sistemas EDO<\/a> con RK<\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"RK1raDerivada\">Runge Kutta de 2do Orden para primera derivada<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/09\/EdoRK2df_ani.gif\" alt=\"EDO Runge-Kutta 2 orden df\/dx_gr\u00e1fico animado\" class=\"wp-image-22917\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>EDO dy\/dx con Runge-Kutta 2 Orden\ni, &#091;xi,     yi,     K1,    K2]\n0 &#091;0. 1. 0. 0.]\n1 &#091;0.1    1.2145 0.2    0.229 ]\n2 &#091;0.2       1.4599725 0.23045   0.260495 ]\n3 &#091;0.3        1.73756961 0.26199725 0.29319698]\n4 &#091;0.4        2.04856442 0.29475696 0.32723266]\n5 &#091;0.5        2.39436369 0.32885644 0.36274209]\n6 &#091;0.6        2.77652187 0.36443637 0.39988001]\n7 &#091;0.7        3.19675667 0.40165219 0.43881741]\n8 &#091;0.8        3.65696612 0.44067567 0.47974323]\n9 &#091;0.9        4.15924756 0.48169661 0.52286627]\n10 &#091;1.         4.70591856 0.52492476 0.56841723]\n11 &#091;1.1        5.29954001 0.57059186 0.61665104]\n12 &#091;1.2        5.94294171 0.618954   0.6678494 ]\n13 &#091;1.3        6.63925059 0.67029417 0.72232359]\n14 &#091;1.4        7.3919219  0.72492506 0.78041756]\n15 &#091;1.5        8.2047737  0.78319219 0.84251141]\n16 &#091;1.6        9.08202493 0.84547737 0.90902511]<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# EDO dy\/dx. M todo de RungeKutta 2do Orden \n# estima la solucion para muestras espaciadas h en eje x\n# valores iniciales x0,y0, entrega tabla&#x5B;xi,yi,K1,K2]\nimport numpy as np\n \n# INGRESO\n# d1y = y' = f\nd1y = lambda x,y: y -x**2 + x + 1\nx0 = 0\ny0 = 1\nh  = 0.1\nmuestras = 15+1\n \n# algoritmos como funcion\ndef rungekutta2(d1y,x0,y0,h,muestras,\n                vertabla=False,precision=6):\n    '''solucion a EDO dy\/dx, con Runge Kutta de 2do orden\n    d1y es la expresion dy\/dx, tambien planteada como f(x,y),\n    valores iniciales: x0,y0, tamano de paso h.\n    muestras es la cantidad de puntos a calcular. \n    '''\n    tamano = muestras + 1\n    tabla = np.zeros(shape=(tamano,2+2),dtype=float)\n    tabla&#x5B;0] = &#x5B;x0,y0,0,0] # incluye el punto &#x5B;x0,y0]\n     \n    xi = x0 # valores iniciales\n    yi = y0\n    for i in range(1,tamano,1):\n        K1 = h * d1y(xi,yi)\n        K2 = h * d1y(xi+h, yi + K1)\n \n        yi = yi + (K1+K2)\/2\n        xi = xi + h\n         \n        tabla&#x5B;i] = &#x5B;xi,yi,K1,K2]\n        \n    if vertabla==True:\n        np.set_printoptions(precision)\n        print( 'EDO dy\/dx con Runge-Kutta 2 Orden')\n        print('i, &#x5B;xi,     yi,     K1,    K2]')\n        for i in range(0,tamano,1):\n            print(i,tabla&#x5B;i])\n \n    return(tabla)\n \n# PROCEDIMIENTO\ntabla = rungekutta2(d1y,x0,y0,h,muestras)\nn = len(tabla)\n \n# SALIDA\nprint('EDO dy\/dx con Runge-Kutta 2 Orden')\nprint('i, &#x5B;xi,     yi,     K1,    K2]')\nfor i in range(0,n,1):\n    print(i,tabla&#x5B;i])\n\n# GRAFICA  --------------------\nimport matplotlib.pyplot as plt\n \ntitulo = 'EDO dy\/dx con Runge-Kutta 2 Orden'\ni = muestras # iteraci\u00f3n en gr\u00e1fica\n \ntitulo = titulo+', i='+str(i)\nxi = tabla&#x5B;:,0]\nyi = tabla&#x5B;:,1]\nK1 = tabla&#x5B;:,2]\nK2 = tabla&#x5B;:,3]\n \nplt.plot(xi&#x5B;0:i+2],yi&#x5B;0:i+2]) # iteraciones\nplt.plot(xi&#x5B;0],yi&#x5B;0],'o',\n         color='red', label ='&#x5B;x0,y0]')\nplt.plot(xi&#x5B;1:i+2],yi&#x5B;1:i+2],'o',\n         color='green', label ='&#x5B;x&#x5B;i],y&#x5B;i]]')\n \nif i&lt;muestras: # gr\u00e1fica para una iteraci\u00f3n\n    plt.plot(xi&#x5B;i+1],yi&#x5B;i+1],'o',color='orange',\n             label ='&#x5B;x&#x5B;i+1],y&#x5B;i+1]]')\n    plt.plot(xi&#x5B;i:i+3],yi&#x5B;i:i+3],'.',color='gray')\n    plt.plot(xi&#x5B;i:i+2],&#x5B;yi&#x5B;i],yi&#x5B;i]], color='orange',\n             label='h',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]-0.02*h],\n             &#x5B;yi&#x5B;i],yi&#x5B;i]+K1&#x5B;i+1]],\n             color='green',label='K1',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]+0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;yi&#x5B;i],yi&#x5B;i]+K2&#x5B;i+1]],\n             color='magenta',label='K2',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;yi&#x5B;i]+K1&#x5B;i+1],yi&#x5B;i]+K2&#x5B;i+1]],\n             color='magenta')\n# entorno de gr\u00e1fica\nplt.title(titulo)\nplt.xlabel('x')\nplt.ylabel('y')\nplt.legend()\nplt.grid()\nplt.tight_layout()\nplt.show() # plt.show() #comentar para la siguiente gr\u00e1fica\n\n# GRAFICA CON ANIMACION --------\n# import matplotlib.pyplot as plt\nimport matplotlib.animation as animation\n \nunmetodo = 'EDO: Runge-Kutta 2do Orden primera derivada'\nnarchivo = 'EdoRK2df' # nombre archivo GIF\nmuestras = 51\n \n# Puntos para la gr\u00e1fica\na = xi&#x5B;0]\nb = xi&#x5B;1]\nK1 = tabla&#x5B;:,2]\nK2 = tabla&#x5B;:,3]\nn = len(xi)\n \n# Parametros de trama\/foto\nretardo = 1000   # milisegundos entre tramas\ntramas = len(xi)\n \n# GRAFICA animada en fig_ani\nfig_ani, graf_ani = plt.subplots()\nymax = np.max(&#x5B;yi&#x5B;0],yi&#x5B;2]])\nymin = np.min(&#x5B;yi&#x5B;0],yi&#x5B;2]])\ndeltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\ndeltay = np.abs(yi&#x5B;2]-yi&#x5B;0])\ngraf_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;2]+0.05*deltax])\ngraf_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n# Lineas y puntos base\nlinea_fx, = graf_ani.plot(xi, yi,color='blue',\n                          linestyle='dashed')\npuntof, = graf_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                        color='green',\n                        label='xi,yi')\npuntoa, = graf_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                        color='Blue')\npuntob, = graf_ani.plot(xi&#x5B;1], yi&#x5B;1],'o',\n                        color='orange')\n \nlinea_h, = graf_ani.plot(xi, xi, color='orange',\n                         label='h',\n                         linestyle='dashed')\nlinea_K1, = graf_ani.plot(xi-0.02*deltax, xi-0.02*deltax,\n                          color='green',label=&quot;K1&quot;,\n                          linestyle='dashed')\nlinea_K2, = graf_ani.plot(xi+0.02*deltax, yi,\n                          color='magenta',\n                          label=&quot;K2&quot;,\n                          linestyle='dashed')\nlinea_K12, = graf_ani.plot(xi, yi,\n                          color='magenta')\nlinea_tang, = graf_ani.plot(xi&#x5B;0:2], yi&#x5B;0:2],\n                            color='dodgerblue',\n                            linestyle='dotted')\n \n# Cuadros de texto en gr\u00e1fico\ntxt_i  = graf_ani.text(xi&#x5B;0], yi&#x5B;0]+0.05*deltay,'&#x5B;x&#x5B;i],y&#x5B;i]]',\n                       horizontalalignment='center')\ntxt_i1 = graf_ani.text(xi&#x5B;1], xi&#x5B;1]+0.05*deltay,'&#x5B;x&#x5B;i+1],y&#x5B;i+1]]',\n                       horizontalalignment='center')\ntxt_titulo = graf_ani.set_title(unmetodo)\n\n# Configura gr\u00e1fica\ngraf_ani.axhline(0, color='black')  # Linea horizontal en cero\ngraf_ani.set_xlabel('x')\ngraf_ani.set_ylabel('f(x)')\ngraf_ani.legend()\ngraf_ani.grid()\n \n# Nueva Trama\ndef unatrama(i,xi,yi,term1,term2):   \n    if i&gt;1:\n        ymax = np.max(&#x5B;yi&#x5B;0:i+2]])\n        ymin = np.min(&#x5B;yi&#x5B;0:i+2]])\n        deltax = np.abs(xi&#x5B;i+1]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;i+1]+0.05*deltax])\n        graf_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n    else:\n        ymax = np.max(&#x5B;yi&#x5B;0],yi&#x5B;2]])\n        ymin = np.min(&#x5B;yi&#x5B;0],yi&#x5B;2]])\n        deltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;2]+0.05*deltax])\n        graf_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n    # actualiza cada punto\n    puntoa.set_xdata(&#x5B;xi&#x5B;i]]) \n    puntoa.set_ydata(&#x5B;yi&#x5B;i]])\n    puntob.set_xdata(&#x5B;xi&#x5B;i+1]]) \n    puntob.set_ydata(&#x5B;yi&#x5B;i+1]])\n    puntof.set_xdata(xi&#x5B;0:i]) \n    puntof.set_ydata(yi&#x5B;0:i])\n    # actualiza cada linea\n    linea_fx.set_xdata(xi&#x5B;0:i+1])\n    linea_fx.set_ydata(yi&#x5B;0:i+1])\n    linea_h.set_xdata(&#x5B;xi&#x5B;i],xi&#x5B;i+1]])\n    linea_h.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i]])\n    linea_K1.set_xdata(&#x5B;xi&#x5B;i+1]-0.02*deltax,xi&#x5B;i+1]-0.02*deltax])\n    linea_K1.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i]+K1&#x5B;i+1]])\n    linea_K2.set_xdata(&#x5B;xi&#x5B;i+1]+0.02*deltax,xi&#x5B;i+1]+0.02*deltax])\n    linea_K2.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i]+K2&#x5B;i+1]])\n    linea_K12.set_xdata(&#x5B;xi&#x5B;i+1]-0.02*deltax,xi&#x5B;i+1]+0.02*deltax])\n    linea_K12.set_ydata(&#x5B;yi&#x5B;i]+K1&#x5B;i+1],yi&#x5B;i]+K2&#x5B;i+1]])\n    linea_tang.set_xdata(&#x5B;xi&#x5B;i],xi&#x5B;i+1]])\n    linea_tang.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i+1]])\n    # actualiza texto\n    txt_i.set_position(&#x5B;xi&#x5B;i], yi&#x5B;i]+0.05*deltay])\n    txt_i1.set_position(&#x5B;xi&#x5B;i+1], yi&#x5B;i+1]+0.05*deltay])\n    txt_titulo.set_text(unmetodo+', i='+str(i))\n \n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,linea_K1,linea_K2,linea_K12,\n            linea_tang,txt_i,txt_i1,)\n# Limpia Trama anterior\ndef limpiatrama(): \n    puntoa.set_ydata(np.ma.array(xi, mask=True))\n    puntob.set_ydata(np.ma.array(xi, mask=True))\n    puntof.set_ydata(np.ma.array(xi, mask=True))\n    linea_h.set_ydata(np.ma.array(xi, mask=True))\n    linea_K1.set_ydata(np.ma.array(xi, mask=True))\n    linea_K2.set_ydata(np.ma.array(xi, mask=True))\n    linea_K12.set_ydata(np.ma.array(xi, mask=True))\n    linea_tang.set_ydata(np.ma.array(xi, mask=True))\n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,linea_K1,linea_K2,linea_K12,\n            linea_tang,txt_i,txt_i1,)\n \n# Trama contador\ni = np.arange(0,tramas-1,1)\nani = animation.FuncAnimation(fig_ani,\n                              unatrama,\n                              i ,\n                              fargs = (xi,yi,K1,K2),\n                              init_func = limpiatrama,\n                              interval = retardo,\n                              blit=False)\n# Graba Archivo GIFAnimado y video\nani.save(narchivo+'_ani.gif', writer='pillow')\n# ani.save(narchivo+'_video.mp4')\nplt.draw()\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>animaci\u00f3n:<\/p>\n\n\n\n<p> <a href=\"#edotaylor3t\">EDO Taylor<\/a> 3t<\/p>\n\n\n\n<p><a href=\"#RK1raDerivada\">Runge Kutta<\/a>&nbsp; dy\/dx<\/p>\n\n\n\n<p><a href=\"#RK2daDerivada\">Runge Kutta <\/a>d<sup>2<\/sup>y\/dx<sup>2<\/sup><\/p>\n\n\n\n<p><a href=\"#EDOsistemasRK\">Sistemas EDO<\/a> con RK<\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"RK2daDerivada\">Runge Kutta de 2do Orden para Segunda derivada<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/09\/EdoRK_Wingsuit_ani.gif\" alt=\"EDO Runge-Kutta 2Orden d2y\/dx2 gr\u00e1fica animada\" class=\"wp-image-22940\" \/><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# EDO d2y\/dx2. M\u00e9todo de RungeKutta 2do Orden \n# estima la solucion para muestras espaciadas h en eje x\n# valores iniciales x0,y0,z0 entrega tabla&#x5B;xi,yi,zi,K1y,K1z,K2y,K2z]\nimport numpy as np\n \n# INGRESO\n# 2Eva_IT2018_T1 Paracaidista wingsuit\nf = lambda t,y,v: -v # el signo, revisar diagrama cuerpo libre\ng = lambda t,y,v: 9.8 - (0.225\/90)*(v**2)\nt0 = 0\ny0 = 1000\nv0 = 0\nh  = 2\nmuestras = 14+1\n \n# Algoritmo como funci\u00f3n\ndef rungekutta2_fg(f,g,x0,y0,z0,h,muestras,\n                   vertabla=False, precision=6):\n    ''' solucion a EDO d2y\/dx2 con Runge-Kutta 2do Orden,\n    f(x,y,z) = z #= y'\n    g(x,y,z) = expresion d2y\/dx2 con z=y'\n    tambien es solucion a sistemas edo f() y g()\n    x0,y0,z0 son valores iniciales, h es tamano de paso,\n    muestras es la cantidad de puntos a calcular.\n    '''\n    tamano = muestras + 1\n    tabla = np.zeros(shape=(tamano,3+4),dtype=float)\n    # incluye el punto &#x5B;x0,y0,z0,K1y,K1z,K2y,K2z]\n    tabla&#x5B;0] = &#x5B;x0,y0,z0,0,0,0,0]\n     \n    xi = x0 # valores iniciales\n    yi = y0\n    zi = z0\n    for i in range(1,tamano,1):\n        K1y = h * f(xi,yi,zi)\n        K1z = h * g(xi,yi,zi)\n         \n        K2y = h * f(xi+h, yi + K1y, zi + K1z)\n        K2z = h * g(xi+h, yi + K1y, zi + K1z)\n \n        yi = yi + (K1y+K2y)\/2\n        zi = zi + (K1z+K2z)\/2\n        xi = xi + h\n         \n        tabla&#x5B;i] = &#x5B;xi,yi,zi,K1y,K1z,K2y,K2z]\n         \n    if vertabla==True:\n        np.set_printoptions(precision)\n        print('EDO f,g con Runge-Kutta 2 Orden')\n        print('i ','&#x5B; xi,  yi,  zi',']')\n        print('   &#x5B; K1y,  K1z,  K2y,  K2z ]')\n        for i in range(0,tamano,1):  \n            txt = ' '\n            if i&gt;=10:\n                txt = '  '\n            print(str(i),tabla&#x5B;i,0:3])\n            print(txt,tabla&#x5B;i,3:])\n     \n    return(tabla)\n \n# PROCEDIMIENTO\ntabla = rungekutta2_fg(f,g,t0,y0,v0,h,muestras,\n                       vertabla=True, precision=4)\n# SALIDA\n##print('EDO f,g con Runge-Kutta 2 Orden')\n##print('i ','&#x5B; xi,  yi,  zi',']')\n##print('   &#x5B; K1y,  K1z,  K2y,  K2z ]')\n##for i in range(0,tamano,1):  \n##    txt = ' '\n##    if i&gt;=10:\n##        txt = '  '\n##    print(str(i),tabla&#x5B;i,0:3])\n##    print(txt,tabla&#x5B;i,3:])\n\n# GRAFICA ---------------------\nimport matplotlib.pyplot as plt\n \ntitulo = 'EDO Runge-Kutta 2ord - Paracaidista Wingsuit'\ni = muestras # iteraci\u00f3n en gr\u00e1fica\n \ntitulo = titulo+', i='+str(i)\nxi = tabla&#x5B;:,0]\nyi = tabla&#x5B;:,1]\nzi = tabla&#x5B;:,2]\nK1y = tabla&#x5B;:,3]\nK1z = tabla&#x5B;:,4]\nK2y = tabla&#x5B;:,5]\nK2z = tabla&#x5B;:,6]\n \nplt.subplot(211)\nplt.plot(xi&#x5B;0],yi&#x5B;0],'o',\n         color='red', label ='&#x5B;t0,y0]')\nplt.plot(xi&#x5B;1:i+2],yi&#x5B;1:i+2],'o',\n         color='green', label ='&#x5B;t&#x5B;i],y&#x5B;i]]')\nplt.plot(xi&#x5B;0:i+2],yi&#x5B;0:i+2],\n         color='blue',label='y(t)')\nif i&lt;muestras: # gr\u00e1fica para una iteraci\u00f3n\n    plt.plot(xi&#x5B;i+1],yi&#x5B;i+1],'o',color='orange',\n             label ='&#x5B;x&#x5B;i+1],y&#x5B;i+1]]')\n    plt.plot(xi&#x5B;i:i+3],yi&#x5B;i:i+3],'.',color='gray')\n    plt.plot(xi&#x5B;i:i+2],&#x5B;yi&#x5B;i],yi&#x5B;i]], color='orange',\n             label='h',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]-0.02*h],\n             &#x5B;yi&#x5B;i],yi&#x5B;i]+K1y&#x5B;i+1]],\n             color='green',label='K1y',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]+0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;yi&#x5B;i],yi&#x5B;i]+K2y&#x5B;i+1]],\n             color='magenta',label='K2y',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;yi&#x5B;i]+K1y&#x5B;i+1],yi&#x5B;i]+K2y&#x5B;i+1]],\n             color='magenta')\nif np.min(yi&#x5B;0:i+1])&lt;0: # linea 0\n    plt.axhline(0, color='red')\nplt.ylabel('y = Altura')\nplt.title(titulo)\nplt.legend()\nplt.grid()\nplt.tight_layout()\n \nplt.subplot(212)\nplt.plot(xi&#x5B;0],zi&#x5B;0],'o',\n         color='red', label ='&#x5B;t0,v0]')\nplt.plot(xi&#x5B;1:i+2],zi&#x5B;1:i+2],'o',\n         color='green', label ='&#x5B;t&#x5B;i],v&#x5B;i]]')\nplt.plot(xi&#x5B;0:i+2],zi&#x5B;0:i+2],\n         color='green',label='v(t)')\nif i&lt;muestras: # gr\u00e1fica para una iteraci\u00f3n\n    plt.plot(xi&#x5B;i+1],zi&#x5B;i+1],'o',color='orange',\n             label ='&#x5B;t&#x5B;i+1],v&#x5B;i+1]]')\n    plt.plot(xi&#x5B;i:i+3],zi&#x5B;i:i+3],'.',color='gray')\n    plt.plot(xi&#x5B;i:i+2],&#x5B;zi&#x5B;i],zi&#x5B;i]], color='orange',\n             label='h',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]-0.02*h],\n             &#x5B;zi&#x5B;i],zi&#x5B;i]+K1z&#x5B;i+1]],\n             color='green',label='K1z',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]+0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;zi&#x5B;i],zi&#x5B;i]+K2z&#x5B;i+1]],\n             color='magenta',label='K2z',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;zi&#x5B;i]+K1z&#x5B;i+1],zi&#x5B;i]+K2z&#x5B;i+1]],\n             color='magenta')\n \nplt.xlabel('x = tiempo')\nplt.ylabel('z = velocidad')\nplt.legend()\nplt.grid()\nplt.tight_layout()\n \n#plt.show() #comentar para la siguiente gr\u00e1fica\n\n# GRAFICA CON ANIMACION --------\n# import matplotlib.pyplot as plt\nimport matplotlib.animation as animation\n  \nunmetodo = 'EDO Runge-Kutta 2ord - Paracaidista Wingsuit'\nnarchivo = 'EdoRK_Wingsuit' # nombre archivo GIF\nmuestras = 51\n  \n# Puntos para la gr\u00e1fica\nn = len(xi)\n  \n# Parametros de trama\/foto\nretardo = 1000   # milisegundos entre tramas\ntramas = len(xi)\n  \n# GRAFICA animada en fig_ani\nfig_ani, (graf1_ani,graf2_ani) = plt.subplots(2)\nymax = np.max(&#x5B;yi&#x5B;0],yi&#x5B;2]])\nymin = np.min(&#x5B;yi&#x5B;0],yi&#x5B;2]])\ndeltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\ndeltay = np.abs(yi&#x5B;2]-yi&#x5B;0])\ngraf1_ani.set_xlim(&#x5B;xi&#x5B;0],xi&#x5B;2]+0.05*deltax])\ngraf1_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.05*deltay])\n  \nzmax = np.max(&#x5B;zi&#x5B;0],zi&#x5B;2]])\nzmin = np.min(&#x5B;zi&#x5B;0],zi&#x5B;2]])\ndeltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\ndeltaz = np.abs(zi&#x5B;2]-zi&#x5B;0])\ngraf2_ani.set_xlim(&#x5B;xi&#x5B;0],xi&#x5B;2]+0.05*deltax])\ngraf2_ani.set_ylim(&#x5B;zmin-0.05*deltaz,zmax+0.05*deltaz])\n# Lineas y puntos base\nlinea_fx, = graf1_ani.plot(xi, yi,color='blue',\n                           linestyle='dashed')\npuntof, = graf1_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                         color='blue',label='&#x5B;xi,yi]')\npuntoa, = graf1_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                         color='orange')\npuntob, = graf1_ani.plot(xi&#x5B;1], yi&#x5B;1],'o',\n                         color='magenta')\nlinea_h, = graf1_ani.plot(xi, xi, color='orange',\n                          linestyle='dashed',label='h')\nlinea_term1, = graf1_ani.plot(xi, xi,color='magenta',\n                              linestyle='dashed',\n                              label=&quot;(K1y+K2y)\/2&quot;)\n \n# Cuadros de texto en gr\u00e1fico\n#txt_i  = graf1_ani.text(xi&#x5B;0], yi&#x5B;0]+0.03*deltay,'&#x5B;x&#x5B;i],y&#x5B;i]]',\n#                       horizontalalignment='center')\n#txt_i1 = graf1_ani.text(xi&#x5B;1], xi&#x5B;1]+0.03*deltay,'&#x5B;x&#x5B;i+1],y&#x5B;i+1]]',\n#                       horizontalalignment='center')\ntxt_titulo = graf1_ani.set_title(unmetodo)\n  \nlinea_gx, = graf2_ani.plot(xi, zi,color='green',\n                           linestyle='dashed')\npuntog, = graf2_ani.plot(xi&#x5B;0], zi&#x5B;0],'o',\n                         color='green',label='&#x5B;xi,zi]')\npuntog_a, = graf2_ani.plot(xi&#x5B;0], zi&#x5B;0],'o',\n                           color='orange')\npuntog_b, = graf2_ani.plot(xi&#x5B;1], zi&#x5B;1],'o',\n                           color='magenta')\nlineag_h, = graf2_ani.plot(xi, xi, color='orange',\n                           linestyle='dashed',label='h')\nlineag_term1, = graf2_ani.plot(xi, xi,\n                               color='magenta',\n                               linestyle='dashed',\n                               label=&quot;(K1z+K2z)\/2&quot;)\n# Configura gr\u00e1fica\ngraf1_ani.axhline(0, color='black')  # Linea horizontal en cero\ngraf1_ani.set_title(unmetodo)\ngraf1_ani.set_xlabel('x')\ngraf1_ani.set_ylabel('y(x)')\ngraf1_ani.legend()\ngraf1_ani.grid()\n  \ngraf2_ani.axhline(0, color='black')  # Linea horizontal en cero\n#graf2_ani.set_title(unmetodo)\ngraf2_ani.set_xlabel('x')\ngraf2_ani.set_ylabel('z(x)')\ngraf2_ani.legend()\ngraf2_ani.grid()\n  \n# Nueva Trama\ndef unatrama(i,xi,yi,zi):\n      \n    if i&gt;0:\n        ymax = np.max(&#x5B;yi&#x5B;0:i+2]])\n        ymin = np.min(&#x5B;yi&#x5B;0:i+2]])\n        deltax = np.abs(xi&#x5B;i+1]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf1_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;i+1]+0.05*deltax])\n        graf1_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n  \n        zmax = np.max(&#x5B;zi&#x5B;0:i+2]])\n        zmin = np.min(&#x5B;zi&#x5B;0:i+2]])\n        deltaz = np.abs(zmax-zmin)\n        graf2_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;i+1]+0.05*deltax])\n        graf2_ani.set_ylim(&#x5B;zmin-0.05*deltaz,zmax+0.1*deltaz])\n    else:\n        ymax = np.max(&#x5B;yi&#x5B;0:2]])\n        ymin = np.min(&#x5B;yi&#x5B;0:2]])\n        deltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf1_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;2]+0.05*deltax])\n        graf1_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n  \n        zmax = np.max(&#x5B;zi&#x5B;0:2]])\n        zmin = np.min(&#x5B;zi&#x5B;0:2]])\n        deltaz = np.abs(zmax-zmin)\n        graf2_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;2]+0.05*deltax])\n        graf2_ani.set_ylim(&#x5B;zmin-0.05*deltaz,zmax+0.1*deltaz])\n    # actualiza cada punto\n    puntoa.set_xdata(&#x5B;xi&#x5B;i]]) \n    puntoa.set_ydata(&#x5B;yi&#x5B;i]])\n    puntob.set_xdata(&#x5B;xi&#x5B;i+1]]) \n    puntob.set_ydata(&#x5B;yi&#x5B;i+1]])\n    if i&lt;20:\n        puntof.set_xdata(xi&#x5B;0:i]) \n        puntof.set_ydata(yi&#x5B;0:i])\n    # actualiza cada linea\n    linea_fx.set_xdata(xi&#x5B;0:i+1])\n    linea_fx.set_ydata(yi&#x5B;0:i+1])\n    linea_h.set_xdata(&#x5B;xi&#x5B;i],xi&#x5B;i+1]])\n    linea_h.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i]])\n    linea_term1.set_xdata(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]])\n    linea_term1.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i+1]])\n    # actualiza texto\n    #txt_i.set_position(&#x5B;xi&#x5B;i], yi&#x5B;i]+0.03*deltay])\n    #txt_i1.set_position(&#x5B;xi&#x5B;i+1], yi&#x5B;i+1]+0.03*deltay])\n  \n    # actualiza cada punto\n    puntog_a.set_xdata(&#x5B;xi&#x5B;i]]) \n    puntog_a.set_ydata(&#x5B;zi&#x5B;i]])\n    puntog_b.set_xdata(&#x5B;xi&#x5B;i+1]]) \n    puntog_b.set_ydata(&#x5B;zi&#x5B;i+1]])\n    if i&lt;20:\n        puntog.set_xdata(xi&#x5B;0:i]) \n        puntog.set_ydata(zi&#x5B;0:i])\n    # actualiza cada linea\n    linea_gx.set_xdata(xi&#x5B;0:i+1])\n    linea_gx.set_ydata(zi&#x5B;0:i+1])\n    lineag_h.set_xdata(&#x5B;xi&#x5B;i],xi&#x5B;i+1]])\n    lineag_h.set_ydata(&#x5B;zi&#x5B;i],zi&#x5B;i]])\n    lineag_term1.set_xdata(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]])\n    lineag_term1.set_ydata(&#x5B;zi&#x5B;i],zi&#x5B;i+1]])\n    txt_titulo.set_text(unmetodo+', i='+str(i))\n  \n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,\n            linea_term1,\n            puntog_a,puntog_b,puntog,\n            linea_gx,lineag_h,\n            lineag_term1,)\n            #txt_i,txt_i1,)\n \n# Limpia Trama anterior\ndef limpiatrama(): \n    puntoa.set_ydata(np.ma.array(xi, mask=True))\n    puntob.set_ydata(np.ma.array(xi, mask=True))\n    puntof.set_ydata(np.ma.array(xi, mask=True))\n    linea_h.set_ydata(np.ma.array(xi, mask=True))\n    linea_term1.set_ydata(np.ma.array(xi, mask=True))\n  \n    puntog_a.set_ydata(np.ma.array(xi, mask=True))\n    puntog_b.set_ydata(np.ma.array(xi, mask=True))\n    puntog.set_ydata(np.ma.array(xi, mask=True))\n    lineag_h.set_ydata(np.ma.array(xi, mask=True))\n    lineag_term1.set_ydata(np.ma.array(xi, mask=True))\n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,\n            linea_term1,\n            puntog_a,puntog_b,puntog,\n            linea_gx,lineag_h,\n            lineag_term1,)\n            #txt_i,txt_i1,)\n  \n# Trama contador\ni = np.arange(0,tramas-1,1)\nani = animation.FuncAnimation(fig_ani,\n                              unatrama,\n                              i ,\n                              fargs = (xi,yi,zi),\n                              init_func = limpiatrama,\n                              interval = retardo,\n                              blit=False)\n# Graba Archivo GIFAnimado y video\nani.save(narchivo+'_ani.gif', writer='pillow')\n# ani.save(narchivo+'_video.mp4')\nplt.draw()\nplt.show()\n\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>animaci\u00f3n:<\/p>\n\n\n\n<p> <a href=\"#edotaylor3t\">EDO Taylor<\/a> 3t<\/p>\n\n\n\n<p><a href=\"#RK1raDerivada\">Runge Kutta<\/a>&nbsp; dy\/dx<\/p>\n\n\n\n<p><a href=\"#RK2daDerivada\">Runge Kutta <\/a>d<sup>2<\/sup>y\/dx<sup>2<\/sup><\/p>\n\n\n\n<p><a href=\"#EDOsistemasRK\">Sistemas EDO<\/a> con RK<\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"EDOsistemasRK\">Sistemas EDO. modelo depredador-presa con Runge-Kutta 2do Orden<br>.<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/09\/EdoSistemaRK_presapredador_ani.gif\" alt=\"EDO Sistema Runge-Kutta presa-predador gr\u00e1fica animada\" class=\"wp-image-22953\" \/><\/figure>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Modelo predador-presa de Lotka-Volterra\n# Sistemas EDO con Runge Kutta de 2do Orden\nimport numpy as np\n\n# INGRESO\n# Par\u00e1metros de las ecuaciones\na = 0.5\nb = 0.7\nc = 0.35\nd = 0.35\n\n# Ecuaciones\nf = lambda t,x,y : a*x -b*x*y\ng = lambda t,x,y : -c*y + d*x*y\n\n# Condiciones iniciales\nt0 = 0\nx0 = 2\ny0 = 1\n\n# par\u00e1metros del algoritmo\nh = 0.5\nmuestras = 101\n\n# Algoritmo como funci\u00f3n\ndef rungekutta2_fg(f,g,x0,y0,z0,h,muestras,\n                   vertabla=False, precision=6):\n    ''' solucion a EDO d2y\/dx2 con Runge-Kutta 2do Orden,\n    f(x,y,z) = z #= y'\n    g(x,y,z) = expresion d2y\/dx2 con z=y'\n    tambien es solucion a sistemas edo f() y g()\n    x0,y0,z0 son valores iniciales, h es tamano de paso,\n    muestras es la cantidad de puntos a calcular.\n    '''\n    tamano = muestras + 1\n    tabla = np.zeros(shape=(tamano,3+4),dtype=float)\n    # incluye el punto &#x5B;x0,y0,z0,K1y,K1z,K2y,K2z]\n    tabla&#x5B;0] = &#x5B;x0,y0,z0,0,0,0,0]\n     \n    xi = x0 # valores iniciales\n    yi = y0\n    zi = z0\n    for i in range(1,tamano,1):\n        K1y = h * f(xi,yi,zi)\n        K1z = h * g(xi,yi,zi)\n         \n        K2y = h * f(xi+h, yi + K1y, zi + K1z)\n        K2z = h * g(xi+h, yi + K1y, zi + K1z)\n \n        yi = yi + (K1y+K2y)\/2\n        zi = zi + (K1z+K2z)\/2\n        xi = xi + h\n         \n        tabla&#x5B;i] = &#x5B;xi,yi,zi,K1y,K1z,K2y,K2z]\n         \n    if vertabla==True:\n        np.set_printoptions(precision)\n        print('EDO f,g con Runge-Kutta 2 Orden')\n        print('i ','&#x5B; xi,  yi,  zi',']')\n        print('   &#x5B; K1y,  K1z,  K2y,  K2z ]')\n        for i in range(0,tamano,1):  \n            txt = ' '\n            if i&gt;=10:\n                txt = '  '\n            print(str(i),tabla&#x5B;i,0:3])\n            print(txt,tabla&#x5B;i,3:])\n     \n    return(tabla)\n\n# PROCEDIMIENTO\ntabla = rungekutta2_fg(f,g,t0,x0,y0,h,\n                       muestras,vertabla=True)\n# SALIDA\nprint('Sistemas EDO: Modelo presa-predador')\n##print('i ','&#x5B; xi,  yi,  zi',']')\n##print('   &#x5B; K1y,  K1z,  K2y,  K2z ]')\n##for i in range(0,tamano,1):  \n##    txt = ' '\n##    if i&gt;=10:\n##        txt = '  '\n##    print(str(i),tabla&#x5B;i,0:3])\n##    print(txt,tabla&#x5B;i,3:])\n\n# GRAFICA ---------------------\nimport matplotlib.pyplot as plt\n \ntitulo = 'Sistemas EDO Runge-Kutta 2ord - Modelo predador-presa'\ni = muestras # iteraci\u00f3n en gr\u00e1fica\n \ntitulo = titulo+', i='+str(i)\nxi = tabla&#x5B;:,0]\nyi = tabla&#x5B;:,1]\nzi = tabla&#x5B;:,2]\nK1y = tabla&#x5B;:,3]\nK1z = tabla&#x5B;:,4]\nK2y = tabla&#x5B;:,5]\nK2z = tabla&#x5B;:,6]\n \nplt.subplot(211)\nplt.plot(xi&#x5B;0],yi&#x5B;0],'o',\n         color='red', label ='&#x5B;t0,y0]')\nif i&lt;20: # evita muchos puntos\n    plt.plot(xi&#x5B;1:i+2],yi&#x5B;1:i+2],'o',\n             color='green', label ='&#x5B;t&#x5B;i],y&#x5B;i]]')\nplt.plot(xi&#x5B;0:i+2],yi&#x5B;0:i+2],\n         color='blue',label='y(t)')\nif i&lt;muestras: # gr\u00e1fica para una iteraci\u00f3n\n    plt.plot(xi&#x5B;i+1],yi&#x5B;i+1],'o',color='orange',\n             label ='&#x5B;x&#x5B;i+1],y&#x5B;i+1]]')\n    plt.plot(xi&#x5B;i:i+3],yi&#x5B;i:i+3],'.',color='gray')\n    plt.plot(xi&#x5B;i:i+2],&#x5B;yi&#x5B;i],yi&#x5B;i]], color='orange',\n             label='h',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]-0.02*h],\n             &#x5B;yi&#x5B;i],yi&#x5B;i]+K1y&#x5B;i+1]],\n             color='green',label='K1y',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]+0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;yi&#x5B;i],yi&#x5B;i]+K2y&#x5B;i+1]],\n             color='magenta',label='K2y',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;yi&#x5B;i]+K1y&#x5B;i+1],yi&#x5B;i]+K2y&#x5B;i+1]],\n             color='magenta')\nif np.min(yi&#x5B;0:i+1])&lt;0: # linea 0\n    plt.axhline(0, color='red')\nplt.ylabel('y = presa')\nplt.title(titulo)\nplt.legend()\nplt.grid()\nplt.tight_layout()\n \nplt.subplot(212)\nplt.plot(xi&#x5B;0],zi&#x5B;0],'o',\n         color='red', label ='&#x5B;t0,z0]')\nif i&lt;20: # evita muchos puntos\n    plt.plot(xi&#x5B;1:i+2],zi&#x5B;1:i+2],'o',\n             color='green', label ='&#x5B;t&#x5B;i],v&#x5B;i]]')\nplt.plot(xi&#x5B;0:i+2],zi&#x5B;0:i+2],\n         color='green',label='z(t)')\nif i&lt;muestras: # gr\u00e1fica para una iteraci\u00f3n\n    plt.plot(xi&#x5B;i+1],zi&#x5B;i+1],'o',color='orange',\n             label ='&#x5B;t&#x5B;i+1],z&#x5B;i+1]]')\n    plt.plot(xi&#x5B;i:i+3],zi&#x5B;i:i+3],'.',color='gray')\n    plt.plot(xi&#x5B;i:i+2],&#x5B;zi&#x5B;i],zi&#x5B;i]], color='orange',\n             label='h',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]-0.02*h],\n             &#x5B;zi&#x5B;i],zi&#x5B;i]+K1z&#x5B;i+1]],\n             color='green',label='K1z',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]+0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;zi&#x5B;i],zi&#x5B;i]+K2z&#x5B;i+1]],\n             color='magenta',label='K2z',linestyle='dashed')\n    plt.plot(&#x5B;xi&#x5B;i+1]-0.02*h,xi&#x5B;i+1]+0.02*h],\n             &#x5B;zi&#x5B;i]+K1z&#x5B;i+1],zi&#x5B;i]+K2z&#x5B;i+1]],\n             color='magenta')\n \nplt.xlabel('x = tiempo')\nplt.ylabel('z = predador')\nplt.legend()\nplt.grid()\nplt.tight_layout()\n \n#plt.show() #comentar para la siguiente gr\u00e1fica\n\n# gr\u00e1fica yi vs zi\ntitulo = 'Sistemas EDO Runge-Kutta 2ord - presa vs predador'\ntitulo = titulo+', i='+str(i)\nfig_yz, graf3 = plt.subplots()\ngraf3.plot(yi,zi)\n \ngraf3.set_title(titulo)\ngraf3.set_xlabel('presa')\ngraf3.set_ylabel('predador')\ngraf3.grid()\n#plt.show() #comentar para la siguiente gr\u00e1fica\n\n\n# GRAFICA CON ANIMACION --------\n# import matplotlib.pyplot as plt\nimport matplotlib.animation as animation\n \nunmetodo = 'Sistemas EDO Runge-Kutta 2ord - presa vs predador'\nnarchivo = 'EdoSistemaRK_presapredador' # nombre archivo GIF\nmuestras = 51\n \n# Puntos para la gr\u00e1fica\nn = len(xi)\n \n# Parametros de trama\/foto\nretardo = 1000   # milisegundos entre tramas\ntramas = len(xi)\n \n# GRAFICA animada en fig_ani\nfig_ani, (graf1_ani,graf2_ani) = plt.subplots(2)\nymax = np.max(&#x5B;yi&#x5B;0],yi&#x5B;2]])\nymin = np.min(&#x5B;yi&#x5B;0],yi&#x5B;2]])\ndeltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\ndeltay = np.abs(yi&#x5B;2]-yi&#x5B;0])\ngraf1_ani.set_xlim(&#x5B;xi&#x5B;0],xi&#x5B;2]+0.05*deltax])\ngraf1_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.05*deltay])\n \nzmax = np.max(&#x5B;zi&#x5B;0],zi&#x5B;2]])\nzmin = np.min(&#x5B;zi&#x5B;0],zi&#x5B;2]])\ndeltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\ndeltaz = np.abs(zi&#x5B;2]-zi&#x5B;0])\ngraf2_ani.set_xlim(&#x5B;xi&#x5B;0],xi&#x5B;2]+0.05*deltax])\ngraf2_ani.set_ylim(&#x5B;zmin-0.05*deltaz,zmax+0.05*deltaz])\n# Lineas y puntos base\nlinea_fx, = graf1_ani.plot(xi, yi,color='blue',\n                           linestyle='dashed')\npuntof, = graf1_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                         color='blue',label='&#x5B;xi,yi]')\npuntoa, = graf1_ani.plot(xi&#x5B;0], yi&#x5B;0],'o',\n                         color='orange')\npuntob, = graf1_ani.plot(xi&#x5B;1], yi&#x5B;1],'o',\n                         color='magenta')\nlinea_h, = graf1_ani.plot(xi, xi, color='orange',\n                          linestyle='dashed',label='h')\nlinea_term1, = graf1_ani.plot(xi, xi,color='magenta',\n                              linestyle='dashed',\n                              label=&quot;(K1y+K2y)\/2&quot;)\n\n# Cuadros de texto en gr\u00e1fico\n#txt_i  = graf1_ani.text(xi&#x5B;0], yi&#x5B;0]+0.03*deltay,'&#x5B;x&#x5B;i],y&#x5B;i]]',\n#                       horizontalalignment='center')\n#txt_i1 = graf1_ani.text(xi&#x5B;1], xi&#x5B;1]+0.03*deltay,'&#x5B;x&#x5B;i+1],y&#x5B;i+1]]',\n#                       horizontalalignment='center')\ntxt_titulo = graf1_ani.set_title(unmetodo)\n \nlinea_gx, = graf2_ani.plot(xi, zi,color='green',\n                           linestyle='dashed')\npuntog, = graf2_ani.plot(xi&#x5B;0], zi&#x5B;0],'o',\n                         color='green',label='&#x5B;xi,zi]')\npuntog_a, = graf2_ani.plot(xi&#x5B;0], zi&#x5B;0],'o',\n                           color='orange')\npuntog_b, = graf2_ani.plot(xi&#x5B;1], zi&#x5B;1],'o',\n                           color='magenta')\nlineag_h, = graf2_ani.plot(xi, xi, color='orange',\n                           linestyle='dashed',label='h')\nlineag_term1, = graf2_ani.plot(xi, xi,\n                               color='magenta',\n                               linestyle='dashed',\n                               label=&quot;(K1z+K2z)\/2&quot;)\n# Configura gr\u00e1fica\ngraf1_ani.axhline(0, color='black')  # Linea horizontal en cero\ngraf1_ani.set_title(unmetodo)\ngraf1_ani.set_xlabel('x')\ngraf1_ani.set_ylabel('y(x)')\ngraf1_ani.legend()\ngraf1_ani.grid()\n \ngraf2_ani.axhline(0, color='black')  # Linea horizontal en cero\n#graf2_ani.set_title(unmetodo)\ngraf2_ani.set_xlabel('x')\ngraf2_ani.set_ylabel('z(x)')\ngraf2_ani.legend()\ngraf2_ani.grid()\n \n# Nueva Trama\ndef unatrama(i,xi,yi,zi):\n     \n    if i&gt;0:\n        ymax = np.max(&#x5B;yi&#x5B;0:i+2]])\n        ymin = np.min(&#x5B;yi&#x5B;0:i+2]])\n        deltax = np.abs(xi&#x5B;i+1]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf1_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;i+1]+0.05*deltax])\n        graf1_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n \n        zmax = np.max(&#x5B;zi&#x5B;0:i+2]])\n        zmin = np.min(&#x5B;zi&#x5B;0:i+2]])\n        deltaz = np.abs(zmax-zmin)\n        graf2_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;i+1]+0.05*deltax])\n        graf2_ani.set_ylim(&#x5B;zmin-0.05*deltaz,zmax+0.1*deltaz])\n    else:\n        ymax = np.max(&#x5B;yi&#x5B;0:2]])\n        ymin = np.min(&#x5B;yi&#x5B;0:2]])\n        deltax = np.abs(xi&#x5B;2]-xi&#x5B;0])\n        deltay = np.abs(ymax-ymin)\n        graf1_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;2]+0.05*deltax])\n        graf1_ani.set_ylim(&#x5B;ymin-0.05*deltay,ymax+0.1*deltay])\n \n        zmax = np.max(&#x5B;zi&#x5B;0:2]])\n        zmin = np.min(&#x5B;zi&#x5B;0:2]])\n        deltaz = np.abs(zmax-zmin)\n        graf2_ani.set_xlim(&#x5B;xi&#x5B;0]-0.05*deltax,xi&#x5B;2]+0.05*deltax])\n        graf2_ani.set_ylim(&#x5B;zmin-0.05*deltaz,zmax+0.1*deltaz])\n    # actualiza cada punto\n    puntoa.set_xdata(&#x5B;xi&#x5B;i]]) \n    puntoa.set_ydata(&#x5B;yi&#x5B;i]])\n    puntob.set_xdata(&#x5B;xi&#x5B;i+1]]) \n    puntob.set_ydata(&#x5B;yi&#x5B;i+1]])\n    if i&lt;20:\n        puntof.set_xdata(xi&#x5B;0:i]) \n        puntof.set_ydata(yi&#x5B;0:i])\n    # actualiza cada linea\n    linea_fx.set_xdata(xi&#x5B;0:i+1])\n    linea_fx.set_ydata(yi&#x5B;0:i+1])\n    linea_h.set_xdata(&#x5B;xi&#x5B;i],xi&#x5B;i+1]])\n    linea_h.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i]])\n    linea_term1.set_xdata(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]])\n    linea_term1.set_ydata(&#x5B;yi&#x5B;i],yi&#x5B;i+1]])\n    # actualiza texto\n    #txt_i.set_position(&#x5B;xi&#x5B;i], yi&#x5B;i]+0.03*deltay])\n    #txt_i1.set_position(&#x5B;xi&#x5B;i+1], yi&#x5B;i+1]+0.03*deltay])\n \n    # actualiza cada punto\n    puntog_a.set_xdata(&#x5B;xi&#x5B;i]]) \n    puntog_a.set_ydata(&#x5B;zi&#x5B;i]])\n    puntog_b.set_xdata(&#x5B;xi&#x5B;i+1]]) \n    puntog_b.set_ydata(&#x5B;zi&#x5B;i+1]])\n    if i&lt;20:\n        puntog.set_xdata(xi&#x5B;0:i]) \n        puntog.set_ydata(zi&#x5B;0:i])\n    # actualiza cada linea\n    linea_gx.set_xdata(xi&#x5B;0:i+1])\n    linea_gx.set_ydata(zi&#x5B;0:i+1])\n    lineag_h.set_xdata(&#x5B;xi&#x5B;i],xi&#x5B;i+1]])\n    lineag_h.set_ydata(&#x5B;zi&#x5B;i],zi&#x5B;i]])\n    lineag_term1.set_xdata(&#x5B;xi&#x5B;i+1],xi&#x5B;i+1]])\n    lineag_term1.set_ydata(&#x5B;zi&#x5B;i],zi&#x5B;i+1]])\n    txt_titulo.set_text(unmetodo+', i='+str(i))\n \n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,\n            linea_term1,\n            puntog_a,puntog_b,puntog,\n            linea_gx,lineag_h,\n            lineag_term1,)\n            #txt_i,txt_i1,)\n\n# Limpia Trama anterior\ndef limpiatrama(): \n    puntoa.set_ydata(np.ma.array(xi, mask=True))\n    puntob.set_ydata(np.ma.array(xi, mask=True))\n    puntof.set_ydata(np.ma.array(xi, mask=True))\n    linea_h.set_ydata(np.ma.array(xi, mask=True))\n    linea_term1.set_ydata(np.ma.array(xi, mask=True))\n \n    puntog_a.set_ydata(np.ma.array(xi, mask=True))\n    puntog_b.set_ydata(np.ma.array(xi, mask=True))\n    puntog.set_ydata(np.ma.array(xi, mask=True))\n    lineag_h.set_ydata(np.ma.array(xi, mask=True))\n    lineag_term1.set_ydata(np.ma.array(xi, mask=True))\n    return (puntoa,puntob,puntof,\n            linea_fx,linea_h,\n            linea_term1,\n            puntog_a,puntog_b,puntog,\n            linea_gx,lineag_h,\n            lineag_term1,)\n            #txt_i,txt_i1,)\n \n# Trama contador\ni = np.arange(0,tramas-1,1)\nani = animation.FuncAnimation(fig_ani,\n                              unatrama,\n                              i ,\n                              fargs = (xi,yi,zi),\n                              init_func = limpiatrama,\n                              interval = retardo,\n                              blit=False)\n# Graba Archivo GIFAnimado y video\nani.save(narchivo+'_ani.gif', writer='pillow')\n# ani.save(narchivo+'_video.mp4')\nplt.draw()\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>animaci\u00f3n:<\/p>\n\n\n\n<p> <a href=\"#edotaylor3t\">EDO Taylor<\/a> 3t<\/p>\n\n\n\n<p><a href=\"#RK1raDerivada\">Runge Kutta<\/a>&nbsp; dy\/dx<\/p>\n\n\n\n<p><a href=\"#RK2daDerivada\">Runge Kutta <\/a>d<sup>2<\/sup>y\/dx<sup>2<\/sup><\/p>\n\n\n\n<p><a href=\"#EDOsistemasRK\">Sistemas EDO<\/a> con RK<\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>animaci\u00f3n: EDO Taylor 3t Runge Kutta&nbsp; dy\/dx Runge Kutta d2y\/dx2 Sistemas EDO con RK Solo para fines did\u00e1cticos, y como complemento para los ejercicios presentados en la unidad para la soluci\u00f3n de Ecuaciones Diferenciales Ordinarias, se presentan las instrucciones para las animaciones usadas en la presentaci\u00f3n de los conceptos y ejercicios. Los algoritmos para animaci\u00f3n [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-mn-unidades","format":"standard","meta":{"footnotes":""},"categories":[40],"tags":[],"class_list":["post-10048","post","type-post","status-publish","format-standard","hentry","category-mn-u06"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/10048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=10048"}],"version-history":[{"count":13,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/10048\/revisions"}],"predecessor-version":[{"id":22971,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/10048\/revisions\/22971"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=10048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=10048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=10048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}