{"id":3644,"date":"2019-07-03T04:47:10","date_gmt":"2019-07-03T09:47:10","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=3644"},"modified":"2025-12-23T10:16:09","modified_gmt":"2025-12-23T15:16:09","slug":"s1eva2019ti_t1-oxigeno-y-temperatura-en-agua","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-s1eva20\/s1eva2019ti_t1-oxigeno-y-temperatura-en-agua\/","title":{"rendered":"s1Eva2019TI_T1 Ox\u00edgeno y temperatura en agua"},"content":{"rendered":"\n<p><strong>Ejercicio<\/strong>: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-evalua\/mn-1e20\/1eva2019ti_t1-oxigeno-y-temperatura-en-agua\/\" data-type=\"post\" data-id=\"3640\">1Eva2019TI_T1 Ox\u00edgeno y temperatura en agua<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Literal a<\/h2>\n\n\n\n<p>Se requiere un polinomio de grado 3 siendo el eje x correspondiente a temperatura. Son necesarios 4 puntos de referencia alrededor de 15 grados, dos a la izquierda y dos a la derecha.<\/p>\n\n\n\n<p>Se observa que los datos en el eje x son equidistantes, h=8, y ordenados en forma ascendente, se cumple con los requisitos para usar diferencias finitas avanzadas. que tiene la forma de:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_n (x) = f_0 + \\frac{\\Delta f_0}{h} (x - x_0) + <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + \\frac{\\Delta^2 f_0}{2!h^2} (x - x_0)(x - x_1) + <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + \\frac{\\Delta^3 f_0}{3!h^3} (x - x_0)(x - x_1)(x - x_2) + \\text{...}<\/span>\n\n\n\n<p>Tabla<\/p>\n\n\n\n<figure class=\"wp-block-table alignwide\"><table><tbody><tr><th>xi<\/th><th>f[xi]<\/th><th>f[x1,x0]<\/th><th>f[x2,x1,x0]<\/th><th>f[x2,x1,x0]<\/th><th>f[x3,x2,x1,x0]<\/th><\/tr><tr><td>8<\/td><td>11.5<\/td><td>9.9-11.5=<br>-1.6<\/td><td>-1.5-(-1.6) =<br>0.1<\/td><td>0.4-0.1=<br>0.3<\/td><td>---<\/td><\/tr><tr><td>16<\/td><td>9.9<\/td><td>8.4-9.9=<br>-1.5<\/td><td>-1.1-(1.5)=<br>0.4<\/td><td>---<\/td><td>---<\/td><\/tr><tr><td>24<\/td><td>8.4<\/td><td>7.3-8.4=<br>-1.1<\/td><td>---<\/td><td>---<\/td><td>---<\/td><\/tr><tr><td>32<\/td><td>7.3<\/td><td>---<\/td><td>---<\/td><td>---<\/td><td>---<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Con lo que el polinomio buscado es:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3 (x) = 11.5 + \\frac{-1.6}{8} (x - 8) + <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + \\frac{0.1}{2!8^2} (x - 8)(x - 16) + \\frac{0.3}{3!8^3} (x - 8)(x - 16)(x - 24)<\/span>\n\n\n\n<p>Resolviendo y simplificando el polinomio, se puede observar que al aumentar el grado, la constante del t\u00e9rmino disminuye.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x)=12.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3 <\/span>\n\n\n\n<p>para el c\u00e1lculo del error se puede usar un t\u00e9rmino adicional del polinomio, a\u00f1adiendo un punto m\u00e1s a la tabla de diferencia finitas. Se eval\u00faa \u00e9ste t\u00e9rmino y se estima el error que dado que el t\u00e9rmino de grado 3 es del orden de 10-5, el error ser\u00e1 menor. (Tarea)<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(15)=12.9- 0.15 (15) - 0.00390625 (15)^2 + 0.00009765625 (15)^3 <\/span>\n\n\n\n<p>Evaluando el polinomio en temperatura = 15:<\/p>\n\n\n\n<p>p<sub>3<\/sub>(15) = 10.1006835937500<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">literal b<\/h2>\n\n\n\n<p>se deriva el polinomio del literal anterior y se eval\u00faa en 16:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p'_3(x)=0- 0.15 - 0.00390625 (2) x + 0.00009765625 (3)x^2 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p'_3(16)=0- 0.15 - 0.00390625 (2)(16) + 0.00009765625 (3)(16)^2 <\/span>\n\n\n\n<p>p'<sub>3<\/sub>(16) = -0.20<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">literal c<\/h2>\n\n\n\n<p>El valor de ox\u00edgeno usado como referencia es 9, cuyos valores de temperatura se encuentran entre 16 y 24 que se toman como rango inicial de b\u00fasqueda [a,b]. Por lo que el polinomio se iguala a 9 y se crea la forma estandarizada del problema:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x)=9 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 9 = 12.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 12.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3 -9 = 0 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> f(x) = 3.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3 <\/span>\n\n\n\n<p>Para mostrar el procedimiento se realizan solo tres iteraciones,<\/p>\n\n\n\n<p>1ra Iteraci\u00f3n<br>a=16 , b = 24, c = (16+24)\/2 = 20<br>f(a) = 0.9, f(b) = -0.6, f(c) = 0.011<br>error = |24-16| = 8<br>como f(c) es positivo, se mueve el extremo f(x) del mismo signo, es decir a<\/p>\n\n\n\n<p>2da Iteraci\u00f3n<br>a=20 , b = 24, c = (20+24)\/2 = 22<br>f(a) = 0.119, f(b) = -0.6, f(c) = -0.251<br>error = |24-20|= 4<br>como f(c) es negativo, se mueve el extremo f(x) del mismo signo, b<\/p>\n\n\n\n<p>3ra Iteraci\u00f3n<br>a=20 , b = 22, c = (20+22)\/2 = 21<br>f(a) = 0.119, f(b) = -0.251, f(c) = -0.068<br>error = |22-20| = 2<br>como f(c) es negativo, se mueve el extremo f(x) del mismo signo, b<br>y as\u00ed sucesivamente hasta que error&lt; que 10<sup>-3<\/sup><\/p>\n\n\n\n<p>Usando el algoritmo en Python se obtendr\u00e1 la ra\u00edz en 20.632 con la tolerancia requerida.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Revisi\u00f3n de resultados<\/h2>\n\n\n\n<p>Usando como base los algoritmos desarrollados en clase:<\/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\/2019\/07\/oxigenoTemperatura_p3.png\" alt=\"oxigeno temperatura p3\" class=\"wp-image-18785\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>tabla de diferencias finitas\n&#091;'i', 'xi', 'fi', 'df1', 'df2', 'df3', 'df4']\n&#091;&#091; 0.   8.  11.5 -1.6  0.1  0.3  0. ]\n &#091; 1.  16.   9.9 -1.5  0.4  0.   0. ]\n &#091; 2.  24.   8.4 -1.1  0.   0.   0. ]\n &#091; 3.  32.   7.3  0.   0.   0.   0. ]]\ndfinita:  &#091;-1.6  0.1  0.3  0. ]\n11.5 +\n+( -1.6 \/ 8.0 )* ( x - 8.0 )\n+( 0.1 \/ 128.0 )*  (x - 16.0)*(x - 8.0) \n+( 0.3 \/ 3072.0 )*  (x - 24.0)*(x - 16.0)*(x - 8.0) \npolinomio simplificado\n9.8e-5*x**3 - 0.003923*x**2 - 0.149752*x + 12.898912\nLiteral a\n9.8e-5*x**3 - 0.003923*x**2 - 0.149752*x + 12.898912\np(15) =  10.1007070000000\n\nLiteral b\n0.000294*x**2 - 0.007846*x - 0.149752\ndp(16) = -0.200024000000000\nm\u00e9todo de Bisecci\u00f3n\ni &#091;'a', 'c', 'b'] &#091;'f(a)', 'f(c)', 'f(b)']\n   tramo\n0 &#091;16, 20.0, 24] &#091; 0.9     0.1187 -0.6   ]\n   4.0\n1 &#091;20.0, 22.0, 24] &#091; 0.1187 -0.2509 -0.6   ]\n   2.0\n2 &#091;20.0, 21.0, 22.0] &#091; 0.1187 -0.0683 -0.2509]\n   1.0\n3 &#091;20.0, 20.5, 21.0] &#091; 0.1187  0.0246 -0.0683]\n   0.5\n4 &#091;20.5, 20.75, 21.0] &#091; 0.0246 -0.022  -0.0683]\n   0.25\n5 &#091;20.5, 20.625, 20.75] &#091; 0.0246  0.0013 -0.022 ]\n   0.125\n6 &#091;20.625, 20.6875, 20.75] &#091; 0.0013 -0.0104 -0.022 ]\n   0.0625\n7 &#091;20.625, 20.65625, 20.6875] &#091; 0.0013 -0.0045 -0.0104]\n   0.03125\n8 &#091;20.625, 20.640625, 20.65625] &#091; 0.0013 -0.0016 -0.0045]\n   0.015625\n9 &#091;20.625, 20.6328125, 20.640625] &#091; 0.0013 -0.0002 -0.0016]\n   0.0078125\n10 &#091;20.625, 20.62890625, 20.6328125] &#091; 0.0013  0.0006 -0.0002]\n   0.00390625\n11 &#091;20.62890625, 20.630859375, 20.6328125] &#091; 0.0006  0.0002 -0.0002]\n   0.001953125\n12 &#091;20.630859375, 20.6318359375, 20.6328125] &#091; 1.9762e-04  1.5502e-05 -1.6661e-04]\n   0.0009765625\nra\u00edz en:  20.6318359375<\/code><\/pre>\n\n\n\n<p>Algoritmos Python usando la funci\u00f3n de interpolaci\u00f3n y un procedimiento encontrado en:<\/p>\n\n\n\n<p class=\"entry-title\"><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u04\/diferencias-finitas-avanzadas-polinomio\/\" data-type=\"post\" data-id=\"557\">Interpolaci\u00f3n por Diferencias finitas avanzadas<\/a><\/p>\n\n\n\n<p class=\"entry-title\"><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u02\/metodo-biseccion\/\" data-type=\"post\" data-id=\"184\">M\u00e9todo de la Bisecci\u00f3n \u2013 Ejemplo con Python<\/a><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# 1Eva_IT2019_T1 Ox\u00edgeno y temperatura en mar\nimport numpy as np\nimport math\nimport matplotlib.pyplot as plt\nimport sympy as sym\n\ndef interpola_dfinitasAvz(xi,fi, vertabla=False,\n                       precision=6, casicero = 1e-15):\n    '''Interpolaci\u00f3n de diferencias finitas\n    resultado: polinomio en forma simb\u00f3lica,\n    redondear a cero si es menor que casicero \n    '''\n    xi = np.array(xi,dtype=float)\n    fi = np.array(fi,dtype=float)\n    n = len(xi)\n    # revisa tama\u00f1os de paso equidistantes\n    h_iguales = pasosEquidistantes(xi, casicero)\n    if vertabla==True:\n        np.set_printoptions(precision)\n    # POLINOMIO con diferencias Finitas avanzadas\n    x = sym.Symbol('x')\n    polisimple = sym.S.Zero # expresi\u00f3n del polinomio con Sympy\n    if h_iguales==True:\n        tabla,titulo = dif_finitas(xi,fi,vertabla)\n        h = xi&#x5B;1] - xi&#x5B;0]\n        dfinita = tabla&#x5B;0,3:]\n        if vertabla==True:\n            print('dfinita: ',dfinita)\n            print(fi&#x5B;0],'+')\n        n = len(dfinita)\n        polinomio = fi&#x5B;0]\n        for j in range(1,n,1):\n            denominador = math.factorial(j)*(h**j)\n            factor = np.around(dfinita&#x5B;j-1]\/denominador,precision)\n            termino = 1\n            for k in range(0,j,1):\n                termino = termino*(x-xi&#x5B;k])\n            if vertabla==True:\n                txt1='';txt2=''\n                if n&lt;=2 or j&lt;=1:\n                    txt1 = '('; txt2 = ')'\n                print('+(',np.around(dfinita&#x5B;j-1],precision),\n                      '\/',np.around(denominador,precision),\n                      ')*',txt1,termino,txt2)\n            polinomio = polinomio + termino*factor\n        # simplifica multiplicando entre (x-xi)\n        polisimple = polinomio.expand() \n    if vertabla==True:\n        print('polinomio simplificado')\n        print(polisimple)\n    return(polisimple)\n\ndef dif_finitas(xi,fi, vertabla=False):\n    '''Genera la tabla de diferencias finitas\n    resultado en: &#x5B;t\u00edtulo,tabla]\n    Tarea: verificar tama\u00f1o de vectores\n    '''\n    xi = np.array(xi,dtype=float)\n    fi = np.array(fi,dtype=float)\n    # Tabla de Diferencias Finitas\n    titulo = &#x5B;'i','xi','fi']\n    n = len(xi)\n    ki = np.arange(0,n,1)\n    tabla = np.concatenate((&#x5B;ki],&#x5B;xi],&#x5B;fi]),axis=0)\n    tabla = np.transpose(tabla)\n    # diferencias finitas vacia\n    dfinita = np.zeros(shape=(n,n),dtype=float)\n    tabla = np.concatenate((tabla,dfinita), axis=1)\n    # Calcula tabla, inicia en columna 3\n    &#x5B;n,m] = np.shape(tabla)\n    diagonal = n-1\n    j = 3\n    while (j &lt; m):\n        # A\u00f1ade t\u00edtulo para cada columna\n        titulo.append('df'+str(j-2))\n        # cada fila de columna\n        i = 0\n        while (i &lt; diagonal):\n            tabla&#x5B;i,j] = tabla&#x5B;i+1,j-1]-tabla&#x5B;i,j-1]\n            i = i+1\n        diagonal = diagonal - 1\n        j = j+1\n    if vertabla==True:\n        print('tabla de diferencias finitas')\n        print(titulo)\n        print(tabla)\n    return(tabla, titulo)\n\ndef pasosEquidistantes(xi, casicero = 1e-15):\n    ''' Revisa tama\u00f1os de paso h en vector xi.\n    True:  h son equidistantes,\n    False: h tiene tama\u00f1o de paso diferentes y d\u00f3nde.\n    '''\n    xi = np.array(xi,dtype=float)\n    n = len(xi)\n    # revisa tama\u00f1os de paso equidistantes\n    h_iguales = True\n    if n&gt;3: \n        dx = np.zeros(n,dtype=float)\n        for i in range(0,n-1,1): # calcula hi como dx\n            dx&#x5B;i] = xi&#x5B;i+1]-xi&#x5B;i]\n        for i in range(0,n-2,1): # revisa diferencias\n            dx&#x5B;i] = dx&#x5B;i+1]-dx&#x5B;i]\n            if dx&#x5B;i]&lt;=casicero: # redondea cero\n                dx&#x5B;i]=0\n            if abs(dx&#x5B;i])&gt;0:\n                h_iguales=False\n                print('tama\u00f1os de paso diferentes en i:',i+1,',',i+2)\n        dx&#x5B;n-2]=0\n    return(h_iguales)\n\n# PROGRAMA ----------------\n\n# INGRESO\ntm = &#x5B;0.,8,16,24,32,40]\nox = &#x5B;14.6,11.5,9.9,8.4,7.3,6.4]\n\nxi = &#x5B;8,16,24,32]\nfi = &#x5B;11.5,9.9,8.4,7.3]\n\n# PROCEDIMIENTO\nx = sym.Symbol('x')\n# literal a\npolinomio = interpola_dfinitasAvz(xi,fi, vertabla=True)\np15 = polinomio.subs(x,15)\n# literal b\nderivap = polinomio.diff(x,1)\ndp16 = derivap.subs(x,16)\n\npx =  sym.lambdify(x,polinomio)\nxk = np.linspace(np.min(xi),np.max(xi))\npk = px(xk)\n\n# SALIDA\nprint('Literal a')\nprint(polinomio)\nprint('p(15) = ',p15)\nprint('Literal b')\nprint(derivap)\nprint('dp(16) =', dp16)\n\n# gr\u00e1fica\nplt.plot(tm,ox,'ro')\nplt.plot(xk,pk)\nplt.axhline(9,color=&quot;green&quot;)\nplt.xlabel('temperatura')\nplt.ylabel('concentracion de oxigeno')\nplt.grid()\nplt.show()\n\n# --------literal c ------------\n\ndef biseccion(fx,a,b,tolera,iteramax = 20, vertabla=False, precision=4):\n    '''\n    Algoritmo de Bisecci\u00f3n\n    Los valores de &#x5B;a,b] son seleccionados\n    desde la gr\u00e1fica de la funci\u00f3n\n    error = tolera\n    '''\n    fa = fx(a)\n    fb = fx(b)\n    tramo = np.abs(b-a)\n    itera = 0\n    cambia = np.sign(fa)*np.sign(fb)\n    if cambia&lt;0: # existe cambio de signo f(a) vs f(b)\n        if vertabla==True:\n            print('m\u00e9todo de Bisecci\u00f3n')\n            print('i', &#x5B;'a','c','b'],&#x5B; 'f(a)', 'f(c)','f(b)'])\n            print('  ','tramo')\n            np.set_printoptions(precision)\n            \n        while (tramo&gt;=tolera and itera&lt;=iteramax):\n            c = (a+b)\/2\n            fc = fx(c)\n            cambia = np.sign(fa)*np.sign(fc)\n            if vertabla==True:\n                print(itera,&#x5B;a,c,b],np.array(&#x5B;fa,fc,fb]))\n            if (cambia&lt;0):\n                b = c\n                fb = fc\n            else:\n                a = c\n                fa = fc\n            tramo = np.abs(b-a)\n            if vertabla==True:\n                print('  ',tramo)\n            itera = itera + 1\n        respuesta = c\n        # Valida respuesta\n        if (itera&gt;=iteramax):\n            respuesta = np.nan\n\n    else: \n        print(' No existe cambio de signo entre f(a) y f(b)')\n        print(' f(a) =',fa,',  f(b) =',fb) \n        respuesta=np.nan\n    return(respuesta)\n# se convierte forma de s\u00edmbolos a num\u00e9ricos\nbuscar = polinomio-9\nfx = sym.lambdify(x,buscar)\n\n# INGRESO\na = 16\nb = 24\ntolera = 0.001\n\n# PROCEDIMIENTO\nrespuesta = biseccion(fx,a,b,tolera,vertabla=True)\n\n# SALIDA\nprint('ra\u00edz en: ', respuesta)\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Ejercicio: 1Eva2019TI_T1 Ox\u00edgeno y temperatura en agua Literal a Se requiere un polinomio de grado 3 siendo el eje x correspondiente a temperatura. Son necesarios 4 puntos de referencia alrededor de 15 grados, dos a la izquierda y dos a la derecha. Se observa que los datos en el eje x son equidistantes, h=8, y [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-mn-ejemplo","format":"standard","meta":{"footnotes":""},"categories":[45],"tags":[58,54],"class_list":["post-3644","post","type-post","status-publish","format-standard","hentry","category-mn-s1eva20","tag-ejemplos-python","tag-mnumericos"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/3644","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=3644"}],"version-history":[{"count":3,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/3644\/revisions"}],"predecessor-version":[{"id":18786,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/3644\/revisions\/18786"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=3644"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=3644"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=3644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}