{"id":11366,"date":"2017-08-04T07:19:33","date_gmt":"2017-08-04T12:19:33","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=11366"},"modified":"2026-03-12T06:09:50","modified_gmt":"2026-03-12T11:09:50","slug":"integracion-tramos-desiguales","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u05\/integracion-tramos-desiguales\/","title":{"rendered":"5.4 F\u00f3rmulas compuestas con \u0394x tramos desiguales con 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=\"#concepto\">tramo desigual<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#diferenciatramos\">diferencia tramos<\/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=\"concepto\">1. Tramos desiguales<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Chapra 21.3 p640<\/p>\n\n\n\n<p>En la pr\u00e1ctica, existen muchas situaciones con segmentos o tramos de tama\u00f1os desiguales. Por ejemplo, los datos&nbsp;obtenidos en experimentos frecuentemente son de este tipo. Para integraci\u00f3n num\u00e9rica, se busca identificar los segmentos de igual tama\u00f1o y aplicar:&nbsp;Simpson 3\/8, Simpson 1\/3&nbsp; o trapecio.<\/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\/08\/integralformulacompuesta01.png\" alt=\"integral formula compuesta 01\" class=\"wp-image-13623\" \/><\/figure>\n\n\n\n<p>El algoritmo se desarrolla al incorporar cada m\u00e9todo como integral num\u00e9rico de \"f\u00f3rmulas compuestas\".<\/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=\"#concepto\">tramo desigual<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#diferenciatramos\">diferencia tramos<\/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=\"ejercicio\">2. Ejercicio<\/h2>\n\n\n\n<p>Los datos de ejemplo son:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>xi = &#091;1.        , 1.22222222, 1.44444444, 1.66666667,\n      1.88888889, 2.11111111, 2+1\/3, 2+1\/3+0.2,\n      2+1\/3+0.4, 3.        ]\nfi = &#091;0.84147098, 1.03905509, 1.19226953, 1.28506615,\n      1.30542157, 1.24598661, 1.10453193, 0.90952929,\n      0.65637234, 0.24442702]<\/code><\/pre>\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=\"#concepto\">tramo desigual<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#diferenciatramos\">diferencia tramos<\/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=\"funcion\">3. Algoritmo como funci\u00f3n en Python<\/h2>\n\n\n\n<p>Los resultados del algoritmo muestran los detalles parciales al aplicar cada m\u00e9todo acorde a los requisitos de cada uno en el siguiente orden: <strong>Tres tramos iguales<\/strong> permiten aplicar Simpson de 3\/8, <strong>Dos tramos iguales<\/strong> permiten aplicar Simpson de 1\/3, <strong>Un tramo desigual<\/strong> le aplica trapecio.<\/p>\n\n\n\n<p>Los m\u00e9todos usados de identifican por el arreglo de tramos iguales:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>F\u00f3rmulas compuestas, tramos: 9\nm\u00e9todos 3:Simpson3\/8, 2:Simpson1\/3, 1:Trapecio, 0:usado\ntramos iguales en xi: &#091;3 0 0 3 0 0 2 0 1 0]\n Simpson 3\/8 : 0.7350425751495739\n Simpson 3\/8 : 0.8369852099634817\n Simpson 1\/3 : 0.3599347620000003\n trapecio : 0.1201065813333333\n Integral: 2.0520691284463894\nF\u00f3rmulas compuestas\ndxi: &#091;0.22222222 0.22222222 0.22222223 0.22222222 0.22222222 0.22222222\n 0.2        0.2        0.26666667]\ntramos iguales en xi: &#091;3 0 0 3 0 0 2 0 1 0]\nIntegral: 2.0520691284463894<\/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; highlight: [39,51,60]; title: ; notranslate\" title=\"\">\n# Formulas compuestas, tramos no iguales, \n# Integraci\u00f3n Simpson 3\/8, Simpson 1\/3 y trapecio\nimport numpy as np\n\n# INGRESO\nxi = &#x5B;1.        , 1.22222222, 1.44444444,\n      1.66666667, 1.88888889, 2.11111111,\n      2+1\/3, 2+1\/3+0.2, 2+1\/3+0.4, 3.        ]\nfi = &#x5B;0.84147098, 1.03905509, 1.19226953,\n      1.28506615, 1.30542157, 1.24598661,\n      1.10453193, 0.90952929, 0.65637234,\n      0.24442702]\n\n# PROCEDIMIENTO\ndef simpson_compuesto(xi,fi,vertabla=False,\n                      casicero=1e-7):\n    '''M\u00e9todo compuesto Simpson 3\/8, Simpson 1\/3 y trapecio\n    salida: integral,cuenta_h\n    '''\n    # vectores como arreglo, numeros reales\n    xi = np.array(xi,dtype=float)\n    fi = np.array(fi,dtype=float)\n    n = len(xi)\n\n    # M\u00e9todo compuesto Simpson 3\/8, Simpson 1\/3 y trapecio\n    cuenta_h = (-1)*np.ones(n,dtype=int) # sin usar\n    suma = 0 # integral total\n    suma_parcial =&#x5B;] # integral por cada m\u00e9todo\n    i = 0\n    while i&lt;(n-1): # i&lt;tramos, al menos un tramo\n        tramo_usado = False\n        h = xi&#x5B;i+1]-xi&#x5B;i] # tama\u00f1o de paso, supone constante\n        \n        # tres tramos iguales\n        if (tramo_usado==False) and (i+3)&lt;n:\n            d2x = np.diff(xi&#x5B;i:i+4],2) # diferencias entre tramos\n            errado = np.max(np.abs(d2x))\n            if errado&lt;casicero: # Simpson 3\/8\n                S38 = (3\/8)*h*(fi&#x5B;i]+3*fi&#x5B;i+1]+3*fi&#x5B;i+2]+fi&#x5B;i+3])\n                suma = suma + S38\n                cuenta_h&#x5B;i:i+3] = &#x5B;3,0,0] # Simpson 3\/8\n                suma_parcial.append(&#x5B;'Simpson 3\/8',S38])\n                i = i+3\n                tramo_usado = True\n\n        # dos tramos iguales\n        if (tramo_usado==False) and (i+2)&lt;n:\n            d2x = np.diff(xi&#x5B;i:i+3],2) # diferencias entre tramos\n            errado = np.max(np.abs(d2x))\n            if errado&lt;casicero: # Simpson 1\/3\n                S13 = (h\/3)*(fi&#x5B;i]+4*fi&#x5B;i+1]+fi&#x5B;i+2])\n                suma = suma + S13\n                cuenta_h&#x5B;i:i+2] = &#x5B;2,0]\n                suma_parcial.append(&#x5B;'Simpson 1\/3',S13])\n                i = i+2\n                tramo_usado = True\n                \n        # un tramo igual\n        if (tramo_usado == False) and (i+1)&lt;n:\n            trapecio = (h\/2)*(fi&#x5B;i]+fi&#x5B;i+1])\n            suma = suma + trapecio\n            cuenta_h&#x5B;i:i+1] = &#x5B;1] # usar trapecio\n            suma_parcial.append(&#x5B;'trapecio',trapecio])\n            i = i+1\n            tramo_usado = True\n            \n    cuenta_h&#x5B;n-1] = 0 # ultima casilla\n    \n    if vertabla==True: #mostrar datos parciales\n        print('F\u00f3rmulas compuestas, tramos:',n-1)\n        print('m\u00e9todos 3:Simpson3\/8, 2:Simpson1\/3, 1:Trapecio, 0:usado')\n        print('tramos iguales en xi:',cuenta_h)\n        for unparcial in suma_parcial:\n            print('',unparcial&#x5B;0],':',unparcial&#x5B;1])\n        print('','Integral:',suma)\n\n    return(&#x5B;suma,cuenta_h])\n\n# usa funci\u00f3n\n&#x5B;area,cuenta_h] = simpson_compuesto(xi,fi,vertabla=True)\n\n# SALIDA\nprint('F\u00f3rmulas compuestas:')\nprint('dxi:',np.diff(xi,1))\nprint('tramos iguales en xi:',cuenta_h)\nprint('Integral:',area)\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=\"#concepto\">tramo desigual<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#diferenciatramos\">diferencia tramos<\/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\">4. Gr\u00e1fica de segmentos desiguales<\/h2>\n\n\n\n<p>En la gr\u00e1fica se diferencian los m\u00e9todos aplicados por colores.<\/p>\n\n\n\n<p>Se a\u00f1aden al algoritmo anterior las siguientes instrucciones,<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA ---------------------\nimport matplotlib.pyplot as plt\nn = len(xi) # muestras\ntramos = n-1\nmetodotipo = &#x5B;&#x5B;'na','grey'],\n              &#x5B;'Trapecio','lightblue'],\n              &#x5B;'Simpson 1\/3','lightgreen'],\n              &#x5B;'Simpson 3\/8','cyan']]\n# etiquetas linea\nplt.plot(xi&#x5B;0],fi&#x5B;0],'o', label=metodotipo&#x5B;1]&#x5B;0],\n         color=metodotipo&#x5B;1]&#x5B;1])\nplt.plot(xi&#x5B;0],fi&#x5B;0],'o', label=metodotipo&#x5B;2]&#x5B;0],\n         color=metodotipo&#x5B;2]&#x5B;1])\nplt.plot(xi&#x5B;0],fi&#x5B;0],'o', label=metodotipo&#x5B;3]&#x5B;0],\n         color=metodotipo&#x5B;3]&#x5B;1])\n\n# relleno y bordes\ntipo = 0\nfor i in range(0,tramos,1):\n    if cuenta_h&#x5B;i]&gt;0:\n        tipo = cuenta_h&#x5B;i]\n    plt.fill_between(&#x5B;xi&#x5B;i],xi&#x5B;i+1]],\n                     &#x5B;fi&#x5B;i],fi&#x5B;i+1]],&#x5B;0,0],\n                     color=metodotipo&#x5B;tipo]&#x5B;1])        \n# Divisiones entre tramos\nfor i in range(0,n,1):\n    tipolinea = 'dashed' # inicia un m\u00e9todo\n    if cuenta_h&#x5B;i]==0: \n        tipolinea = 'dotted' # dentro de un m\u00e9todo\n    plt.vlines(xi&#x5B;i],0,fi&#x5B;i],linestyle=tipolinea,\n               color='orange')\n\n# puntos de xi,fi\nplt.plot(xi,fi,marker='o',linestyle='dashed',\n         color='orange',label='f(xi)')\n\nplt.axhline(0,color='black') # eje x\nplt.xlabel('x')\nplt.ylabel('f(x)')\nplt.title('Integral num\u00e9rico xi,fi con F\u00f3rmulas Compuestas')\nplt.legend()\nplt.tight_layout()\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=\"#concepto\">tramo desigual<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#diferenciatramos\">diferencia tramos<\/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=\"diferenciatramos\">5. Diferencias entre tramos x<sub>i<\/sub><\/h2>\n\n\n\n<p>Las diferencias entre tramos pueden ser analizadas con una gr\u00e1fica, usando operaciones de diferencias finitas.<\/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\/08\/diferenciastramosxi.png\" alt=\"diferencias tramos xi\" class=\"wp-image-13626\" \/><\/figure>\n\n\n\n<p>Resultado del algoritmo:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>d1xi: &#091;0.22222222 0.22222222 0.22222223 0.22222222 \n       0.22222222 0.22222222  0.2        0.2      \n       0.26666667]\nd2xi: &#091; 2.22044605e-16  9.99999972e-09 -9.99999972e-09\n       -2.22044605e-16  3.33333361e-09 -2.22222233e-02\n       -4.44089210e-16  6.66666667e-02]\ndiferencia d2xi m\u00e1xima: 4.440892098500626e-16  en i: 7\ntramos iguales en xi: &#091;3 0 0 2 0 1 2 0 1 0]<\/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# revisa xi por\n# tramos equidistantes y no iguales\nimport numpy as np\n\n# INGRESO\nxi = &#x5B;1.        , 1.22222222, 1.44444444, 1.66666667,\n      1.88888889, 2.11111111, 2+1\/3, 2+1\/3+0.2,\n      2+1\/3+0.4, 3.        ]\n\n# PROCEDIMIENTO\ncasicero=1e-7\n# vectores como arreglo, n\u00fameros reales\nxi = np.array(xi,dtype=float)\nn = len(xi)\n\n# diferencias finitas en xi\nd1xi = np.diff(xi,1) # magnitud de tramos\nd2xi = np.diff(xi,2) # diferencia entre tramos\nerrado = np.max(np.abs(d2xi)) # error mayor\ndonde = np.argmax(np.abs(d2xi))# donde es error mayor\n\n# revisa tramos iguales\ncuenta_h = -1*np.ones(n,dtype=int)\ni = 0\nwhile i&lt;(n-1): # i&lt;tramos, al menos un tramo\n    tramo_usado = False\n    \n    # tres tramos iguales\n    if (tramo_usado==False) and (i+3)&lt;n:\n        d2x = np.diff(xi&#x5B;i:i+4],2) # diferencias entre tramos\n        errado = np.max(np.abs(d2x))\n        if errado&lt;casicero: # Simpson 3\/8\n            cuenta_h&#x5B;i:i+3] = &#x5B;3,0,0]\n            i = i+3\n            tramo_usado==True\n            \n    # dos tramos iguales\n    if (tramo_usado==False) and (i+2)&lt;n:\n        d2x = np.diff(xi&#x5B;i:i+3],2) # diferencias entre tramos\n        errado = np.max(np.abs(d2x))\n        if errado&lt;casicero: # Simpson 1\/3\n            cuenta_h&#x5B;i:i+2] = &#x5B;2,0]\n            i = i+2\n            tramo_usado = True\n            \n    # un tramo igual\n    if (tramo_usado == False) and (i+1)&lt;n:\n        cuenta_h&#x5B;i:i+1] = &#x5B;1] # usar trapecio\n        i = i+1\n        tramo_usado = True\n\n    cuenta_h&#x5B;n-1] = 0 # ultima casilla\n\n# SALIDA\nprint('d1xi:',d1xi)\nprint('d2xi:',d2xi)\nprint('diferencia d2xi m\u00e1xima:',errado,' en i:',donde)\n\nprint('tramos iguales en xi:',cuenta_h)\n\n# GRAFICA\nimport matplotlib.pyplot as plt\nm = len(xi)-1\n\nplt.subplot(311) # diferencia entre tramos\nplt.stem(d2xi,linefmt=':',markerfmt ='C03')\nplt.plot(np.ones(n)*casicero,color='red',linestyle='dotted')\nplt.xlim(-0.1,m+0.1)\nplt.ylabel('diferencia tramos')\nplt.title('Diferencia entre tramos, muestras:'+str(n))\n\nplt.subplot(312) # tramos\nplt.stem(d1xi,linefmt=':',markerfmt ='C02')\nplt.xlim(-0.1,m+0.1)\nplt.ylabel('|tramo|')\n\nplt.subplot(313) # muestras\nplt.stem(xi,linefmt=':',markerfmt ='C01')\nplt.xlim(-0.1,m+0.1)\nplt.ylabel('xi')\nplt.xlabel('muestra i')\n\nplt.tight_layout()\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=\"#concepto\">tramo desigual<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#diferenciatramos\">diferencia tramos<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>tramo desigual ejercicio funci\u00f3n gr\u00e1fica diferencia tramos 1. Tramos desiguales Referencia: Chapra 21.3 p640 En la pr\u00e1ctica, existen muchas situaciones con segmentos o tramos de tama\u00f1os desiguales. Por ejemplo, los datos&nbsp;obtenidos en experimentos frecuentemente son de este tipo. Para integraci\u00f3n num\u00e9rica, se busca identificar los segmentos de igual tama\u00f1o y aplicar:&nbsp;Simpson 3\/8, Simpson 1\/3&nbsp; o [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"wp-custom-template-entrada-mn-unidades","format":"standard","meta":{"footnotes":""},"categories":[39],"tags":[],"class_list":["post-11366","post","type-post","status-publish","format-standard","hentry","category-mn-u05"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11366","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=11366"}],"version-history":[{"count":21,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11366\/revisions"}],"predecessor-version":[{"id":22881,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11366\/revisions\/22881"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=11366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=11366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=11366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}