{"id":4594,"date":"2017-04-13T10:30:13","date_gmt":"2017-04-13T15:30:13","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1001\/?p=4594"},"modified":"2026-04-06T10:21:54","modified_gmt":"2026-04-06T15:21:54","slug":"integral-convolucion-xt-ht-causal","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u03\/integral-convolucion-xt-ht-causal\/","title":{"rendered":"3.4.2 Integral de Convoluci\u00f3n entre x(t) y h(t) causal con Sympy-Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#integralconvolucion\">Integral convoluci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#causalnocausal\">causal\/No causal<\/a><\/p>\n\n\n\n<p><a href=\"#rectangularrampa\">Rect\/Rampa<\/a><\/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=\"integralconvolucion\">1. Integral de convoluci\u00f3n<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Lathi 2.4-1 p170, Ej 2.8 p173.<\/p>\n\n\n\n<p>El integral de convoluci\u00f3n de dos funciones x(t) y h(t) usa como operador el s\u00edmbolo&nbsp;\u2297 que representa el integral de la ecuaci\u00f3n mostrada.<\/p>\n\n\n\n<p>La funci\u00f3n h(t) representa la repuesta del sistema, funci\u00f3n de transferencia o respuesta a impulso, que por la forma de obtenerla se considera causal por tener componente \u03bc(t) y \u03b4(t) que asegurar\u00eda que la funci\u00f3n se desarrolle en el lado derecho del plano.<\/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>La funci\u00f3n x(t) representa la entrada del sistema y el integral de convoluci\u00f3n se utiliza para determinar la respuesta de estado cero de un sistema ZSR.<\/p>\n\n\n\n<p>Si las funciones x(t) y el sistema h(t) son causales, la respuesta tambi\u00e9n ser\u00e1 causal. Teniendo como l\u00edmites del integral<br> \u03c4<sub>a<\/sub> = 0 y \u03c4<sub>b<\/sub> = t<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y(t)=\\begin{cases}\\int_{0^{-}}^{t} x(\\tau)h(t-\\tau) \\delta \\tau , &amp; t\\ge 0\\\\ 0, &amp; t&lt;0 \\end{cases}<\/span>\n\n\n\n<p>El l\u00edmite inferior del integral se usa como 0<sup><strong>-<\/strong><\/sup>, implica aunque se escriba solo 0 se pretende evitar la dificultad cuando x(t) tiene un impulso en el origen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#integralconvolucion\">Integral convoluci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#causalnocausal\">causal\/No causal<\/a><\/p>\n\n\n\n<p><a href=\"#rectangularrampa\">Rect\/Rampa<\/a><\/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=\"algoritmo\">2. Ejemplo. Algoritmo para el integral de convoluci\u00f3n con x(t) y h(t) causales con Sympy<\/h2>\n\n\n\n<p>Realizar la convoluci\u00f3n entre la respuesta al impulso h(t) y la entrada x(t) mostradas:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t) = e^{-t} \\mu(t) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> h(t) = e^{-2t} \\mu(t) <\/span>\n\n\n\n<p>Para el algoritmo, se define las variables a usar, escal\u00f3n e impulso unitarios, definiendo las funciones x(t) y y(t) como:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# entrada x(t), respuesta impulso h(t)\nx = sym.exp(-t)*u\nh = sym.exp(-2*t)*u\n<\/pre><\/div>\n\n\n<p>Se revisa la causalidad de las se\u00f1ales para actualizar los l\u00edmites del integral de convoluci\u00f3n.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nxcausal = ss.es_causal(x)\nhcausal = ss.es_causal(h)\n\n# limites de integral de convoluci\u00f3n\ntau_a = -sym.oo ; tau_b = sym.oo\nif hcausal==True:\n    tau_b = t\nif (xcausal and hcausal)==True:\n    tau_a = 0\n<\/pre><\/div>\n\n\n<p>El integral de convoluci\u00f3n se aplica a la multiplicaci\u00f3n entre x(t) y h(t), realizando el cambio de variable por&nbsp;\u03c4 y (t-\u03c4). Para facilitar la operaci\u00f3n del integral, se simplifica la expresi\u00f3n <code>xh<\/code> como t\u00e9rminos de suma<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# integral de convolucion\nxh = x.subs(t,tau)*h.subs(t,t-tau)\nxh = sym.expand(xh,t)\ny  = sym.integrate(xh,(tau,tau_a,tau_b))\ny  = sym.expand(y,t)\ny  = y.subs(u**2,u) # Heaviside**2=Heaviside\n<\/pre><\/div>\n\n\n<p>El resultado del integral se muestra como,<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>xcausal:  True\nhcausal:  True\nlimites de integral: &#091; 0 , t ]\nx(t)*h(t-tau):\n -2\u22c5t  \u03c4              \n\u212f    \u22c5\u212f \u22c5\u03b8(\u03c4)\u22c5\u03b8(t - \u03c4)\n\n y(t):\n -t         -2\u22c5t     \n\u212f  \u22c5\u03b8(t) - \u212f    \u22c5\u03b8(t)<\/code><\/pre>\n\n\n\n<p>Algoritmo en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Integral de convolucion con Sympy\n# Revisar causalidad de x(t) y h(t)\nimport numpy as np\nimport sympy as sym\nimport matplotlib.pyplot as plt\nimport telg1001 as ss\nequivalentes = &#x5B;{'DiracDelta': lambda x: 1*(x==0)},\n                {'Heaviside': lambda x,y: np.heaviside(x, 1)},\n                'numpy',]\n\n# INGRESO\nt = sym.Symbol('t',real=True)\ntau = sym.Symbol('tau',real=True)\nu = sym.Heaviside(t)\nd = sym.DiracDelta(t)\n\n# entrada x(t), respuesta impulso h(t)\nx = sym.exp(-t)*u\nh = sym.exp(-2*t)*u\n\n# grafica intervalo &#x5B;t_a,t_b] simetrico a 0\nt_b = -4\nt_a = 4\nmuestras = 201\n\n# PROCEDIMIENTO\nxcausal = ss.es_causal(x)\nhcausal = ss.es_causal(h)\n\n# limites de integral de convoluci\u00f3n\ntau_a = -sym.oo ; tau_b = sym.oo\nif hcausal==True:\n    tau_b = t\nif (xcausal and hcausal)==True:\n    tau_a = 0\n\n# integral de convolucion x(t)*h(t)\nxh = x.subs(t,tau)*h.subs(t,t-tau)\nxh = sym.expand(xh,t)\ny  = sym.integrate(xh,(tau,tau_a,tau_b))\ny  = sym.expand(y,t)\nif not(y.has(sym.Integral)):\n    y = ss.simplifica_escalon(y)\n#ZSR  = ZSR.subs(u**2,u) # Heaviside**2=Heaviside\n\n# SALIDA\nprint('xcausal: ',xcausal)\nprint('hcausal: ',hcausal)\nprint('limites de integral: &#x5B;',tau_a,',',tau_b,']')\nprint('x(t)*h(t-tau):')\nsym.pprint(xh) \nprint('\\n y(t):')\nsym.pprint(y)\nif hcausal==False:\n    print('revisar causalidad de h(t)')\nif xcausal==False:\n    print('revisar causalidad de x(t)')\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#integralconvolucion\">Integral convoluci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#causalnocausal\">causal\/No causal<\/a><\/p>\n\n\n\n<p><a href=\"#rectangularrampa\">Rect\/Rampa<\/a><\/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=\"grafica\">3. Gr\u00e1fica para el integral de convoluci\u00f3n entre x(t) y h(t)<\/h2>\n\n\n\n<p>Con los resultados se puede construir la gr\u00e1fica, para observar en un intervalo sim\u00e9trico que permita visualizar la operaci\u00f3n de convoluci\u00f3n.<\/p>\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\/04\/Convolucion01.png\" alt=\"Convoluci\u00f3n gr\u00e1fica01\" class=\"wp-image-19632\" \/><\/figure>\n\n\n\n<p>Instrucciones complementarias para las gr\u00e1ficas, se realiza como una funci\u00f3n a ser a\u00f1adida a <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/senales\/algoritmos-telg1001-py\/\" data-type=\"page\" data-id=\"17852\">telg1001.py<\/a> por ser reutilizada en los ejercicios.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\ndef graficar_xh_y(xt,ht,yt,t_a,t_b,\n                  muestras=101,x_nombre='x',\n                  h_nombre='h',y_nombre='y'):\n    '''dos subgraficas, x(t) y h(t) en superior\n       h(t) en inferior\n    '''\n    \n    # grafica evaluaci\u00f3n numerica\n    xt = sym.sympify(xt,t) # convierte a sympy una constante\n    if xt.has(t): # no es constante\n        x_t = sym.lambdify(t,xt,modules=equivalentes)\n    else: # es constante \n        x_t = lambda t: xt + 0*t\n\n    ht = sym.sympify(ht,t) # convierte a sympy una constante\n    if ht.has(t): # no es constante\n        h_t = sym.lambdify(t,ht,modules=equivalentes)\n    else: # es constante \n        h_t = lambda t: ht + 0*t\n\n    ti = np.linspace(t_a,t_b,muestras)\n    xi = x_t(ti)\n    hi = h_t(ti)\n\n    yt = sym.sympify(yt,t) # convierte a sympy una constante\n    if yt.has(t): # no es constante\n        y_t = sym.lambdify(t,yt,modules=equivalentes)\n    else: # es constante \n        y_t = lambda t: yt + 0*t\n    yi = y_t(ti)\n\n    colorlinea_y = 'green'\n    if y_nombre =='ZSR':\n        colorlinea_y = 'dodgerblue'\n    \n    fig_xh_y, graf2 = plt.subplots(2,1)\n    untitulo = y_nombre+'(t) = $'+ str(sym.latex(yt))+'$'\n    graf2&#x5B;0].set_title(untitulo)\n    graf2&#x5B;0].plot(ti,xi, color='blue', label='x(t)')\n    graf2&#x5B;0].plot(ti,hi, color='magenta', label='h(t)')\n    graf2&#x5B;0].legend()\n    graf2&#x5B;0].grid()\n    # Graficar terminos con impulso\n    impulsoen_x = busca_impulso(xt)\n    if len(impulsoen_x)&gt;0:\n        for donde in impulsoen_x:\n            tk = float(donde)\n            xk = float(x_t(tk))\n            graf2&#x5B;0].stem(tk,xk,\n                         linefmt='blue')\n    # Graficar terminos con impulso\n    impulsoen_h = busca_impulso(ht)\n    if len(impulsoen_h)&gt;0:\n        for donde in impulsoen_h:\n            tk = float(donde)\n            hk = float(h_t(tk))\n            graf2&#x5B;0].stem(tk,hk,\n                         linefmt='magenta')\n\n\n    graf2&#x5B;1].plot(ti,yi,colorlinea_y,\n                  label = y_nombre+'(t)')\n    # Graficar terminos con impulso\n    impulsoen_y = busca_impulso(yt)\n    if len(impulsoen_y)&gt;0:\n        for donde in impulsoen_y:\n            tk = float(donde)\n            yk = float(y_t(tk))\n            graf2&#x5B;1].stem(tk,yk,\n                         linefmt=colorlinea_y)\n    graf2&#x5B;1].set_xlabel('t')\n    graf2&#x5B;1].legend()\n    graf2&#x5B;1].grid()\n    #plt.show()\n    return(fig_xh_y)\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#integralconvolucion\">Integral convoluci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#causalnocausal\">causal\/No causal<\/a><\/p>\n\n\n\n<p><a href=\"#rectangularrampa\">Rect\/Rampa<\/a><\/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=\"causalnocausal\">4. Ejercicio: Convoluci\u00f3n entre h(t) causal y x(t) no causal<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Opennheim 2.8 p101<\/p>\n\n\n\n<p>Realizar la convoluci\u00f3n entre h(t) y x(t) mostradas:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t) = e^{2t} \\mu (-t) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> h(t) = \\mu (t-3) <\/span>\n\n\n\n<p>La se\u00f1al <strong>x<\/strong>(t) es creciente desde el lado izquierdo del plano, es decir es <strong>no causal<\/strong>, tambi\u00e9n es&nbsp; acotada en cero por el escal\u00f3n unitario invertido en el tiempo.<\/p>\n\n\n\n<p>Mientras que <strong>h<\/strong>(t) presenta una respuesta con retraso de 3 unidades de tiempo con el escal\u00f3n unitario, se encuentra en el lado derecho del plano, por lo que se la considera <strong>causal<\/strong>.<\/p>\n\n\n\n<p>Para el an\u00e1lisis, el gr\u00e1fico se presenta la animaci\u00f3n de la operaci\u00f3n de convoluci\u00f3n<\/p>\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\/convolucion02_animado.gif\" alt=\"convoluci\u00f3n exponencial y escal\u00f3n 02 gr\u00e1fico animado\" class=\"wp-image-19652\" \/><\/figure>\n\n\n\n<p>Para el ejercicio, es importante considerar que en un sistema lineal causal, solo se desarrolla una salida y(t) ante una entrada x(t). La se\u00f1al de entrada x(t) no se registra a partir de tiempo con valor cero. Observe en la gr\u00e1fica que la se\u00f1al de salida y(t) se desarrolla con retardo de tres unidades respecto a la entrada.<\/p>\n\n\n\n<p>Desde luego el sistema responder\u00e1 en cualquier momento que se presenta la se\u00f1al, por lo que x(t) podr\u00eda ser no causal, La referencia de t=0 se considera desde el punto de vista del sistema h(t).<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# entrada x(t), respuesta impulso h(t)\nx = sym.exp(-2*t)*u\nh = u\n\n# grafica intervalo &#x5B;t_a,t_b] plano sim\u00e9trico\nt_b = 5 ; t_a = -t_b\nmuestras = int(t_b)*10+1\n<\/pre><\/div>\n\n\n<p>Esto implica que de darse el caso que exista un h(t) no causal y x(t) causal, por la <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u03\/convolucion-tabla-de-propiedades\/\" data-type=\"post\" data-id=\"2043\">propiedad conmutativa de la convoluci\u00f3n<\/a>, para el desarrollo del&nbsp; integral se pueden intercambiar las entradas y hacerlo mas simple.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n    # intercambia si h(t) no es_causal\n    # con x(t) es_causal por propiedad conmutativa\n    intercambia = False\n    if hcausal==False and xcausal==True:\n        temporal = h\n        h = x\n        x = temporal\n        xcausal = False\n        hcausal = True\n        intercambia = True\n<\/pre><\/div>\n\n\n<p>El resultado con el algoritmo es:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>xcausal:  False\nhcausal:  True\nlimites de integral: &#091; -oo , t ]\nx(t)*h(t-tau):\n 2\u22c5\u03c4                   \n\u212f   \u22c5\u03b8(-\u03c4)\u22c5\u03b8(t - \u03c4 - 3)\n\n ZSR(t):\n\u239b -6  2\u22c5t    \u239e             \n\u239c\u212f  \u22c5\u212f      1\u239f            1\n\u239c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 - \u2500\u239f\u22c5\u03b8(3 - t) + \u2500\n\u239d   2       2\u23a0            2\nrevisar causalidad de x(t)<\/code><\/pre>\n\n\n\n<p>En la respuesta se observa que el t\u00e9rmino u(3-t)\/2 en -\u221e se convierte en 1\/2 que anula la constante de 1\/2 del tercer t\u00e9rmino. Al revisar la convergencia del primer t\u00e9rmino se encuentra que tiende a cero, en consecuencia en la se\u00f1al hacia el lado izquierdo tiende a cero.<\/p>\n\n\n\n<p>gr\u00e1fica con el algoritmo<\/p>\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\/LTIC_ZSR_Ej03Sympy.png\" alt=\"LTIC ZSR Ej03 Sympy\" class=\"wp-image-19653\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Algoritmo en Python<\/h3>\n\n\n\n<p>Para los ejercicios se agrupan las instrucciones en una funci\u00f3n <code>respuesta_ZSR(x,h)<\/code> que recibe las dos se\u00f1ales x(t) y h(t), como se desarrolla en la siguiente secci\u00f3n. En la funci\u00f3n se analiza con los algoritmos anteriores si son de tipo causal incluida en <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/senales\/algoritmos-telg1001-py\/\" data-type=\"page\" data-id=\"17852\">telg1001.py<\/a>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Integral de convolucion con Sympy\n# como Respuesta a estado cero ZSR con x(t) y h(t)\n# https:\/\/blog.espol.edu.ec\/algoritmos101\/senales\/ss-unidades\/#unidad3\nimport numpy as np\nimport sympy as sym\nimport matplotlib.pyplot as plt\nimport telg1001 as ss\nequivalentes = &#x5B;{'DiracDelta': lambda x: 1*(x==0)},\n                {'Heaviside': lambda x,y: np.heaviside(x, 1)},\n                'numpy',]\n\n# INGRESO\nt = sym.Symbol('t',real=True)\ntau = sym.Symbol('tau',real=True)\nu = sym.Heaviside(t)\nd = sym.DiracDelta(t)\n\n# entrada x(t), respuesta impulso h(t)\nx = sym.exp(2*t)*u.subs(t,-t)\nh = u.subs(t,t-3)\n\n# grafica intervalo &#x5B;t_a,t_b] plano sim\u00e9trico\nt_b = 7 ; t_a = -t_b\nmuestras = int(t_b)*10+1\n\n# PROCEDIMIENTO\n# revisa causalidad de se\u00f1ales\nxcausal = ss.es_causal(x)\nhcausal = ss.es_causal(h)\n\n# intercambia si h(t) no es_causal\n# con x(t) es_causal por propiedad conmutativa\nintercambia = False\nif hcausal==False and xcausal==True:\n    temporal = h\n    h = x\n    x = temporal\n    xcausal = False\n    hcausal = True\n    intercambia = True\n\n# limites de integral de convoluci\u00f3n\ntau_a = -sym.oo ; tau_b = sym.oo\nif hcausal==True:\n    tau_b = t\nif (xcausal and hcausal)==True:\n    tau_a = 0\n\n# integral de convoluci\u00f3n x(t)*h(t)\nxh = x.subs(t,tau)*h.subs(t,t-tau)\nxh = sym.expand(xh,t)\nZSR  = sym.integrate(xh,(tau,tau_a,tau_b))\nZSR  = sym.expand(ZSR,t)\nif not(ZSR.has(sym.Integral)):\n    ZSR = ss.simplifica_escalon(ZSR)\n#ZSR  = ZSR.subs(u**2,u) # Heaviside**2=Heaviside\n\nlista_escalon = ZSR.atoms(sym.Heaviside)\nZSR = sym.expand(ZSR,t) # terminos suma\nZSR = sym.collect(ZSR,lista_escalon)\n\n# restaura si hubo intercambio de x(t) y h(t)\nif intercambia == True:\n    xcausal = True\n    hcausal = False\n\n# graficar si no tiene Integral o error\ncond_graf = not(ZSR.has(sym.Integral))\ncond_graf = cond_graf and not(ZSR.has(sym.oo))\ncond_graf = cond_graf and not(ZSR.has(sym.nan))\n\n# SALIDA\nprint('xcausal: ',xcausal)\nprint('hcausal: ',hcausal)\nprint('limites de integral: &#x5B;',tau_a,',',tau_b,']')\nprint('x(t)*h(t-tau):')\nif xh.is_Add:\n    i=0\n    for term_suma in xh.args:\n        if i&gt;0:\n            print('+')\n        sym.pprint(term_suma)\n        i=i+1\nelse:\n    sym.pprint(xh)\nprint('\\n ZSR(t):')\nsym.pprint(ZSR)\nif hcausal==False:\n    print('revisar causalidad de h(t)')\nif xcausal==False:\n    print('revisar causalidad de x(t)')\nif intercambia:\n    print('considere intercambiar h(t)con x(t)')\nif not(cond_graf):\n    print('revisar acortar x(t) o h(t) para BIBO')\n\n# GRAFICA\nif cond_graf:\n    figura_xh_y = ss.graficar_xh_y(x,h,ZSR,t_a,t_b,\n                                   muestras,y_nombre='ZSR')\nelse: # terminos de integrales sin evaluar, infinito o nan\n    figura_x = ss.graficar_ft(x,t_a,t_b,muestras,'x')\n    figura_h = ss.graficar_ft(h,t_a,t_b,muestras,'h')\n#plt.show()\n\n# grafica animada de convoluci\u00f3n\n# n_archivo = '' # sin crear archivo gif animado \nn_archivo = 'convolucion02' # requiere 'pillow'\nif cond_graf:\n    figura_animada = ss.graf_animada_xh_y(x,h,ZSR,t_a,t_b,\n                      muestras, reprod_x = 4,y_nombre='y',\n                      archivo_nombre = n_archivo)\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 has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#integralconvolucion\">Integral convoluci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#causalnocausal\">causal\/No causal<\/a><\/p>\n\n\n\n<p><a href=\"#rectangularrampa\">Rect\/Rampa<\/a><\/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=\"rectangularrampa\">5. Ejemplo: Convoluci\u00f3n entre&nbsp; rectangular y rampa causales<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>:&nbsp;Oppenheim Ejemplo 2.7 p99<\/p>\n\n\n\n<p>Realizar la convoluci\u00f3n entre las siguientes dos se\u00f1ales:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t) = \\mu (t) - \\mu (t-1)<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> h(t) = t\\mu (t) - t\\mu (t-2)<\/span>\n\n\n\n<p>Para el desarrollo anal\u00edtico, se propone considerar usar las funciones por intervalos separados:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">y(t) = \\begin{cases} 0 , &amp; t \\lt 0 \\\\ \\frac{1}{2} t^2 , &amp; 0 &lt; t &lt; T \\\\ Tt-\\frac{1}{2}T^2 , &amp; T &lt; t &lt; 2T \\\\ - \\frac{1}{2}t^2 + Tt + \\frac{3}{2} T^2 , &amp; 2T &lt; t &lt; 3T \\\\ 0 . &amp; 3T &lt; t \\end{cases} <\/span>\n\n\n\n<p>Con las indicaciones se propone como tarea realizar el desarrollo anal\u00edtico. Observando la gr\u00e1fica animada y considerando los intervalos propuestos.<\/p>\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\/04\/convolucion03_animado.gif\" alt=\"convoluci\u00f3n rect\u00e1ngulo y rampa 03 gr\u00e1fico animado\" class=\"wp-image-19654\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>xcausal:  True\nhcausal:  True\nlimites de integral: &#091; 0 , t ]\nx(t)*h(t-tau):\nt*Heaviside(tau)*Heaviside(t - tau)\n+\nt*Heaviside(tau - 1)*Heaviside(t - tau - 2)\n+\ntau*Heaviside(tau)*Heaviside(t - tau - 2)\n+\ntau*Heaviside(t - tau)*Heaviside(tau - 1)\n+\n-t*Heaviside(tau)*Heaviside(t - tau - 2)\n+\n-t*Heaviside(t - tau)*Heaviside(tau - 1)\n+\n-tau*Heaviside(tau)*Heaviside(t - tau)\n+\n-tau*Heaviside(tau - 1)*Heaviside(t - tau - 2)\n\n ZSR(t):\n   2                                  2                \n  t *Heaviside(t)*Heaviside(t - 1)   t *Heaviside(t)   \n- -------------------------------- + --------------- + \n                 2                          2          \n\n   2                                      2                 2   \n  t *Heaviside(t - 3)*Heaviside(t - 2)   t *Heaviside(t - 2)    \n+ ------------------------------------ - -------------------- + \n                   2                              2            \n\n+ t*Heaviside(t)*Heaviside(t - 1) - t*Heaviside(t - 3)*Heaviside(t - 2) \n                                                                                           \n   Heaviside(t)*Heaviside(t - 1)   3*Heaviside(t- 3)*Heaviside(t - 2) \n- ----------------------------- - ----------------------------------- + \n                 2                                  2                \n\n                    2\n+ 2*Heaviside(t - 2) \n\n&gt;&gt;&gt;\n<\/code><\/pre>\n\n\n\n<p>En el resultado del algoritmo se encuentra que es necesario simplificar la expresi\u00f3n resultante al menos para los t\u00e9rminos con escal\u00f3n unitario, tales como u*u o u*u(t-1). Sympy '1.11.1' a\u00fan no incorpora esta simplificaci\u00f3n, por lo que se realiza una funci\u00f3n que revise t\u00e9rmino a t\u00e9rmino la expresi\u00f3n.<\/p>\n\n\n\n<p>La funci\u00f3n para simplificar escal\u00f3n unitario multiplicados se desarrolla en Simplificar multiplicaci\u00f3n entre impulso \u03b4(t) o escal\u00f3n unitario \u03bc(t) con Sympy, De donde se obtiene la instrucci\u00f3n para el algoritmo,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ZSR = ss.simplifica_escalon(ZSR)<\/code><\/pre>\n\n\n\n<p>El resultado luego de aplicar la funci\u00f3n sobre ZSR se muestra un poco mas simple:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code> ZSR(t):\n 2                 2                     2                     2              \nt *Heaviside(t)   t *Heaviside(t - 3)   t *Heaviside(t - 2)   t *Heaviside(t - 1)\n--------------- + ------------------- - ------------------- - -------------------\n       2                   2                     2                     2      \n\n                                                                              \n                                            3*Heaviside(t - 3)   Heaviside(t - 1)\n- t*Heaviside(t - 3) + t*Heaviside(t - 1) - ------------------ - ----------------\n                                                    2                   2        \n\n+ 2*Heaviside(t - 2)\n<\/code><\/pre>\n\n\n\n<p>y si reagrupan las expresiones por cada escal\u00f3n desplazado con <code>sym.collect()<\/code> se puede obtener:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lista_escalon = ZSR.atoms(sym.Heaviside)\nZSR = sym.expand(ZSR,t) <span style=\"color: #ff0000\"># terminos suma<\/span>\nZSR = sym.collect(ZSR,lista_escalon)<\/code><\/pre>\n\n\n\n<p>con el siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code> ZSR(t):\n 2                \/     2\\                     \/    2        \\                  \nt *Heaviside(t)   |    t  |                    |   t        1|                  \n--------------- + |2 - -- |*Heaviside(t - 2) + | - -- + t - -|*Heaviside(t - 1) \n       2          \\    2 \/                     \\   2        2\/                  \n\n  \/ 2        \\                 \n  |t        3|                 \n+ |-- - t - -|*Heaviside(t - 3)\n  \\2        2\/                 \n\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"606\" height=\"446\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/04\/convolucion03.png\" alt=\"convolucion 03 gr\u00e1fica\" class=\"wp-image-19655\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#integralconvolucion\">Integral convoluci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#causalnocausal\">causal\/No causal<\/a><\/p>\n\n\n\n<p><a href=\"#rectangularrampa\">Rect\/Rampa<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p><strong>Refererencia<\/strong>: But what is a convolution? 3Blue1Brown. 18 nov 2022<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"But what is a convolution?\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/KuXjwB4LzSA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Convolutions | Why X+Y in probability is a beautiful mess. 3Blue1Brown. 27-Junio-2023.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Convolutions | Why X+Y in probability is a beautiful mess\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/IaSGqQa5O-M?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#integralconvolucion\">Integral convoluci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#causalnocausal\">causal\/No causal<\/a><\/p>\n\n\n\n<p><a href=\"#rectangularrampa\">Rect\/Rampa<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Integral convoluci\u00f3n algoritmo gr\u00e1fica causal\/No causal Rect\/Rampa 1. Integral de convoluci\u00f3n Referencia: Lathi 2.4-1 p170, Ej 2.8 p173. El integral de convoluci\u00f3n de dos funciones x(t) y h(t) usa como operador el s\u00edmbolo&nbsp;\u2297 que representa el integral de la ecuaci\u00f3n mostrada. La funci\u00f3n h(t) representa la repuesta del sistema, funci\u00f3n de transferencia o respuesta a [&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-4594","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\/4594","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=4594"}],"version-history":[{"count":12,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/4594\/revisions"}],"predecessor-version":[{"id":24091,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/4594\/revisions\/24091"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=4594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=4594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=4594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}