Autor: Edison Del Rosario

  • 1Eva_IT2016_T2_MN Organismos patógenos en lago

    1ra Evaluación I Término 2016-2017. 28/junio/2016. ICM02188 Métodos Numéricos

    Tema 2. (25 puntos) Tres organismos patógenos decaen en forma exponencial en aguas de un lago de acuerdo con el siguiente modelo:

    p(t) = A e^{-1.5t} + B e^{-0.3t} + C e^{-0.05t}

    Estime la población inicial de cada organismo, dadas las mediciones siguientes:

    Tiempo
    (horas)
    0.5 1 2 3 4
    Población
    (miles)
    6.0 4.4 3.2 2.7 2.2

    a) Seleccione los tres primeros puntos y plantee un sistema de 3 ecuaciones.
    b) Con el método de Jacobi encuentre la matriz T y comente.
    c) Con el método de Gauss Seidel realice tres iteraciones y estime el error.

    Rúbrica: Ecuaciones (5 puntos), matriz (5 puntos), comentario (6 puntos), Iteraciones (5 puntos), estimación del error (4 puntos).


    Referencia: Cuales son los agentes patógenos del agua.
    https://www.ecomol.es/tratamientos/cuales-son-los-agentes-patogenos-del-agua/

     

  • 1Eva_IT2016_T1_MN. Contaminante en lago

    1ra Evaluación I Término 2016-2017. 28/junio/2016. ICM02188 Métodos Numéricos

    Tema 1. (25 puntos) El balance de masa de un contaminante en un lago, bien mezclado, se expresa mediante la ecuación:

    V\frac{dc}{dt} = W - Qc-kV(\sqrt[3]{c})

    Dados los valores de parámetros:

    V=1x106 m3, 
    Q=1x105 m3/año
    W=1x106 g/año
    k=0.25m0.5/g0.5/año

    se quiere hallar la concentración c de estado estable (dc/dt= 0)

    a) Utilizando el método de Newton, encuentre un modelo iterativo x=g(x) para aproximar c y un intervalo de existencia y convergencia.

    b) Realice las iteraciones presentando el error en cada iteración.

    Rúbrica:
    a) Hallar g (5 puntos), intervalo de existencia (2 puntos), intervalo de convergencia (6 puntos)
    b) Iteraciones hasta (8 puntos), estimación del error hasta (4 puntos)

  • s1Eva_IT2016_T3_MN Tasa interés anual

    Ejercicio: 1Eva_IT2016_T3_MN Tasa interés anual

    Propuesta de Solución  empieza con el planteamiento del problema, luego se desarrolla con el método de Bisección y método del Punto Fijo solo con el objetivo de comparar resultados.


    Planteamiento del problema

    La fórmula del enunciado para el problema es:

    A = P \frac{i(1+i)^{n}}{(1+i)^{n} -1}

    que con los datos dados se convierte a:

    5800 = 35000 \frac{i(1+i)^8}{(1+i)^8 -1} 35000 \frac{i(1+i)^8}{(1+i)^8 -1}-5800 =0

    que es la forma de f(x) = 0

    f(i)=35000 \frac{i(1+i)^8}{(1+i)^8 -1}-5800

    Intervalo de búsqueda

    Como el problema plantea la búsqueda de una tasa de interés, consideramos que:

    • Las tasas de interés no son negativas. ⌉(i<0)
    • Las tasas de interés no son cero en las instituciones bancarias (i≠0)
    • Las tasas muy grandes 1 = 100/100 = 100% tampoco tienen mucho sentido

    permite acotar la búsqueda a un intervalo (0,1].
    Sin embargo tasas demasiado altas tampoco se consideran en el problema pues el asunto es regulado (superintendencia de bancos), por lo que se podría intentar entre un 1% = 0.01l y la mitad del intervalo 50%= 0.5 quedando

    [0.01,0.5]

    Tolerancia

    si la tolerancia es de tan solo menor a un orden de magnitud que el valor buscado, se tiene que las tasas de interés se representan por dos dígitos después del punto decimal, por lo que la tolerancia debe ser menor a eso.

    Por ejemplo: tolerancia < 0.001 o aumentando la precisión

    tolera = 0.0001


    Método de la Bisección

    itera = 1

    a = 0.01, b = 0.5

    c = \frac{a+b}{2} = \frac{0.01+0.5}{2} = 0.255 f(0.01) = 35000 \frac{0.01(1+0.01)^8}{(1+0.01)^8-1}-5800 = -1225.83 f(0.5) = 35000 \frac{0.5(1+0.5i)^8}{(1+0.5)^8-1}-5800 = 12410.54

    con lo que se verifica que existe cambio de signo al evaluar f(x) en el intervalo y puede existir una raíz.

    f(0.255) = 35000 \frac{0.255(1+0.255)^8}{(1+0.255)^8-1}-5800 = 4856.70

    lo que muestra que f(x) tiene signos en a,c,b de (-) (+) (+), seleccionamos el intervalo izquierdo para continuar la búsqueda [0.01, 0.255]

    El tramo permite estimar el error, reduce el intervalo a:

    tramo = b-a = 0.255-0.01 = 0.245

    valor que todavía es más grande que la tolerancia de 10-4, por lo que hay que continuar las iteraciones.

    itera = 2

    a = 0.01, b = 0.255

    c = \frac{0.01+0.255}{2} = 0.1325 f(0.01) = -1225.83 f(0.255) = 4856.70 f(0.1325 ) = 35000 \frac{0.1325(1+0.1325)^8}{(1+0.1325)^8-1}-5800 = 1556.06

    lo que muestra que f(x) tiene signos en a,c,b de (-) (+) (+), seleccionamos el intervalo izquierdo para continuar la búsqueda [0.01, 0.1325]

    El tramo permite estimar el error, reduce el intervalo a:

    tramo = b-a = 0.1325-0.01 = 0.1225

    valor que todavía es más grande que la tolerancia de 10-4, por lo que hay que continuar las iteraciones.

    itera = 3

    a = 0.01, b = 0.1325

    c = \frac{0.01+0.1225}{2} = 0.071 f(0.01) = -1225.83 f(0.1325) = 1556.06 f(0.071 ) = 35000 \frac{0.071(1+0.071)^8}{(1+0.071)^8-1}-5800 = 89.79

    lo que muestra que f(x) tiene signos en a,c,b de (-) (+) (+), seleccionamos el intervalo izquierdo para continuar la búsqueda [0.01, 0.071]

    El tramo permite estimar el error, reduce el intervalo a:

    tramo = b-a = 0.071-0.01 = 0.061

    valor que todavía es más grande que la tolerancia de 10-4, por lo que hay que continuar las iteraciones.

    Para una evaluación del tema en forma escrita es suficiente para mostrar el objetivo de aprendizaje, el valor final se lo encuentra usando el algoritmo.

           raiz en:  0.06724243164062502
    error en tramo:  5.981445312500111e-05
    iteraciones:  13
    >>>

    Algoritmo en Python

    # 1Eva_IT2016_T3_MN Tasa interés anual
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    fx = lambda x: 35000*(x*(1+x)**8)/((1+x)**8 -1) -5800
    a = 0.01
    b = 0.5
    tolera = 0.0001
    
    # PROCEDIMIENTO
    cuenta = 0
    np.set_printoptions(precision=3)
    tramo = b-a
    while not(tramo<tolera):
        c = (a+b)/2
        fa = fx(a)
        fb = fx(b)
        fc = fx(c)
        cambia = np.sign(fa)*np.sign(fc)
        if cambia < 0: a = a b = c if cambia > 0:
            a = c
            b = b
        tramo = b-a
        cuenta = cuenta+1
    
    # SALIDA
    print('       raiz en: ', c)
    print('error en tramo: ', tramo)
    print('iteraciones: ',cuenta)
    


    Método del Punto Fijo

    El planteamiendo del punto fijo se realiza con x= g(x), por lo que se reordena la ecuación a:

    35000 \frac{i(1+i)^8}{(1+i)^8 -1}-5800 =0 35000 \frac{i(1+i)^8}{(1+i)^8 -1}=5800 \frac{i(1+i)^8}{(1+i)^8 -1}=\frac{5800}{35000} i=\frac{58}{350} \frac{(1+i)^8 -1} {i(1+i)^8}

    con lo que g(x) es:

    g(i)=\frac{58}{350} \frac{(1+i)^8 -1} {(1+i)^8}

    valor inicial de búsqueda

    Para el punto inicial i0 se puede usar uno de los extremos del intervalo propuesto en la sección de planteamiento. Para reducir aun más la búsqueda se pude seleccionar el punto intermedio

     i0 = 0.255

    Itera = 1

     i0 = 0.255

    g(0.255i)=\frac{58}{350} \frac{(1+0.255)^8 -1} {(1+0.255)^8} = 0.1387

    el error se estrima como el tramo recorrido entre el valor nuevo y el valor inicial

    tramo = | nuevo-antes| = |0.1387 - 0.255| = 0.1163

    como el tramo o error es aún mayor que el valor de tolera, se continúa con la siguiente iteración.

    Itera = 2

    i1 = g(i0 ) = 0.1387

    g(0.1387)=\frac{58}{350} \frac{(1+0.1387)^8 -1} {(1+0.1387)^8} = 0.1071

    el error se estrima como el tramo recorrido entre el valor nuevo y el valor inicial

    tramo = | nuevo-antes| = |0.1071 - 0.1387| = 0,0316

    como el tramo o error es aún mayor que el valor de tolera, se continúa con la siguiente iteración.

    Itera = 3

    i2 = g(i1 ) = 0.1071

    g(0.1071)=\frac{58}{350} \frac{(1+0.1071)^8 -1} {(1+0.1071)^8} = 0.0922

    el error se estrima como el tramo recorrido entre el valor nuevo y el valor inicial

    tramo = | nuevo-antes| = |0.0922 - 0.1071| = 0,0149

    como el tramo o error es aún mayor que el valor de tolera, se continúa con la siguiente iteración.

    Observación: Como el error disminuye entre cada iteración, se considera que el método converge, si se realizan suficientes iteraciones se cumplierá con el valor de tolerancia y se habrá llegado a la precisión requerida.

    Usando el algoritmo se tiene:

    iteraciones: 17
        raiz en: 0.06754389199556779
    >>>

    Algoritmo en Python

    # Algoritmo de Punto Fijo
    # x0 valor inicial de búsqueda
    # error = tolera
    
    import numpy as np
    def puntofijo(gx,antes,tolera, iteramax=50):
        itera = 1 # iteración
        nuevo = gx(antes)
        tramo = abs(nuevo-antes)
        while(tramo>=tolera and itera<=iteramax ):
            antes = nuevo
            nuevo = gx(antes)
            tramo = abs(nuevo-antes)
            itera = itera+1
        respuesta = nuevo
        # Validar respuesta
        if (itera>=iteramax ):
            respuesta = np.nan
        print('iteraciones:',itera)
        return(respuesta)
    
    # PROGRAMA ---------
    
    # INGRESO
    gx = lambda i: (58/350)*((1+i)**8-1)/((1+i)**8)
    
    a = 0       # intervalo
    b = 0.5
    
    x0 = 0.255
    tolera = 0.0001
    iteramax  = 50      # itera máximo
    
    # PROCEDIMIENTO
    respuesta = puntofijo(gx,0.255,tolera,iteramax)
    
    # SALIDA
    print('    raiz en:',respuesta)
    
  • 1Eva_IT2015_T4 Lingotes metales

    1ra Evaluación I Término 2015-2016. 7/julio/2015. ICM00158

    Tema 4. (25 puntos) Se tienen cuatro lingotes de 100 gramos, cada uno  compuesto de la forma mostrada en la tabla.

    lingotes fundir

    Se requiere determinar el peso en gramos que debe tomarse de cada uno de los cuatro lingotes anteriores para formar un nuevo lingote de 100 gramos que contenga:

    27 gramos de oro, 39.5 gramos de plata, 14 gramos de cobre y 19.5 gramos de estaño.

    Composición (gramos)
    Oro Plata Cobre Estaño
    Lingote 1 20 50 20 10
    Lingote 2 30 40 10 20
    Lingote 3 20 40 10 30
    Lingote 4 50 20 20 10

    a) Plantee un modelo matemático para describir este problema

    b) Describa un método numérico directo para encontrar la solución.
    Muestre evidencia suficiente del uso del método numérico

    c) Encuentre una cota para el error en la solución calculada y comente.

    Rúbrica: literal a (7 puntos), literal b (10 puntos), literal c (8 puntos)


    compuesto = np.array([[ 20, 50, 20, 10],
                          [ 30, 40, 10, 20],
                          [ 20, 40, 10, 30],
                          [ 50, 20, 20, 10]])
    proporcion = np.array([ 27, 39.5, 14, 19.5])
    
  • 1Eva_IT2015_T3 Temperatura en Placa

    1ra Evaluación I Término 2015-2016. 7/julio/2015. ICM00158

    Tema 3. (25 puntos) La distribución de temperatura de estado estable en una placa cuadrada, de 30 cm de lado y caliente está modelada por la ecuación de Laplace:

    \frac{\delta ^2 T}{\delta x^2} + \frac{\delta ^2 T}{\delta y^2} =0

    Se representa la placa por una serie de nodos que forman cuadrículas que indican la temperatura en dichos nodos.

    Ya se ha calculado la temperatura en los nodos interiores de la placa, estos valores son:

    T11 = 106.25 
    T12 = 93.75 
    T21 = 56.25
    T22 = 43.75

    Utilice un polinomio de grado tres en ambas direcciones para aproximar la temperatura en el centro de la placa.

    25ºC 25ºC
    200ºC  T12 T22 0ºC
    200ºC  T11 T21 0ºC
     75ºC 75ºC

    Rúbrica: a) Interpolar en x=10, y=15 cm (7 puntos), b) Interpolar en x=20, y=15 cm (7 puntos), c) Interpolar en y=15, x=15 cm (11 puntos)

  • 1Eva_IT2015_T2 Salida cardiaca

    1ra Evaluación I Término 2015-2016. 7/julio/2015. ICM00158

    Tema 2. (25 puntos) La salida cardiaca es el número de litros de sangre que el corazón bombea por minuto.http://userscontent2.emaze.com/images/509d8bed-542c-4fee-812e-6aadf2439e69/308599f5-472a-4020-9157-18abc4af27f8.jpg

    Para una persona en reposo, la tasa es de 5 a 6 litros por minuto.
    Si se trata de un maratonista durante una carrera, la salida cardiaca puede ser tan elevada como 30 litros por minuto.

    Se inyecta un colorante al torrente circulatorio de un paciente para medir su salida cardiaca, que es la tasa de flujo volumétrico de la sangre del ventrículo izquierdo del corazón.

    Los datos siguientes muestran la respuesta de un individuo cuando se inyectan 5 mg de colorante en el sistema vascular.

    Tiempo (s) Concentración (mg/L)
    2 0.0
    6 1.5
    9 3.2
    12 4.1
    15 3.4
    18 2.0
    20 1.0
    24 0.0

    a) Ajuste una curva polinómica de grado al menos 2.

    b) Utilizando el polinomio anterior, interpole en todos los puntos de la tabla y estime el error

    c) Utilice la función polinómica para aproximar la salida cardiaca del paciente mediante la fórmula:

    \text{salida cardiaca} = \frac{\text{cantidad de colorante}}{\text{área bajo la curva}}

    Rúbrica: literal a (10 puntos), literal b (5 puntos), literal c (10 puntos)


    # Gráfica de datos experimentales:
    t = np.array([2,6,9,12,15,18])
    y = np.array([0,1.5,3.2,4.1,3.4,2.0])
    
  • 1Eva_IT2015_T1 Demostrar convergencia; oferta y demanda

    1ra Evaluación I Término 2015-2016. 7/julio/2015. ICM00158

    Tema 1. (25 puntos)
    a) Sea:

    f ∈ C[a, b] ,
    ∃p ∈ [a, b] ,
    tal que f(p)=0 y 
    f'(p) ≠ 0,

    demuestre que existe un intervalo que contiene a p, tal que el método de Newton-Raphson converge para cualquier p0 que pertenece a dicho intervalo.

    b) El precio de demanda de un producto está modelado mediante la ecuación:

    y = 10 e^{-x} + 4

    y el precio de la oferta está modelado mediante la ecuación :

    y = 10 x^{2} + 2

    utilizando el método de Newton, plantee la ecuación y encuentre un intervalo de convergencia.

    c) Encuentre el precio y demanda donde las curvas se interceptan (equilibrio).

    Rúbrica: literal a 7 puntos, literal b (8 puntos), literal c (10 puntos)

     

  • s2Eva_IT2015_T2 EDO Deflexión de mástil

    Ejercicio: 2Eva_IT2015_T2 EDO Deflexión de mástil

    \frac{\delta ^2 y}{\delta x^2} = \frac{f}{2EI} (L-x)^2 x= 0, y = 0, \frac{\delta y}{\delta x} = 0

    Ecuación en forma estandarizada:

    y'' = \frac{f}{2EI} (L-x)^2

    Sistema de ecuaciones

    y' = z = f(x,y,z) z' = \frac{f}{2EI} (L-x)^2 = g(x,y,z)

    siendo:

    \frac{f}{2EI} =\frac{60}{2(1.25 \times 10 ^{-8}) (0.05)} = 4.8 \times 10^{-6}

    El mástil mide L=30 m y se requieren 30 intervalos, entonces h = 30/30 = 1.

    Usando muestras = tramos +1 = 31

    Se plantea una solución usando Runge Kutta de 2do Orden

    f(x,y,z) = z g(x,y,z) = (4.8 \times 10^{-6})(30-x)^2

    Desarrollo analítico

    Las iteraciones se realizan para llenar los datos de la tabla,

    tabla de resultados
    i xi yi zi
    0 0 0 0
    1 1 0.00216 0.00417
    2 2 0.00835 0.00807
    3 3 tarea ...

    iteración 1

    i = 0 ; x0= 0; y0 = 0; z0 = 0

    K_{1y} = h f(x_0,y_0, z_0)= 1(0) = 0

     

    K_{1z} = h g(x_0,y_0, z_0) = = 1(4.8 \times 10^{-6})(30-0)^2 = 0.00432 K_{2y} = h f(x_0+h,y_0+K_{1y}, z_0+K_{1z}) = = 1(0+0.00432) = 0.00432 K_{2z} = h g(x_0+h,y_0+K_{1y}, z_0+K_{1z}) = = 1(4.8 \times 10^{-6})(30-(0+1))^2 = 0.00403 y_1 = y_0 + \frac{K_{1y}+K_{2y}}{2} = = 0 + \frac{0+0.00432}{2} = 0.00216 z_1 = z_0 + \frac{K_{1z}+K_{2z}}{2} = = 0 + \frac{0.00432+0.00403}{2} = 0.00417

    iteración 2

    i = 2 ; x1= 1; y1 = 0.00216; z1 = 0.00417

    K_{1y} = h f(x_1,y_1, z_1)= 1(0.00417) = 0.00417 K_{1z} = h g(x_1,y_1, z_1) = = 1(4.8 \times 10^{-6})(30-1)^2 = 0.00403 K_{2y} = h f(x_1+h,y_1+K_{1y}, z_1+K_{1z}) = = 1(0.00417+0.00403) = 0.00821 K_{2z} = h g(x_1+h,y_1+K_{1y}, z_1+K_{1z}) = = 1(4.8 \times 10^{-6})(30-(1+1))^2 = 0.00376 y_2 = y_1 + \frac{K_{1y}+K_{2y}}{2} = = 0.00216 + \frac{0.00417+0.00821}{2} = 0.00835 z_2 = z_2 + \frac{K_{1z}+K_{2z}}{2} = = 0.00417 + \frac{0.00403+0.00376}{2} = 0.00807

    iteración 3
    i = 2; x2= 2; y2 = 0.00835; z2 = 0.00807
    tarea ...

    Para facilitar los cálculos se propone usa el algoritmo en Python, como se describe en la siguiente sección.


    Algoritmo en Python

    Al usar el algoritmo se puede comparar los resultados entre Runge-Kutta de 2do orden y de 4to Orden.

    De los resultados se presenta la siguiente gráfica

    EDO2EIT2015T2 Deflexion Mastil 01

    Observe en la gráfica la diferencia de escalas entre los ejes.

    Runge Kutta 2do Orden
     [x, y, z]
    [[  0.00000000e+00   0.00000000e+00   0.00000000e+00]
     [  1.00000000e+00   2.16000000e-03   4.17840000e-03]
     [  2.00000000e+00   8.35680000e-03   8.07840000e-03]
     [  3.00000000e+00   1.83168000e-02   1.17096000e-02]
     [  4.00000000e+00   3.17760000e-02   1.50816000e-02]
     [  5.00000000e+00   4.84800000e-02   1.82040000e-02]
     ...
     [  2.90000000e+01   9.29856000e-01   4.32216000e-02]
     [  3.00000000e+01   9.73080000e-01   4.32240000e-02]
     [  3.10000000e+01   1.01630400e+00   4.32264000e-02]]
    
    Runge Kutta 4do Orden
     [x, y, z]
    [[  0.00000000e+00   0.00000000e+00   0.00000000e+00]
     [  1.00000000e+00   2.11240000e-03   4.17760000e-03]
     [  2.00000000e+00   8.26240000e-03   8.07680000e-03]
     [  3.00000000e+00   1.81764000e-02   1.17072000e-02]
     [  4.00000000e+00   3.15904000e-02   1.50784000e-02]
     [  5.00000000e+00   4.82500000e-02   1.82000000e-02]
     ...
     [  2.90000000e+01   9.28800400e-01   4.31984000e-02]
     [  3.00000000e+01   9.72000000e-01   4.32000000e-02]
     [  3.10000000e+01   1.01520040e+00   4.32016000e-02]]
    >>> 
    

    Las instrucciones en Python obtener los resultados:

    # 2Eva_IT2015_T2 Deflexión de mástil
    # solución propuesta: edelros@espol.edu.ec
    import numpy as np
    
    def rungekutta2fg(fx,gx,x0,y0,z0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,3),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0,z0]
        xi = x0
        yi = y0
        zi = z0
        for i in range(1,tamano,1):
            K1y = h * fx(xi,yi,zi)
            K1z = h * gx(xi,yi,zi)
            
            K2y = h * fx(xi+h, yi + K1y, zi + K1z)
            K2z = h * gx(xi+h, yi + K1y, zi + K1z)
    
            yi = yi + (K1y+K2y)/2
            zi = zi + (K1z+K2z)/2
            xi = xi + h
            
            estimado[i] = [xi,yi,zi]
        return(estimado)
    
    def rungekutta4fg(fx,gx,x0,y0,z0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,3),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0,z0]
        xi = x0
        yi = y0
        zi = z0
        for i in range(1,tamano,1):
            K1y = h * fx(xi,yi,zi)
            K1z = h * gx(xi,yi,zi)
            
            K2y = h * fx(xi+h/2, yi + K1y/2, zi + K1z/2)
            K2z = h * gx(xi+h/2, yi + K1y/2, zi + K1z/2)
            
            K3y = h * fx(xi+h/2, yi + K2y/2, zi + K2z/2)
            K3z = h * gx(xi+h/2, yi + K2y/2, zi + K2z/2)
    
            K4y = h * fx(xi+h, yi + K3y, zi + K3z)
            K4z = h * gx(xi+h, yi + K3y, zi + K3z)
    
            yi = yi + (K1y+2*K2y+2*K3y+K4y)/6
            zi = zi + (K1z+2*K2z+2*K3z+K4z)/6
            xi = xi + h
            
            estimado[i] = [xi,yi,zi]
        return(estimado)
    
    # INGRESO
    f = 60
    L = 30
    E = 1.25e8
    I = 0.05
    x0 = 0
    y0 = 0
    z0 = 0
    tramos = 30
    
    fx = lambda x,y,z: z
    gx = lambda x,y,z: (f/(2*E*I))*(L-x)**2
    
    # PROCEDIMIENTO
    muestras = tramos + 1
    h = L/tramos
    tabla2 = rungekutta2fg(fx,gx,x0,y0,z0,h,muestras)
    xi2 = tabla2[:,0]
    yi2 = tabla2[:,1]
    zi2 = tabla2[:,2]
    
    tabla4 = rungekutta4fg(fx,gx,x0,y0,z0,h,muestras)
    xi4 = tabla4[:,0]
    yi4 = tabla4[:,1]
    zi4 = tabla4[:,2]
    
    # SALIDA
    print('Runge Kutta 2do Orden')
    print(' [x, y, z]')
    print(tabla2)
    print('Runge Kutta 4do Orden')
    print(' [x, y, z]')
    print(tabla4)
    
    # GRAFICA
    import matplotlib.pyplot as plt
    plt.plot(xi2,yi2, label='Runge-Kutta 2do Orden')
    plt.plot(xi4,yi4, label='Runge-Kutta 4do Orden')
    plt.title('Deflexión de mástil')
    plt.xlabel('x')
    plt.ylabel('y: deflexión')
    plt.legend()
    plt.grid()
    plt.show()
    
  • s1Eva_IT2015_T4 Lingotes metales

    Ejercicio: 1Eva_IT2015_T4 Lingotes metales

    Se plantea que cada lingote debe aportar una proporción xi al lingote nuevo a ser fundido.

    Se dispone de los compuestos de cada lingote por filas:

    compuesto = np.array([[ 20, 50, 20, 10],
                          [ 30, 40, 10, 20],
                          [ 20, 40, 10, 30],
                          [ 50, 20, 20, 10]])
    proporcion = np.array([ 27, 39.5, 14, 19.5])

    El contenido final de cada componente basado en los aportes xi de cada lingote para cada componente.

    Ejemplo para los 27 gramos de oro

    20x_1 + 30x_2+ 20x_3 + 50x_4 = 27

    se realiza el mismo procedimiento para los otros tipos de metal.

    50x_1 + 40x_2+ 40x_3 + 20x_4 = 39.5 20x_1 + 10x_2+ 10x_3 + 20x_4 = 14 10x_1 + 20x_2+ 30x_3 + 10x_4 = 19.5

    Las ecuaciones se escriben en la forma matricial Ax=B

    \begin{bmatrix} 20 && 30&& 20 &&50 \\ 50 && 40 && 40 && 20 \\ 20 && 10 && 10 && 20 \\ 10 && 20 && 30 && 10 \end{bmatrix} = \begin{bmatrix} x_1 \\ x_2 \\x_3 \\ x_4 \end{bmatrix} = \begin{bmatrix} 27 \\ 39.5 \\ 14 \\ 19.5 \end{bmatrix}

    Para resolver se plantea la matriz aumentada

    \begin{bmatrix} 20 && 30&& 20 &&50 && 27\\ 50 && 40 && 40 && 20 && 39.5\\ 20 && 10 && 10 && 20 && 14 \\ 10 && 20 && 30 && 10 && 19.5 \end{bmatrix}

    se pivotea por filas la matriz:

    \begin{bmatrix} 50 && 40 && 40 && 20 && 39.5\\ 20 && 30&& 20 &&50 && 27\\ 10 && 20 && 30 && 10 && 19.5 \\ 20 && 10 && 10 && 20 && 14 \end{bmatrix}

    Para eliminar hacia adelante:

    \begin{bmatrix} 50 && 40 && 40 && 20 && 39.5 \\ 20 - 50\frac{20}{50} && 30-40\frac{20}{50} && 20-40\frac{20}{50} && 50-20\frac{20}{50} && 27-39.5\frac{20}{50}\\ 10 - 50\frac{10}{50} && 20-40\frac{10}{50} && 30-40\frac{10}{50} && 10-20\frac{10}{50} && 19.5-39.5\frac{10}{50} \\ 20 - 50\frac{20}{50} && 10-40\frac{20}{50} && 10-40\frac{20}{50} && 20-20\frac{20}{50} && 14-39.5\frac{20}{50} \end{bmatrix}

    continuando con el desarrollo:

    Elimina hacia adelante
    [[50.  40.  40.  20.  39.5]
     [ 0.  14.   4.  42.  11.2]
     [ 0.  12.  22.   6.  11.6]
     [ 0.  -6.  -6.  12.  -1.8]]
    Elimina hacia adelante
    [[ 50.  40.  40.      20.  39.5]
     [  0.  14.   4.      42.  11.2]
     [  0.   0.  18.5714 -30.   2. ]
     [  0.   0.  -4.2857  30.   3. ]]
    Elimina hacia adelante
    [[ 50.  40.  40.      20.     39.5   ]
     [  0.  14.   4.      42.     11.2   ]
     [  0.   0.  18.5714 -30.      2.    ]
     [  0.   0.   0.      23.0769  3.4615]]
    Elimina hacia adelante
    [[ 50.  40.   40.      20.     39.5  ]
     [  0.  14.    4.      42.     11.2  ]
     [  0.   0.   18.5714 -30.      2.   ]
     [  0.   0.    0.      23.0769  3.4615]]
    Elimina hacia atras
    [[ 1.    0.    0.    0.    0.25]
     [ 0.    1.    0.    0.    0.25]
     [ 0.    0.    1.   -0.    0.35]
     [ 0.    0.    0.    1.    0.15]]
    el vector solución X es:
    [[0.25]
     [0.25]
     [0.35]
     [0.15]]
    verificar que A.X = B
    [[39.5]
     [27. ]
     [19.5]
     [14. ]]
    

    Las proporciones de cada lingote a usar para el nuevo lingote que cumple con lo solicitado son:

    [0.25, 0.25, 0.35, 0.15]


    Algoritmo en python

    usado para la solución es:

    # Método de Gauss-Jordan ,
    # Recibe las matrices A,B
    # presenta solucion X que cumple: A.X=B
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    A = np.array([[ 50., 40, 40, 20],
                  [ 20., 30, 20, 50],
                  [ 10., 20, 30, 10],
                  [ 20., 10, 10, 20]])
    B1 = np.array([ 39.5, 27, 19.5, 14])
    
    B = np.transpose([B1])
    
    # PROCEDIMIENTO
    casicero = 1e-15 # 0
    AB = np.concatenate((A,B),axis=1)
    tamano = np.shape(AB)
    n = tamano[0]
    m = tamano[1]
    
    print('matriz aumentada: ')
    print(AB)
    # Gauss elimina hacia adelante
    # tarea: verificar términos cero
    for i in range(0,n,1):
        pivote = AB[i,i]
        adelante = i+1 
        for k in range(adelante,n,1):
            if (np.abs(pivote)>=casicero):
                factor = AB[k,i]/pivote
                AB[k,:] = AB[k,:] - factor*AB[i,:]
        print('Elimina hacia adelante')
        print(AB)
    
    # Gauss-Jordan elimina hacia atras
    ultfila = n-1
    ultcolumna = m-1
    for i in range(ultfila,0-1,-1):
        # Normaliza a 1 elemento diagonal
        AB[i,:] = AB[i,:]/AB[i,i]
        pivote = AB[i,i] # uno
        # arriba de la fila i
        atras = i-1 
        for k in range(atras,0-1,-1):
            if (np.abs(AB[k,i])>=casicero):
                factor = pivote/AB[k,i]
                AB[k,:] = AB[k,:]*factor - AB[i,:]
            else:
                factor= 'division para cero'
    print('Elimina hacia atras')
    print(AB)
    
    X = AB[:,ultcolumna]
    
    # Verifica resultado
    verifica = np.dot(A,X)
    
    # SALIDA
    print('el vector solución X es:')
    print(np.transpose([X]))
    
    print('verificar que A.X = B')
    print(np.transpose([verifica]))
    

    Tarea: Revisar sobre la última pregunta.

  • s1Eva_IT2015_T2 Salida cardiaca

    Ejercicio: 1Eva_IT2015_T2 Salida cardiaca

    Solución presentada como introducción al tema de interpolación y solución de sistemas de ecuaciones.
    No realiza el literal c, no se desarrolla el tema de integrales.

    Note que el desarrollo del tema permite aumentar el grado del polinomio de interpolación, lo que se afecta al tamaño del sistema de ecuaciones (matriz).

    Los valores obtenidos con la solución propuesta son:

    solución para X por Gauss-Seidel
    [[-0.42175867]
     [ 0.15610893]
     [ 0.02736763]]
    verifica que A.X = B:
    [[ -7.02831455e-05]
     [  1.50012970e+00]
     [  3.20000000e+00]]
    polinomio interpolación, con puntos:  3
    0.0273676337623498*x**2 + 0.156108926206362*x - 0.421758670607596
    >>>
    

    La gráfica para observar los datos experimentales es:
    s1EIT2015 salida cardiaca 01

    La gráfica con polinomio de interpolación de grado 2, con tres puntos:

    s1EIT2015 salida cardiaca 02

    instrucciones del problema para la solución por partes en python:

    # 1ra Evaluación I Término 2015
    # Tema 2. Flujo de sangre en corazón
    # Tarea: parte c), no se ha realizado el áre bajo curva
    #        falta calcular salida cardiaca.
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Gráfica de datos experimentales:
    t = np.array([2,6,9,12,15,18])
    y = np.array([0,1.5,3.2,4.1,3.4,2.0])
    
    # SALIDA
    plt.plot(t,y)
    plt.title('datos del experimento: t vs concentración ')
    plt.show()
    
    # Sistema de ecuaciones para aproximar a polinomio grado 2
    # para grado dos usa tres puntos,
    # por ejemplo usando el punto [ 2, 0] del experimento
    # a + b*(2) + c*(2**2) =  0
    A = np.array([[1,2,2**2],
                  [1,6,6**2],
                  [1,9,9**2]])
    B = np.array([[0],
                  [1.5],
                  [3.2]])
    
    tolera = 0.0001
    X = np.zeros(len(B), dtype = float)
    
    # usando numpy para solucion de matrices
    # Xnp = np.linalg.solve(A,B)
    # print('solución para A.X=B con numpy')
    # print(Xnp)
    
    # algoritmo Gauss-Seidel
    iteramax=100
    tamano = np.shape(A)
    n = tamano[0]
    m = tamano[1]
    diferencia = np.ones(n, dtype=float)
    errado = np.max(diferencia)
    
    itera = 0
    while (errado>tolera or itera>iteramax):
        for i in range(0,n,1):
            nuevo = B[i]
            for j in range(0,m,1):
                if (i!=j): # excepto diagonal de A
                    nuevo = nuevo-A[i,j]*X[j]
            nuevo = nuevo/A[i,i]
            diferencia[i] = np.abs(nuevo-X[i])
            X[i] = nuevo
        errado = np.max(diferencia)
        itera = itera + 1
    # Vector en columna
    X =  np.transpose([X])
    # No converge
    if (itera>iteramax):
        X=0
    
    Xgs = X
    
    # Metodo numérico Gauss_Seidel
    verifica = np.dot(A,Xgs)
    print('solución para X por Gauss-Seidel')
    print(Xgs)
    
    # verificar resultado
    print('verifica que A.X = B: ')
    print(verifica)
    
    # Observar interpolacion con polinomio creado
    pt = lambda t: Xgs[0,0]+ Xgs[1,0]*t + Xgs[2,0]*t**2
    
    ti = np.linspace(2,18,501)
    pti = pt(ti)
    
    plt.plot(ti,pti, label = 'interpolacion')
    plt.plot(t,y,'*', label = 'datos experimento')
    plt.title('interpolación con polinomio')
    plt.legend()
    plt.show()
    
    # polinomio en sympy
    import sympy as sp
    x = sp.Symbol('x')
    polinomio = 0
    k = len(Xgs)
    for i in range(0,k,1):
        polinomio = polinomio + Xgs[i,0]*x**i
    print('polinomio interpolación, con puntos: ', k) 
    print(polinomio)