{"id":4650,"date":"2017-04-20T12:20:43","date_gmt":"2017-04-20T17:20:43","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1001\/?p=4650"},"modified":"2026-04-06T10:16:06","modified_gmt":"2026-04-06T15:16:06","slug":"grafica-animada-para-convolucion","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u03\/grafica-animada-para-convolucion\/","title":{"rendered":"3.8 Gr\u00e1fica animada para interpretar el Integral de convoluci\u00f3n con matplotlib-Python"},"content":{"rendered":"\n<p>Para interpretar mejor la operaci\u00f3n se presenta una animaci\u00f3n gr\u00e1fica de h(t-\u03c4) y y(t), para diferentes valores de t en el intervalo de observaci\u00f3n [t_a,t_b] se incorpora la funci\u00f3n <code>graf_animada_xh_y()<\/code>.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t) \\circledast h(t) = \\int_{-\\infty}^{+\\infty} x(\\tau)h(t-\\tau) \\delta \\tau <\/span>\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\/04\/Convolucion01_animado.gif\" alt=\"Convoluci\u00f3n 01 gr\u00e1fico animado\" class=\"wp-image-19633\" \/><\/figure>\n\n\n\n<p>Otros ejemplos de gif animado de gr\u00e1ficas con matplotlib, se pueden revisar en: Una <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/fp-unidades\/fp-u09\/movimiento-circular-particula\/\" data-type=\"post\" data-id=\"11358\">part\u00edcula en movimiento circular<\/a> del curso CCPG1001 Fundamentos de Programaci\u00f3n.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA CON ANIMACION ------------\ndef graf_animada_xh_y(xt,ht,yt,t_a,t_b,\n                      muestras=101,y_nombre='y',\n                      reprod_x = 4,retardo  = 200,\n                      archivo_nombre = ''):\n    '''grafica animada convolucionx(t) y h(t)\n       en dos subgr\u00e1ficas con Parametros de animaci\u00f3n trama\/foto\n        y_nombre = 'ZSR' # o y nombre de resultado convoluci\u00f3n\n        reprod_x = 4     # velocidad de reproducci\u00f3n\n        retardo  = 200   # milisegundos entre tramas\n        archivo_nombre = '' # crea gif animado si hay nombre\n    '''\n    # grafica evaluaci\u00f3n numerica\n    x_t = sym.lambdify(t,xt,modules=equivalentes)\n    h_t = sym.lambdify(t,ht,modules=equivalentes)\n    y_t = sym.lambdify(t,yt,modules=equivalentes)\n\n    ti = np.linspace(t_a,t_b,muestras)\n    xi = x_t(ti)\n    hi = h_t(ti)\n    yi = y_t(ti)\n\n    import matplotlib.animation as animation\n    # h(t-tau) para cada t\n    ht_tau   = &#x5B;]\n    for tau in range(0,muestras,reprod_x):\n        ht_tau.append(h_t(ti&#x5B;tau]-ti))\n    tramas = len(ht_tau) # tramas creadas\n\n    # figura con dos sub-graficas\n    fig_anim = plt.figure()\n    graf_a1  = fig_anim.add_subplot(211)\n    graf_a2  = fig_anim.add_subplot(212)\n\n    # grafico superior\n    x_linea, = graf_a1.plot(ti,xi, color='blue',\n                            label=r'$x(\\tau)$')\n    h_linea, = graf_a1.plot(ti,hi,color='magenta',\n                             linestyle='dashed',\n                             label=r'$h(\\tau)$')\n    htau_linea, = graf_a1.plot(ti,ht_tau&#x5B;0],\n                               color='magenta',\n                               label=r'$h(t-\\tau)$')\n    punto1, = graf_a1.plot(0,0, color='magenta',marker=6)\n\n    # grafico inferior\n    color_y = 'green'\n    if y_nombre=='ZSR':\n        color_y ='dodgerblue'\n    y_linea, = graf_a2.plot(ti,yi, color=color_y,\n                            label=y_nombre+'(t)')\n    punto2,  = graf_a2.plot(0,0, color=color_y,marker=6)\n    y_sombra, = graf_a2.plot(ti,yi, color=color_y)\n    y_sombra.set_visible(False) # Para fijar leyend()\n\n\n    # Configura gr\u00e1fica\n    titulo = r''+y_nombre+'(t)= x(t)$\\circledast$h(t)'\n    graf_a1.set_title(titulo)\n    ymax1 = np.max(&#x5B;np.max(xi),np.max(hi)])*1.11\n    ymin1 = np.min(&#x5B;np.min(xi),np.min(hi)])-0.1*ymax1\n    graf_a1.set_xlim(&#x5B;t_a,t_b])\n    graf_a1.set_ylim(&#x5B;ymin1,ymax1])\n    graf_a1.set_xlabel(r'$\\tau$')\n    graf_a1.legend()\n    graf_a1.grid()\n\n    ymax2 = np.max(yi)*1.1\n    ymin2 = np.min(yi)-0.1*ymax2\n    graf_a2.set_xlim(&#x5B;t_a,t_b])\n    graf_a2.set_ylim(&#x5B;ymin2,ymax2])\n    graf_a2.set_xlabel('t')\n    graf_a2.legend()\n    graf_a2.grid()\n\n    # cuadros de texto en gr\u00e1fico\n    txt_x = (t_b+t_a)\/2\n    txt_y = ymax1*(1-0.09)\n    txt_tau = graf_a1.text(txt_x,txt_y,'t='+str(t_a),\n                   horizontalalignment='center')\n\n    def trama_actualizar(i,ti,ht_tau):\n        # actualiza cada linea\n        htau_linea.set_xdata(ti)\n        htau_linea.set_ydata(ht_tau&#x5B;i])\n\n        hasta   = i*reprod_x\n        porusar = (muestras-reprod_x*(i+1))\n        if porusar&gt;=reprod_x: # en intervalo\n            y_linea.set_xdata(ti&#x5B;0:hasta])\n            y_linea.set_ydata(yi&#x5B;0:hasta])\n            punto1.set_xdata(&#x5B;ti&#x5B;hasta]])\n            punto1.set_ydata(&#x5B;0])\n            punto2.set_xdata(&#x5B;ti&#x5B;hasta]])\n            punto2.set_ydata(&#x5B;0])\n        else: # insuficientes en intervalo\n            y_linea.set_xdata(ti)\n            y_linea.set_ydata(yi)\n            punto1.set_xdata(&#x5B;ti&#x5B;-1]])\n            punto1.set_ydata(&#x5B;0])\n            punto2.set_xdata(&#x5B;ti&#x5B;-1]])\n            punto2.set_ydata(&#x5B;0])\n\n        # actualiza texto\n        t_trama = np.around(ti&#x5B;i*reprod_x],4)\n        txt_tau.set_text('t= '+str(t_trama))\n        \n        return(htau_linea,y_linea,punto1,punto2,txt_tau)\n\n    def trama_limpiar(): # Limpia Trama anterior\n        htau_linea.set_ydata(np.ma.array(ti, mask=True))\n        y_linea.set_ydata(np.ma.array(ti, mask=True))\n        punto1.set_ydata(np.ma.array(ti, mask=True))\n        punto2.set_ydata(np.ma.array(ti, mask=True))\n        txt_tau.set_text('')\n        return(htau_linea,y_linea,punto1,punto2,txt_tau)\n\n    i   = np.arange(0,tramas,1) # Trama contador\n    ani = animation.FuncAnimation(fig_anim,trama_actualizar,i ,\n                                  fargs = (ti,ht_tau),\n                                  init_func = trama_limpiar,\n                                  interval = retardo,\n                                  blit=True)\n    # Guarda archivo GIF animado o video\n    if len(archivo_nombre)&gt;0:\n        ani.save(archivo_nombre+'_animado.gif',\n                 writer='imagemagick')\n        #ani.save(archivo_nombre+'_video.mp4')\n    plt.draw()\n    #plt.show()\n    return(ani)\n\n# grafica animada de convoluci\u00f3n\nn_archivo = '' # sin crear archivo gif animado \nn_archivo = 'convolucion01' # requiere 'imagemagick'\nfigura_animada = graf_animada_xh_y(x,h,y,t_a,t_b,\n                      muestras, reprod_x = 4,\n                      archivo_nombre = n_archivo)\nplt.show()\n<\/pre><\/div>\n\n\n<p>Para obtener un gif animado se debe asignar un <code>'archivo_nombre'<\/code> para identificar el ejercicio; si se mantiene el nombre vacio <code>''<\/code>, solamente se crea la gr\u00e1fica. El resultado se almacena en el <code>archivo_nombre_animado.gif<\/code> del directorio de trabajo,<\/p>\n\n\n\n<p>La funci\u00f3n tambi\u00e9n se incorpora\u00a0 a <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/senales\/algoritmos-telg1001-py\/\" data-type=\"page\" data-id=\"17852\">telg1001.py<\/a> para su uso posterior en los ejercicios<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para interpretar mejor la operaci\u00f3n se presenta una animaci\u00f3n gr\u00e1fica de h(t-\u03c4) y y(t), para diferentes valores de t en el intervalo de observaci\u00f3n [t_a,t_b] se incorpora la funci\u00f3n graf_animada_xh_y(). Otros ejemplos de gif animado de gr\u00e1ficas con matplotlib, se pueden revisar en: Una part\u00edcula en movimiento circular del curso CCPG1001 Fundamentos de Programaci\u00f3n. Para [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-ss-unidades","format":"standard","meta":{"footnotes":""},"categories":[171],"tags":[],"class_list":["post-4650","post","type-post","status-publish","format-standard","hentry","category-ss-u03"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/4650","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=4650"}],"version-history":[{"count":4,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/4650\/revisions"}],"predecessor-version":[{"id":24086,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/4650\/revisions\/24086"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=4650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=4650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=4650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}