{"id":3760,"date":"2017-04-09T13:20:01","date_gmt":"2017-04-09T18:20:01","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1001\/?p=3760"},"modified":"2026-04-05T23:01:59","modified_gmt":"2026-04-06T04:01:59","slug":"lti-ct-respuesta-impulso-scipy-runge-kutta-scilab","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u03\/lti-ct-respuesta-impulso-scipy-runge-kutta-scilab\/","title":{"rendered":"3.3.2 LTI CT \u2013 Respuesta a impulso unitario h(t) con Scipy, Runge-Kutta, Scilab"},"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=\"#htscipy\">h(t) Scipy<\/a><\/p>\n\n\n\n<p><a href=\"#htrungekutta\">h(t) Runge-Kutta<\/a><\/p>\n\n\n\n<p><a href=\"#htscilab\">h(t) Xcos-Scilab<\/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=\"htscipy\">1. Respuesta a impulso con sistema LTI definido en Scipy.signal<\/h2>\n\n\n\n<p>La librer\u00eda <strong>Scipy<\/strong>.signal permite definir un sistema LTI, usando los coeficientes de la ecuaci\u00f3n P, Q y las condiciones de inicio. La respuesta a un impulso unitario \u03b4(t) o funci\u00f3n de transferencia <strong>h<\/strong>(t) se calcula con una versi\u00f3n muestreada <strong>x<\/strong><sub>i<\/sub> a partir del tiempo muestreado en el intervalo [a,b].<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sistema = senal.lti(P,Q)\n<span style=\"color: #ff0000\"># respuesta a impulso<\/span>\n&#091;t_h, hi] = sistema.impulse(T = ti)<\/code><\/pre>\n\n\n\n<p>Del problema del \"<a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u03\/sistema-modelo-entrada-salida\/\" data-type=\"post\" data-id=\"522\">Sistema LTI CT \u2013 Modelo entrada-salida<\/a>\" y la ecuaci\u00f3n de segundo orden, se tiene dos opciones para la respuesta:<\/p>\n\n\n\n<p>- scipy.signal.impulse() donde solo se da el vector ti<br>- aplicar la teor\u00eda de los coeficientes donde solo la derivada de mayor orden de P(D) evaluada en cero, tiene el valor de uno. Todos los dem\u00e1s t\u00e9rminos tienen el valor de cero. Revisar la parte conceptual de la secci\u00f3n para respuesta a impulso.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"559\" height=\"468\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/04\/respuestaimpulso02Scipy.png\" alt=\"respuesta impulso 02 Scipy\" class=\"wp-image-19835\" \/><\/figure>\n\n\n\n<p>Para el ejercicio y como comprobaci\u00f3n se calculan las dos formas, con entrada cero y condici\u00f3n inicial [1,0] y con la funci\u00f3n de scipy, que son las usadas en la gr\u00e1fica.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Algoritmo en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Sistema lineal usando scipy.signal\n#   Q(D)y(t)=P(D)x(t)\n# ejemplo: (D^2+3D+2)y(t)=(D+0)x(t)\nimport numpy as np\nimport scipy.signal as senal\nimport matplotlib.pyplot as plt\n\n# INGRESO\n# Se\u00f1al de entrada x(t)\nx = lambda t: t*0\n\n# Sistema LTI\n# coeficients Q  P de la ecuaci\u00f3n diferencial\nQ = &#x5B;1., 3., 2.]\nP = &#x5B;1., 0.]\n# condiciones iniciales &#x5B;y'(0),y(0)]\ncond_inicio = &#x5B;1,0]\n\n# grafica, parametros\na = 0 ; b = 5 # intervalo observacion &#x5B;a,b] \nmuestras = 101\n\n# PROCEDIMIENTO\n# intervalo observado\nti = np.linspace(a, b, muestras)\nxi = x(ti)\n\nsistema = senal.lti(P,Q)\n\n# respuesta entrada cero\n&#x5B;t_y, yi, yc] = senal.lsim(sistema, xi, ti, cond_inicio)\n# respuesta a impulso\n&#x5B;t_h, hi] = sistema.impulse(T = ti)\n\n# SALIDA - GRAFICA\nplt.subplot(211)\nplt.suptitle('Respuesta a Impulso Unitario: h(t) = dy\/dt')\nplt.plot(ti, xi, color='blue', label='x(t)')\nplt.plot(t_h, hi, color='red', label='h(t)')\nplt.legend()\nplt.grid()\n\nplt.subplot(212)\n# plt.plot(t_y, yi, color='magenta', label='y(t)')\n# plt.plot(t_y, yc&#x5B;:,0], 'b-.', label='h(t)')\nplt.plot(t_y, yc&#x5B;:,1], color='orange', label='y0(t)')\n\nplt.xlabel('t')\nplt.legend()\nplt.grid()\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=\"#htscipy\">h(t) Scipy<\/a><\/p>\n\n\n\n<p><a href=\"#htrungekutta\">h(t) Runge-Kutta<\/a><\/p>\n\n\n\n<p><a href=\"#htscilab\">h(t) Xcos-Scilab<\/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=\"htrungekutta\">2. Algoritmo de Runge-Kutta d2y\/dx2 de An\u00e1lisis num\u00e9rico<\/h2>\n\n\n\n<p>Para el caso del algoritmo de Runge-Kutta, se aplica las condiciones iniciales de y(0)= 0 y y'(0)=1,<\/p>\n\n\n\n<p>siguiendo lo descrito en la parte te\u00f3rica y se toman los valores de <em><strong>z=y'<\/strong><\/em> para obtener el resultado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"549\" height=\"439\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/04\/respuestaimpulso01RungeKutta.png\" alt=\"respuesta impulso 01 Runge-Kutta\" class=\"wp-image-19836\" \/><\/figure>\n\n\n\n<p>Las instrucciones aplicadas al algoritmo de entrada cero se muestran a continuaci\u00f3n:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Algoritmo en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Respuesta a entrada cero\n# solucion para (D^2+ D + 1)y = 0\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ndef rungekutta2_fg(f,g,x0,y0,z0,h,muestras):\n    tamano = muestras + 1\n    estimado = np.zeros(shape=(tamano,3),dtype=float)\n    # incluye el punto &#x5B;x0,y0]\n    estimado&#x5B;0] = &#x5B;x0,y0,z0]\n    xi = x0\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        estimado&#x5B;i] = &#x5B;xi,yi,zi]\n    return(estimado)\n\n# PROGRAMA\nf = lambda t,y,z: z\ng = lambda t,y,z: -3*z -2*y\n\nt0 = 0\ny0 = 0\nz0 = 1\n\nh = 0.1\ntn = 5\nmuestras = int((tn-t0)\/h)\n\ntabla = rungekutta2_fg(f,g,t0,y0,z0,h,muestras)\nti = tabla&#x5B;:,0]\nyi = tabla&#x5B;:,1]\nzi = tabla&#x5B;:,2]\n\n# SALIDA\nnp.set_printoptions(precision=6)\nprint('t, y, z')\nprint(tabla)\n\n# GRAFICA\n#plt.plot(ti,yi, label='y(t)')\nplt.plot(ti,zi, color = 'Red', label='h(t)=dy\/dt')\n\nplt.ylabel('dy\/dt')\nplt.xlabel('t')\nplt.title('Respuesta impulso: Runge-Kutta 2do Orden d2y\/dx2 ')\nplt.legend()\nplt.grid()\nplt.show()\n<\/pre><\/div>\n\n\n<p>Recuerde que se aplican las modificaciones de acuerdo al planteamiento del problema, por lo que revise los conceptos antes de aplicar el algoritmo.<\/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=\"#htscipy\">h(t) Scipy<\/a><\/p>\n\n\n\n<p><a href=\"#htrungekutta\">h(t) Runge-Kutta<\/a><\/p>\n\n\n\n<p><a href=\"#htscilab\">h(t) Xcos-Scilab<\/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=\"htscilab\">3. LTI CT - Respuesta a impulso unitario h(t) - Diagrama Bloques con Xcos-Scilab<\/h2>\n\n\n\n<p>Para usar el simulador con diagrama de bloques para respuesta a impulso unitario, es necesario usar la expresi\u00f3n:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> h(t) = b_0 \\delta (t) +P(D)[y_n(t) \\mu(t)]<\/span>\n\n\n\n<p>Donde si el orden de P(D) es menor al orden de Q(D) entonces b<sub>0<\/sub>=0.<\/p>\n\n\n\n<p>Para el ejercicio desarrollado en el sistema modelo, P(D)=D, por lo que hay una sola derivada, que se puede obtener de la entrada del primer integrador de y(t).<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> ( D^2 + 3D +2 ) y(t) = Dx(t) <\/span>\n\n\n\n<p>Para obtener h(t), el impulso unitario x(t), es semejante a tener una condici\u00f3n inicial sin se\u00f1al de entrada, siguiendo la teor\u00eda descrita de sobre condiciones iniciales.<\/p>\n\n\n\n<p>El impulso unitario representa que y'(t) inicia con 1, por ser el t\u00e9rmino de m\u00e1s alto orden en P(D) y se configura el diagrama de bloques:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"371\" height=\"258\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/04\/respuestaimpulso01Blk.png\" alt=\"respuesta impulso 01 Blk\" class=\"wp-image-19837\" \/><\/figure>\n\n\n\n<p>Con lo que la respuesta del sistema al impulso unitario que se obtiene es:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"584\" height=\"273\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/04\/respuestaimpulso02Blk.png\" alt=\"respuesta impulso 02 Blk\" class=\"wp-image-19838\" \/><\/figure>\n\n\n\n<p>El par\u00e1metros inicial se configur\u00f3 en:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"586\" height=\"494\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/04\/respuestaimpulso04Blk.png\" alt=\"respuesta impulso 04 Blk\" class=\"wp-image-19839\" \/><\/figure>\n\n\n\n<p>Como referencia para observaci\u00f3n se muestra la salida y(t):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"584\" height=\"273\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/04\/respuestaimpulso03Blk.png\" alt=\"respuesta impulso 03 Blk\" class=\"wp-image-19840\" \/><\/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=\"#htscipy\">h(t) Scipy<\/a><\/p>\n\n\n\n<p><a href=\"#htrungekutta\">h(t) Runge-Kutta<\/a><\/p>\n\n\n\n<p><a href=\"#htscilab\">h(t) Xcos-Scilab<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>h(t) Scipy h(t) Runge-Kutta h(t) Xcos-Scilab 1. Respuesta a impulso con sistema LTI definido en Scipy.signal La librer\u00eda Scipy.signal permite definir un sistema LTI, usando los coeficientes de la ecuaci\u00f3n P, Q y las condiciones de inicio. La respuesta a un impulso unitario \u03b4(t) o funci\u00f3n de transferencia h(t) se calcula con una versi\u00f3n muestreada [&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-3760","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\/3760","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=3760"}],"version-history":[{"count":4,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/3760\/revisions"}],"predecessor-version":[{"id":24005,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/3760\/revisions\/24005"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=3760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=3760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=3760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}