Categoría: Solución 1ra Eva

  • s1Eva_2021PAOI_T2 Atención hospitalaria con medicamentos limitados

    Ejercicio: 1Eva_2021PAOI_T2 Atención hospitalaria con medicamentos limitados

    literal a

    Se plantea el sistema de ecuaciones de acuerdo a la cantidad de medicamentos que se administra a cada tipo de paciente, siendo las variables X=[a,b,c,d] de acuerdo a la tabla:

    Niños Adolescentes Adultos Adultos Mayores Medicamentos /semana
    Medicamento_A 0.3 0.4 1.1 4.7 3500
    Medicamento_B 1 3.9 0.15 0.25 3450
    Medicamento_C 0 2.1 5.6 1.0 6500
    0.3 a + 0.4 b + 1.1 c + 4.7 d = 3500 a + 3.9 b + 0.15 c + 0.25 d = 3450 0 a +2.1 b + 5.6 c + 1.0 d = 6500

    Mostrando que el número de incógnitas no es igual al número de ecuaciones, por lo que sería necesario de disponer de otra ecuación, o  usar una variable libre.


    literal b

    Siguiendo las indicaciones sobre la variable libre que sea para el grupo de pacientes niños, te tiene que

    0.4 b + 1.1 c + 4.7 d = 3500 - 0.3 K 3.9 b + 0.15 c + 0.25 d = 3450 - K 2.1 b + 5.6 c + 1.0 d = 6500 - 0 K

    y haciendo K = 100, se convierte en :

    0.4 b + 1.1 c + 4.7 d = 3500 - 0.3(100) = 3470 3.9 b + 0.15 c + 0.25 d = 3450 - 100 = 3350 2.1 b + 5.6 c + 1.0 d = 6500 - 0 = 6500

    literal c

    Antes de desarrollar el ejercicio para el algoritmo se requiere convertir el sistema de ecuaciones a su forma matricial. Por lo que se plantea la matriz aumentada:

    \begin{pmatrix} 0.4 & 1.1 & 4.7 & \Big| & 3470 \\ 3.9 & 0.15 &0.25 & \Big| & 3350 \\ 2.1 & 5.6 & 1.0 &\Big| & 6500\end{pmatrix}

    Se realiza el pivoteo parcial por filas, que al aplicar en la primera columa, se intercambia la primera y segunda fila, de tal forma que el mayor valor quede en la primera casilla de la diagonal.

    \begin{pmatrix} 3.9 & 0.15 &0.25 & \Big| & 3350 \\ 0.4 & 1.1 & 4.7 & \Big| & 3470 \\ 2.1 & 5.6 & 1.0 &\Big| & 6500\end{pmatrix}

    se continua el mismo proceso para la segunda casilla de la diagonal hacia abajo, se aplica también pivoteo parcial,

    \begin{pmatrix} 3.9 & 0.15 &0.25 & \Big| & 3350 \\ 2.1 & 5.6 & 1.0 &\Big| & 6500 \\ 0.4 & 1.1 & 4.7 & \Big| & 3470 \end{pmatrix}

    Con lo que el sistema queda listo para resolver por cualquier método.

    Si seleccionamos Gauss-Seidel, el vector inicial de acuerdo al enunciado será X0=[100,100,100]

    y las ecuaciones a resolver son:

    b = \frac{3350 - 0.15 c - 0.25 d}{3.9} c = \frac{6500 - 2.1 b - 1.0 d}{5.6} d = \frac{3470- 0.4 b - 1.1 c}{4.7}

    iteración 1

    X0=[100,100,100]

    b = \frac{3350 - 0.15(100) - 0.25 (100)}{3.9} = 848.71 c = \frac{6500 - 2.1 (848.71 ) - 1.0 (100)}{5.6} = 824.58 d = \frac{3470- 0.4 (848.71 ) - 1.1 (824.58)}{4.7} = 473.07

    X1=[848.71, 824.58, 473.07]

    diferencia = [848.71, 824.58, 473.07] - [100,100,100]

    diferencia = [748.71, 724.58, 373.07]

    error = max|diferencia| = 748.71

    resultado del error es mayor que tolerancia de 0.01, se continua con la siguiente iteración.

    iteración 2

    X1=[848.71, 824.58, 473.07]

    b = \frac{3350 - 0.15 (824.58) - 0.25 (473.07)}{3.9} = 796.93 c = \frac{6500 - 2.1 (796.93) - 1.0 (473.07)}{5.6} = 777.38 d = \frac{3470- 0.4 (796.93) - 1.1 (777.38)}{4.7} = 488.53

    X2 = [796.93, 777.38, 488.53]

    diferencia = [796.93, 777.38, 488.53]  - [848.71, 824.58, 473.07]

    diferencia = [-51.78 ,  -47.2, 15.52]

    error = max|diferencia| = 51.78

    iteración 3

    X2 = [796.93, 777.38, 488.53]

    b = \frac{3350 - 0.15 (777.38) - 0.25 (488.53)}{3.9} = 797.75 c = \frac{6500 - 2.1 (797.75) - 1.0 (488.53)}{5.6} = 774.31 d = \frac{3470- 0.4 (797.75) - 1.1 (774.31)}{4.7} = 489.18

    x3 = [ 797.75, 774.31, 489.18]

    diferencias = [ 797.75, 774.31, 489.18] - [796.93, 777.38, 488.53]

    diferencias = [0.82, -3.07, 0.65]

    error = max|diferencia| = 3.07

    Observación, el error disminuye en cada iteración, por lo que el sistema converge.

    solución con el algoritmo, solo se toma la parte entera de la respuesta, pues los pacientes son números enteros.

    respuesta X: [797.83, 774.16, 489.20]
    

    con lo que el primer resultado es:

     X = [797, 774, 489]

    literal d

    Si la cantidad de pacientes presentados en una seman es la que se indica en el enunciado [350,1400,1500,1040], se determina que el sistema hospitalario estatal no podrá atender a todos los pacientes al compara con la capacidad encontrada en el literal c.

    Hay un exceso de 2129 pacientes encontrados por grupo:

    exceso = [350, 1400, 1500, 1040] - [100, 797, 774, 489] = [250, 603, 726, 551]

    con lo que se recomienda una medida de confinamiento para disminuir los contagios y poder atender a los pacientes que se presenten.

    literal e

    Siendo K = 0, al estar vacunados todos los niños, y suponiendo que la vacuna es una cura, se tiene:

    0.4 b + 1.1 c + 4.7 d = 3500 - 0.3 K = 3500 3.9 b + 0.15 c + 0.25 d = 3450 - K = 3450 2.1 b + 5.6 c + 1.0 d = 6500 - 0 k = 6500

    pivoteado parcialmente por filas se tiene:

    \begin{pmatrix} 3.9 & 0.15 &0.25 & \Big| & 3450 \\ 2.1 & 5.6 & 1.0 &\Big| & 6500 \\ 0.4 & 1.1 & 4.7 & \Big| & 3500 \end{pmatrix}

    Resolviendo por un método directo:

    se obtiene:

    respuesta X: [823.46, 763.35, 495.94]

    que al compararse con la capacidad anterior en números enteros se encuentra una diferencia de un incremento de 21 pacientes neto ante la condición de usar todos los medicamentos disponibles.

    diferencia = [823, 763, 495] - [797, 774, 489] = [26, -11, 6]


     Instrucciones en Python

    # Método de Gauss-Seidel
    # solución de sistemas de ecuaciones
    # por métodos iterativos
    
    import numpy as np
    
    # INGRESO
    A = np.array([[0.4, 1.10, 4.7 ],
                  [3.9, 0.15, 0.25],
                  [2.1, 5.60, 1.0  ]])
    k = 100
    B = np.array([3500.-0.3*k,3450-1*k,6500-0*k])
    
    X0  = np.array([100.0,100,100])
    
    tolera = 0.001
    iteramax = 100
    
    # PROCEDIMIENTO
    # Matriz aumentada
    Bcolumna = np.transpose([B])
    AB  = np.concatenate((A,Bcolumna),axis=1)
    AB0 = np.copy(AB)
    
    # Pivoteo parcial por filas
    tamano = np.shape(AB)
    n = tamano[0]
    m = tamano[1]
    
    # Para cada fila en AB
    for i in range(0,n-1,1):
        # columna desde diagonal i en adelante
        columna = abs(AB[i:,i])
        dondemax = np.argmax(columna)
        
        # dondemax no está en diagonal
        if (dondemax !=0):
            # intercambia filas
            temporal = np.copy(AB[i,:])
            AB[i,:]  = AB[dondemax+i,:]
            AB[dondemax+i,:] = temporal
    
    A = np.copy(AB[:,:n])
    B = np.copy(AB[:,n])
    
    # Gauss-Seidel
    tamano = np.shape(A)
    n = tamano[0]
    m = tamano[1]
    #  valores iniciales
    X = np.copy(X0)
    diferencia = np.ones(n, dtype=float)
    errado = 2*tolera
    
    itera = 0
    while not(errado<=tolera or itera>iteramax):
        # por fila
        for i in range(0,n,1):
            # por columna
            suma = 0 
            for j in range(0,m,1):
                # excepto diagonal de A
                if (i!=j): 
                    suma = suma-A[i,j]*X[j]
            
            nuevo = (B[i]+suma)/A[i,i]
            diferencia[i] = np.abs(nuevo-X[i])
            X[i] = nuevo
        print(X)
        errado = np.max(diferencia)
        itera = itera + 1
    
    # Respuesta X en columna
    X = np.transpose([X])
    
    # revisa si NO converge
    if (itera>iteramax):
        X=0
    # revisa respuesta
    verifica = np.dot(A,X)
    
    # SALIDA
    print('respuesta X: ')
    print(X)
    print('verificar A.X=B: ')
    print(verifica)
    
  • s1Eva_2021PAOI_T1 Función recursiva y raíces de ecuaciones

    Ejercicio: 1Eva_2021PAOI_T1 Función recursiva y raíces de ecuaciones

    Literal a

    Evaluando las sucesión de la forma recursiva:

    xi
    [-0.45       -0.4383     -0.4458     -0.441      -0.4441 
     -0.4421     -0.4434     -0.4425     -0.4431     -0.4427
     -0.4429     -0.4428     -0.4429     -0.4428     -0.4429]
    errores
    [ 1.1745e-02 -7.5489e-03  4.8454e-03 -3.1127e-03  1.9986e-03
     -1.2837e-03  8.2430e-04 -5.2939e-04  3.3996e-04 -2.1833e-04
      1.4021e-04 -9.0044e-05  5.7826e-05 -3.7136e-05  0.0000e+00]
    

    literal b

    Se puede afirmar que converge, observe la diferencia entre cada dos valores consecutivos de la sucesión ... (continuar de ser necesario)

    literal c

    Para el algoritmo se requiere la función f(x) y su derivada f'(x)

    f(x) = x +ln(x+2) f'(x) = 1 + \frac{1}{x+2}

    x0 = -0.45

    itera = 1

    x_{i+1} = x_i -\frac{f(x_i)}{f'(x_i)} x_{1} = x_0 -\frac{f(x_0)}{f'(x_0)} = -0.45 -\frac{-0.45+ln(-0.45+2)}{1 + \frac{1}{-0.45+2}}

    x1 = -0.44286

    error = |x1-x0| = |-0.44286 -(-0.45)| = 0.007139

    itera = 2

    x_{2} = -0.4428 -\frac{-0.4428 + ln(-0.45+2)}{1 + \frac{1}{-0.4428+2}}

    x1 = -0.44286

    error = |x1-x0| = |-0.44285 -(-4.4286)| = 6.4394e-06

    con lo que se cumple el valor de tolerancia y no se requiere otra iteración

    la raiz se encuentra en x = -0.44286

    Solución con algoritmo

    xi
    [-0.45       -0.4383     -0.4458     -0.441      -0.4441 
     -0.4421     -0.4434     -0.4425     -0.4431     -0.4427
     -0.4429     -0.4428     -0.4429     -0.4428     -0.4429]
    errores
    [ 1.1745e-02 -7.5489e-03  4.8454e-03 -3.1127e-03  1.9986e-03
     -1.2837e-03  8.2430e-04 -5.2939e-04  3.3996e-04 -2.1833e-04
      1.4021e-04 -9.0044e-05  5.7826e-05 -3.7136e-05  0.0000e+00]
    ['xi', 'xnuevo', 'tramo']
    [[-4.5000e-01 -4.4286e-01  7.1392e-03]
     [-4.4286e-01 -4.4285e-01  6.4394e-06]]
    raiz en:  -0.44285440100759543
    con error de:  6.439362322474551e-06
    >>> 
    

    Instrucciones en Python

    import numpy as np
    import matplotlib.pyplot as plt
    
    # literal a sucesión en forma recursiva
    def secuenciaL(n,x0):
        if n == 0:
            xn = x0
        if n>0:
            xn = np.log(1/(2+secuenciaL(n-1,x0)))
        return(xn)
    x0 = -0.45
    n = 15
    xi = np.zeros(n,dtype=float)
    xi[0] = x0
    errado = np.zeros(n,dtype=float)
    for i in range(1,n,1):
        xi[i] = secuenciaL(i,x0)
        errado[i-1] = xi[i] - xi[i-1]
       
    np.set_printoptions(precision=4)
    print('xi: ')
    print(xi)
    print('errado: ')
    print(errado)
    
    #Grafica literal a y b
    plt.plot(xi)
    plt.plot(xi,'o')
    plt.xlabel('n')
    plt.ylabel('xn')
    plt.show()
    
    # Método de Newton-Raphson
    # Ejemplo 1 (Burden ejemplo 1 p.51/pdf.61)
    
    import numpy as np
    
    # INGRESO
    fx  = lambda x: x+np.log(x+2)
    dfx = lambda x: 1+ 1/(x+2)
    
    x0 = -0.45
    tolera = 0.0001
    
    a = -0.5
    b = -0.2
    muestras = 21
    # PROCEDIMIENTO
    tabla = []
    tramo = abs(2*tolera)
    xi = x0
    while (tramo>=tolera):
        xnuevo = xi - fx(xi)/dfx(xi)
        tramo  = abs(xnuevo-xi)
        tabla.append([xi,xnuevo,tramo])
        xi = xnuevo
    
    # convierte la lista a un arreglo.
    tabla = np.array(tabla)
    n = len(tabla)
    
    # para la gráfica
    xj = np.linspace(a,b,muestras)
    fj = fx(xj)
    
    # SALIDA
    print(['xi', 'xnuevo', 'tramo'])
    np.set_printoptions(precision = 4)
    print(tabla)
    print('raiz en: ', xi)
    print('con error de: ',tramo)
    
    plt.plot(xj,fj)
    plt.axhline(0, color='grey')
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.show()
    

    litera d: tarea

  • s1Eva_2021PAOI_T3 Interpolar, modelo de contagios 2020

    Ejercicio: 1Eva_2021PAOI_T3 Interpolar, modelo de contagios 2020

    literal a

    Los datos de los pacientes casos graves entre las semanas 11 a la 20, que son el intervalo donde será válido el polinomio de interpolación son:

    semana 11 12 13 14 15 16 17 18 19 20
    casos graves 1503 3728 7154 6344 4417 3439 2791 2576 2290 2123

    de los cuales solo se usarán los indicados en el literal a : 11,13,16,18,20.

    xi0 = [    9,   10,   11,   12,   13,   14,
              15,   16,   17,   18,   19,   20,
              21,   22,   23,   24,   25,   26 ])
    fi0 = [ 1435, 1645, 1503, 3728, 7154, 6344,
            4417, 3439, 2791, 2576, 2290, 2123,
            2023, 2067, 2163, 2120, 2125, 2224 ])
    xi = [  11,   13,   16,   18,   20]
    fi = [1503, 7154, 3439, 2576, 2123]
    

    Se observa que los datos estan ordenados en forma ascendente respecto a la variable independiente, tambien se determina que no se encuentran equidistantes entre si (13-11=2, 16-13=3). Por lo que se descarta usar el método de diferencias finitas avanzadas.

    Los métodos que se podrían usar con puntos no equidistantes en el eje semanas serían el método de diferencias divididas de Newton o el  método de Lagrange.

    Seleccionando por ejemplo, Diferencias divididas de Newton, donde primero se realiza la tabla:

    xi fi f[x1,x0] f[x2,x1,x0] f[x3,x2,x1,x0] f[x4,x3,x2,x1,x0]
    11 1503 =(7154-1503) /(13-11) = 2825.5 =(-1238.33-2835.5) /(16-11) = -812.76 =(161.36-(-812.76)) /(18-11) = 139.16 =(-15.73-139.16) /(20-11) = -17.21
    13 7154 (3439-7154) /(16-13) = -1238.33 (-431.5-(-1238.33)) /(18-13) = 161.36 (51.25-161.36) /(20-13)= -15.73 ----
    16 3439 (2576-3439) /(18-16) = -431.5 (-226.5-(-431.5)) /(20-16) = 51.25 ----
    18 2576 (2123-2576) /(20-18) = -226.5 ----
    20 2123 ----

    con lo que se puede contruir el polinomio usando las diferencias divididas para el intervalo dado:

    [2825.5    -812.76  139.16  -17.21]
    p_4(x) = 1503 + 2825.5(x-11) - 812.76(x - 13)(x - 11) + 139.16(x - 16)(x - 13)(x - 11) - 17.21(x - 18)(x - 16) (x - 13) (x - 11)

    Simplificando el algoritmo se tiene:

    p_4(x) = - 1172995.28 + 298304.50 x - 27840.50x^2 + 1137.36x^3 - 17.21 x^4


    literal b

    El cálculo de los errores se puede realizar usando el polinomio de grado 4 encontrado, notando que los errores deberían ser cero para los puntos usados para el modelo del polinomio.

    xi fi p4(x) |error|
    11 1503 1503 0
    12 3728 6110.96 2382.96
    13 7154 7154 0
    14 6344 6293.18 50.81
    15 4417 4776.52 359.52
    16 3439 3439 0
    17 2791 2702.53 88.46
    18 2576 2576 0
    19 2290 2655.22 365.22
    20 2123 2123 0

    literal c

    Podría aplicarse uno de varios criterios, lo importante por lo limitado del tiempo en la evaluación son las conclusiones y recomendaciones expresadas en el literal e, basadas en lo realizado en los literales c y d. Teniendo como opciones:

    - cambiar uno de los puntos selecionados, mateniendo así el grado del polinomio
    - aumentar el número de puntos usados para armar el polinomio con grado mayor
    - dividir el intervalo en uno o mas segmentos, con el correspondiente número de polinomios.

    Se desarrolla la opción de cambiar uno de los puntos seleccionados, usando para esta ocasión como repaso la interpolación de Lagrange. Para los puntos se usa el punto con mayor error de la tabla del literal anterior y se elimina el punto penúltimo, es decir se usa la semana 12 en lugar de la semana 18 de la siguiente forma:

    xi = [  11,   12,   13,   16,   20]
    fi = [1503, 3728, 7154, 3439, 2123]
    
    p_4(x) = 1503 \frac{(x-12)(x-13)(x-16)(x-20)}{(11-12)(11-13)(11-16)(11-20)} + 3728\frac{(x-11)(x-13)(x-16)(x-20)}{(12-11)(12-13)(12-16)(12-20)} + 7154\frac{(x-11)(x-12)(x-16)(x-20)}{(13-11)(13-12)(13-16)(13-20)} + 3439\frac{(x-11)(x-12)(x-13)(x-20)}{(16-11)(16-12)(16-13)(16-20)} + 2123\frac{(x-11)(x-12)(x-13)(x-16)}{(20-11)(20-12)(20-13)(20-16)}

    Simplificando el polinomio:

    p_4(x) = \frac{46927445}{21} - \frac{1655552687}{2520} x + \frac{715457663}{10080}x^2 - \frac{8393347}{2520} x^3 + \frac{577153}{10080} x^4

    literal d

    El cálculo de los errores se puede realizar usando el polinomio de grado 4 encontrado, notando que los errores deberían ser cero para los puntos usados para el modelo del polinomio.

    xi fi p4(x) error
    11 1503 1503 0
    12 3728 3728 0
    13 7154 7154 0
    14 6344 8974.01 2630.01
    15 4417 7755.22 3338.22
    16 3439 3439 0
    17 2791 -2659.13 -5450.13
    18 2576 -7849.45 -10425.45
    19 2290 -8068.1 -10358.1
    20 2123 2123 0

    literal e

    El cambio aplicado a los puntos usados en el modelo del polinomio disminuyó el error entre las semanas 11 a 13. Sin embargo la magnitud del error aumentó  para las semanas posteriores a la 13, es decir aumentó la distorsión de la estimación y se recomienda realizar otras pruebas para mejorar el modelo aplicando los otros criterios para determinar el que tenga mejor desempeño respecto a la medida de error.



    Intrucciones en Python

    Literal a y b. Desarrollado a partir del algoritmo desarrollado en clases:

    # Polinomio interpolación
    # Diferencias Divididas de Newton
    # Tarea: Verificar tamaño de vectores,
    #        verificar puntos equidistantes en x
    import numpy as np
    import sympy as sym
    import matplotlib.pyplot as plt
    
    # INGRESO , Datos de prueba
    xi0 = np.array([    9,   10,   11,   12,   13,   14,
                       15,   16,   17,   18,   19,   20,
                       21,   22,   23,   24,   25,   26 ])
    fi0 = np.array([ 1435, 1645, 1503, 3728, 7154, 6344,
                     4417, 3439, 2791, 2576, 2290, 2123,
                     2023, 2067, 2163, 2120, 2125, 2224 ])
    
    xi1 = np.array([   11,   12,   13,   14,   15,   16,
                       17,   18,   19,   20 ])
    fi1 = np.array([ 1503, 3728, 7154, 6344, 4417, 3439,
                     2791, 2576, 2290, 2123 ])
    
    xi = np.array([  11,   13,   16,   18,   20])
    fi = np.array([1503, 7154, 3439, 2576, 2123])
    
    # PROCEDIMIENTO
    
    # Tabla de Diferencias Divididas Avanzadas
    titulo = ['i   ','xi  ','fi  ']
    n = len(xi)
    ki = np.arange(0,n,1)
    tabla = np.concatenate(([ki],[xi],[fi]),axis=0)
    tabla = np.transpose(tabla)
    
    # diferencias divididas vacia
    dfinita = np.zeros(shape=(n,n),dtype=float)
    tabla = np.concatenate((tabla,dfinita), axis=1)
    
    # Calcula tabla, inicia en columna 3
    [n,m] = np.shape(tabla)
    diagonal = n-1
    j = 3
    while (j < m):
        # Añade título para cada columna
        titulo.append('F['+str(j-2)+']')
    
        # cada fila de columna
        i = 0
        paso = j-2 # inicia en 1
        while (i < diagonal):
            denominador = (xi[i+paso]-xi[i])
            numerador = tabla[i+1,j-1]-tabla[i,j-1]
            tabla[i,j] = numerador/denominador
            i = i+1
        diagonal = diagonal - 1
        j = j+1
    
    # POLINOMIO con diferencias Divididas
    # caso: puntos equidistantes en eje x
    dDividida = tabla[0,3:]
    n = len(dfinita)
    
    # expresión del polinomio con Sympy
    x = sym.Symbol('x')
    polinomio = fi[0]
    for j in range(1,n,1):
        factor = dDividida[j-1]
        termino = 1
        for k in range(0,j,1):
            termino = termino*(x-xi[k])
        polinomio = polinomio + termino*factor
    
    # simplifica multiplicando entre (x-xi)
    polisimple = polinomio.expand()
    
    # polinomio para evaluacion numérica
    px = sym.lambdify(x,polisimple)
    
    # calcula errores en intervalo usado
    pfi1 = px(xi1)
    errado1 = np.abs(fi1-pfi1)
    
    # Puntos para la gráfica
    muestras = 101
    a = np.min(xi)
    b = np.max(xi)
    pxi = np.linspace(a,b,muestras)
    pfi = px(pxi)
    
    # SALIDA
    np.set_printoptions(precision = 4)
    print('Tabla Diferencia Dividida')
    print([titulo])
    print(tabla)
    print('dDividida: ')
    print(dDividida)
    print('polinomio: ')
    print(polinomio)
    print('polinomio simplificado: ' )
    print(polisimple)
    print('errores en intervalo:')
    print(xi1)
    print(errado1)
    
    # Gráfica
    plt.plot(xi0,fi0,'o', label = 'Puntos')
    plt.plot(xi,fi,'ro', label = 'Puntos')
    for i in range(0,n,1):
        etiqueta = '('+str(xi[i])+','+str(fi[i])+')'
        plt.annotate(etiqueta,(xi[i],fi[i]))
    plt.plot(pxi,pfi, label = 'Polinomio')
    plt.legend()
    plt.xlabel('xi')
    plt.ylabel('fi')
    plt.title('Diferencias Divididas - Newton')
    plt.grid()
    plt.show()
    

    Literal c y d. Se puede continuar con el algoritmo anterior. Como repaso se adjunta un método diferente al anterior.

    # Interpolacion de Lagrange
    # divisores L solo para mostrar valores
    import numpy as np
    import sympy as sym
    import matplotlib.pyplot as plt
    
    # INGRESO , Datos de prueba
    xi0 = np.array([    9,   10,   11,   12,   13,   14,
                       15,   16,   17,   18,   19,   20,
                       21,   22,   23,   24,   25,   26 ])
    fi0 = np.array([ 1435, 1645, 1503, 3728, 7154, 6344,
                     4417, 3439, 2791, 2576, 2290, 2123,
                     2023, 2067, 2163, 2120, 2125, 2224 ])
    
    xi2 = np.array([   11,   12,   13,   14,   15,   16,
                       17,   18,   19,   20 ])
    fi2 = np.array([ 1503, 3728, 7154, 6344, 4417, 3439,
                     2791, 2576, 2290, 2123 ])
    
    xi = np.array([  11,   12,   13,   16,   20])
    fi = np.array([1503, 3728, 7154, 3439, 2123])
    
    # PROCEDIMIENTO
    # Polinomio de Lagrange
    n = len(xi)
    x = sym.Symbol('x')
    polinomio = 0
    divisorL = np.zeros(n, dtype = float)
    for i in range(0,n,1):
        
        # Termino de Lagrange
        numerador = 1
        denominador = 1
        for j  in range(0,n,1):
            if (j!=i):
                numerador = numerador*(x-xi[j])
                denominador = denominador*(xi[i]-xi[j])
        terminoLi = numerador/denominador
    
        polinomio = polinomio + terminoLi*fi[i]
        divisorL[i] = denominador
    
    # simplifica el polinomio
    polisimple = polinomio.expand()
    
    # para evaluación numérica
    px = sym.lambdify(x,polisimple)
    
    # calcula errores en intervalo usado
    pfi2 = px(xi2)
    errado2 = np.abs(fi2-pfi2)
    
    # Puntos para la gráfica
    muestras = 101
    a = np.min(xi)
    b = np.max(xi)
    pxi = np.linspace(a,b,muestras)
    pfi = px(pxi)
    
    # SALIDA
    print('    valores de fi: ',fi)
    print('divisores en L(i): ',divisorL)
    print()
    print('Polinomio de Lagrange, expresiones')
    print(polinomio)
    print()
    print('Polinomio de Lagrange: ')
    print(polisimple)
    print('errores en intervalo:')
    print(xi2)
    print(errado2)
    
    # Gráfica
    plt.plot(xi0,fi0,'o', label = 'Puntos')
    plt.plot(pxi,pfi, label = 'Polinomio')
    plt.legend()
    plt.xlabel('xi')
    plt.ylabel('fi')
    plt.title('Interpolación Lagrange')
    plt.show()
    
  • s1Eva_IIT2009_T1 Movimiento de partícula en plano

    Ejercicio: 1Eva_IIT2009_T1 Movimiento de partícula en plano

    a. Planteamiento del problema

    Las ecuaciones expresan las trayectorias de dos partículas,

    x(t) = 3 \sin ^{3}(t)-1 y(t) = 4 \sin (t)\cos (t)

    que para que se encuentren o choquen, sus coordenadas deberían ser iguales.

    x(t) = y(t) 3 \sin ^{3}(t)-1 = 4 \sin (t)\cos (t)

    Se reordena la expresión, de la forma f(t) = 0 para usarla en el algoritmo de búsqueda de raíces.

    3 \sin ^{3}(t)-1 - 4 \sin (t)\cos (t) = 0 f(t) = 3 \sin ^{3}(t)-1 - 4 \sin (t)\cos (t)

    b. Intervalo de búsqueda de raíz

    Como la variable independiente es tiempo, el evento a buscar se supone sucede en tiempos positivos t>=0, por lo que el valor inicial a la izquierda del intervalo será a=0

    Para el caso de b, a la derecha, se usa lo indicado en el enunciado para la pregunta del literal b, donde se indica t ∈ [0, π/2], por lo que b = π/2

    [0, π/2]

    verificando que exista cambio de signo entre f(a) y f(b)

    f(0) = 3 \sin ^{3}(0)-1 - 4 \sin (0)\cos (0) = -1 f(\pi /2) = 3 \sin ^{3}(\pi /2)-1 - 4 \sin (\pi /2)\cos (\pi /2) = 3 (1)^3-1 - 4 (1)(0) = 2

    con lo que se comprueba que al existir cambio de signo, debe existir una raíz en el intervalo.


    c. Método de Falsa Posición

    Desarrollo analítico con lápiz y papel

    Se trata de mostrar los pasos en al menos tres iteraciones del método, usando las siguientes expresiones:

    f(t) = 3 \sin ^{3}(t)-1 - 4 \sin (t)\cos (t) c = b - f(b) \frac{a-b}{f(a)-f(b)}

    [0, π/2]

    iteración 1

    a = 0 , b = \pi/2

    tomando los datos al validar los puntos extremos

    f(0) = -1 f(\pi /2) = 2 c = \pi/2 - 2 \frac{0-\pi/2}{-1-2} = \pi/6 f(\pi/6) = 3 \sin ^{3}(\pi/6)-1 - 4 \sin (\pi/6)\cos (\pi/6) = -2.3570

    el signo de f(c) es el mismo que f(a), se ajusta el lado izquierdo

    tramo = |c-a| = |\pi /6 - 0| = \pi/6 a = c = \pi/6 , b = \pi/2

    iteración 2

    a = \pi/6 , b = \pi/2 f(\pi/6) = -2.3570 f(\pi /2) = 2 c = \pi/2 - 2 \frac{\pi/6-\pi/2}{-1-2} = 1.0901 f(1.0901) = 3 \sin ^{3}(1.0901)-1 - 4 \sin (1.0901)\cos (1.0901) = -0.5486

    el signo de f(c) es el mismo que f(a), se ajusta el lado izquierdo

    tramo = |c-a| = | 1.0901-\pi/6| = 1.0722 a = c = 1.0901 , b = \pi/2

    iteración 3

    a = 1.0901 , b = \pi/2 f(1.0901) = -0.5486 f(\pi /2) = 2 c = \pi/2 - 2 \frac{-0.5486-\pi/2}{-0.5486-2} = 1.19358 f(1.19358) = 3 \sin ^{3}(1.19358)-1 - 4 \sin (1.19358)\cos (1.19358) = 0.0409

    el signo de f(c) es el mismo que f(b), se ajusta el lado derecho

    tramo = |b-c| = | \pi/2- 1.19358| = 0.3772 a = 1.0901 , b = 1.19358


    Algoritmo con Python

    Los parámetros aplicados en el algoritmo son los desarrollados en el planteamiento del problema e intervalo de búsqueda, con lo que se obtiene los siguientes resultados:

     raiz: 1.1864949811467547
    error: 9.919955449055884e-05
    

    s1EIIT20019T1 Mov Punto Plano 01

    las instrucciones en Python son:

    # 1Eva_IIT2009_T1 Movimiento de partícula en plano
    import numpy as np
    import matplotlib.pyplot as plt
    
    #INGRESO
    xt = lambda t: 3*(np.sin(t)**3)-1
    yt = lambda t: 4*np.sin(t)*np.cos(t)
    fx = lambda t: 3*(np.sin(t)**3)-1 - 4*np.sin(t)*np.cos(t) 
    
    a = 0
    b = np.pi/2
    tolera = 0.001
    
    # intervalo para gráfica
    La = a
    Lb = b
    muestras = 21
    
    # PROCEDIMIENTO
    # Posicion Falsa
    tramo = abs(b-a)
    fa = fx(a)
    fb = fx(b)
    while not(tramo<=tolera):
        c = b - fb*(a-b)/(fa-fb)
        fc = fx(c)
        cambio = np.sign(fa)*np.sign(fc)
        if cambio>0:
            # actualiza en izquierda
            tramo = abs(c-a)
            a = c
            b = b
            fa = fc
        else:
            # actualiza en derecha
            tramo = abs(b-c)
            a = a
            b = c
            fb = fc
    
    # para grafica
    ti = np.linspace(La,Lb,muestras)
    xi = xt(ti)
    yi = yt(ti)
    fi = fx(ti)
    
    # SALIDA
    print(' raiz:', c)
    print('error:', tramo)
    
    # GRAFICA
    plt.plot(ti,xi, label='x(t)')
    plt.plot(ti,yi, label='y(t)')
    plt.plot(ti,fi, label='f(t)')
    plt.plot(c,fx(c),'ro')
    plt.axhline(0, color='green')
    plt.axvline(c, color='magenta')
    plt.legend()
    plt.xlabel('t')
    plt.title('Método de Falsa Posición')
    plt.show()
    
  • s1Eva_IIT2010_T1 Aproximar con polinomio

    Ejercicio: 1Eva_IIT2010_T1 Aproximar con polinomio

    Desarrollo Analítico

    Encabezado ejemplo para el desarrollo con Papel y lápiz:


    Tarea 01 Semana 01 Fecha: año/mes/día
    Apellidos Nombres
    Referencia: 1Eva_IIT2010_T1 Aproximar con polinomio

    Opción 1. Usando el polinomio de Taylor

    Usando Unidad 1 Polinomio de Taylor, supondremos que:  x0=0

    El polinomio de Taylor requerido es de: grado 2

    P_{n}(x) = f(x_0)+\frac{f'(x_0)}{1!} (x-x_0) + + \frac{f''(x_0)}{2!}(x-x_0)^2 +

    Se escribe la función f(x) y sus derivadas para el polinomio:

    f(x) = e^x \cos (x) +1

    primera derivada

    f'(x) = e^x \cos (x) - e^x \sin(x) f'(x) = e^x (\cos (x) - \sin(x))

    segunda derivada

    f''(x) = e^x( \cos (x) - \sin(x))+ + e^x (-\sin(x) - \cos(x)) f''(x) = -2 e^x \sin(x))

    Punto de referencia x0 = 0, tomado como ejemplo dentro del intervalo.

    Observación: escriba las expresiones, reemplazando los valores. Un criterio de evaluación es que, si en la lección o examen no tuvo tiempo para usar la calculadora, se puede evaluar si realizaba las operaciones con el punto de referencia y expresiones correctas.

    f(0) = e^0 \cos (0) +1 = 2 f'(0) = e^0(\cos (0) - \sin(0)) = 1 f''(0) = -2 e^0 \sin(0)) = 0

    Sustitución en el polinomio de Taylor planteado:

    p_2(x) = f(x_0) + \frac{f'(x_0)}{1!}(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 P_{2}(x) = 2+\frac{1}{1} (x-0) + + \frac{0}{2}(x-0)^2 + P_{2}(x) = 2+ x

    El error referenciado a los otros puntos será:

    errado = |f(x)-p(x)| errado = \Big|\Big( e^x \cos (x) +1 \Big) - (2+ x)\Big|

    usando un punto diferente a x0=0, como x = π/2

    errado = \Big| \Big( e^{\frac{\pi}{2}}\cos \Big( \frac{\pi}{2} \Big) +1 \Big) - \Big(2+ \frac{\pi}{2}\Big) \Big| errado = | 1 - 3.5707| = 2.5707

    Tarea: calcular el error,  para x = π, verificando que pase por los puntos requeridos.



    Opción 2. Usando el polinomio de interpolación

    Siguiendo la unidad 4 para interpolación, el polinomio requerido tiene la forma:

    p(x) = a + bx + cx^2

    por lo que conociendo los pares ordenados por donde debe pasar se puede plantear las ecuaciones y encontrar a,b,c.

    f(0) = e^0 \cos (0) +1 = 2 f(\pi/2) = e^{\pi/2} \cos (\pi /2) +1 = 1(0)+1 =1 f(\pi) = e^{\pi} \cos (\pi) +1 = e^{\pi} +1

    se encuentra que a = 2 cuando x = 0 y que reemplazando los valores de x =π/2 y x=π se tiene:

    2 + (π/2) b + (π/2)2 c = 1
    2 +    π  b +   (π)2 c = eπ +1

    que se convierte en:

    (π/2) b + (π/2)2 c = -1
       π  b +   (π)2 c = -(eπ +1)

    al multiplicar la primera ecuación por 2 y restando de la segunda

    - π2/2 c = eπ -1
    c = (-2/π2)(eπ -1)
    

    y sustituir c en la segunda ecuación:

    π b + (π)2 (-2/π2)(eπ -1) = -(eπ +1)
    π b = -(eπ +1) + 2(eπ -1) = -eπ -1 + 2eπ -2
    b = (eπ -3)/π

    El polinomio resultante es:

    p(x) = 2 + \frac{e^{\pi}-3}{\pi}x + \frac{-1(e^{\pi}-1)}{\pi ^2}x^2

    Probando respuesta con los valores en la función y polinomio usando Python, se encuentra que el polinomio pasa por los puntos. Al observar la gráfica observa que se cumple lo requerido pero visualiza el error de aproximación usando el método de la opción 2.

    polinomio Taylor aproximacion


    Algoritmo con Python

    Algoritmo desarrollado en clase, usado como taller, modificado para el problema planteado.

    Observación: Se reordena el algoritmo para mantener ordenados y separados los bloques de ingreso, procedimiento y salida. Así los bloques pueden ser convertidos fácilmente a funciones algorítmicas def-return.

    Observe que la variable n se interprete correctamente como "términos" o "grados" del polinomio de Taylor.

    # Aproximación Polinomio de Taylor alrededor de x0
    # f(x) en forma simbólica con sympy
    import numpy as np
    import math
    import sympy as sym
    import matplotlib.pyplot as plt
    
    # INGRESO --------------------
    x = sym.Symbol('x')
    fx = sym.exp(x)*sym.cos(x) + 1
    
    x0 = 0
    n  = 3 # grado de polinomio
    
    # Intervalo para Gráfica
    a = 0
    b = np.pi
    muestras = 21
    
    # PROCEDIMIENTO  -------------
    # construye polinomio Taylor
    k = 0 # contador de términos
    polinomio = 0
    while (k <= n):
        derivada   = fx.diff(x,k)
        derivadax0 = derivada.subs(x,x0)
        divisor   = math.factorial(k)
        terminok  = (derivadax0/divisor)*(x-x0)**k
        polinomio = polinomio + terminok
        k = k + 1
    
    # forma lambda para evaluación numérica
    fxn = sym.lambdify(x,fx,'numpy')
    pxn = sym.lambdify(x,polinomio,'numpy')
    
    # evaluar en intervalo para gráfica
    xi = np.linspace(a,b,muestras)
    fxi = fxn(xi)
    pxi = pxn(xi)
    
    # SALIDA  --------------------
    print('polinomio p(x)=')
    print(polinomio)
    print()
    sym.pprint(polinomio)
    
    # Gráfica
    plt.plot(xi,fxi,label='f(x)')
    plt.plot(xi,pxi,label='p(x)')
    # franja de error
    plt.fill_between(xi,pxi,fxi,color='yellow')
    plt.xlabel('xi')
    plt.axvline(x0,color='green', label='x0')
    plt.axhline(0,color='grey')
    plt.title('Polinomio Taylor: f(x) vs p(x)')
    plt.legend()
    plt.show()
    

    Resultado del algoritmo

    Revisar si el polinomio es concordante con lo realizado a lápiz y papel, de no ser así revisar el algoritmo o los pasos realizados en papel, deben ser iguales.
    Comprobando que el algoritmo esté correcto y pueda ser usado en otros ejercicios.

    polinomio p(x)=
    -x**3/3 + x + 2
    
       3        
      x         
    - -- + x + 2
      3         
    

    Resultados gráficos para x0=0

    Continuar con el ejercicio con x0 = π y luego con el siguiente punto x0 = π/2.

    Comparar resultados y presentar: Observaciones  y recomendaciones semejantes a las indicadas durante el desarrollo de la clase.

    polinomio Taylor error de aproximacion

  • s1Eva_IIT2019_T1 Ecuación Recursiva

    Ejercicio: 1Eva_IIT2019_T1 Ecuación Recursiva

    la ecuación recursiva es:

    x_n = g(x_{n-1}) = \sqrt{3 + x_{n-1}}

    literal a y b

    g(x) es creciente en todo el intervalo, con valor minimo en g(1) = 2, y máximo en g(3) =2.449. Por observación de la gráfica, la pendiente g(x) es menor que la recta identidad en todo el intervalo

    Verifique la cota de g'(x)

    g(x) = \sqrt{3 + x} =(3+x)^{1/2} g'(x) =\frac{1}{2}(3+x)^{-1/2} g'(x) =\frac{1}{2\sqrt{3+x}}

    Tarea: verificar que g'(x) es menor que 1 en todo el intervalo.

    Literal c

    Usando el algoritmo del punto fijo, iniciando con el punto x0=2
    y tolerancia de 10-4, se tiene que:

    Iteración 1: x0=2

    g(x_0) = \sqrt{3 + 2} = 2.2361

    error = |2.2361 - 2| = 0.2361

    Iteración 2: x1 = 2.2361

    g(x_1) = \sqrt{3 + 2.2361} = 2.2882

    error = |2.2882 - 2.2361| = 0.0522

    Iteración 3: x2 = 2.2882

    g(x_2) = \sqrt{3 + 2.2882} = 2.2996

    error = |2.2996 - 2.28821| = 0.0114

    Iteración 4: x3 = 2.2996

    g(x_3) = \sqrt{3 + 2.2996} = 2.3021

    error = |2.3021- 2.2996| = 0.0025

    Iteración 5: x4 = 2.3021

    g(x_4) = \sqrt{3 + 2.3021} = 2.3026

    error = |2.3021- 2.2996| = 5.3672e-04

    con lo que determina que el error en la 5ta iteración es de 5.3672e-04 y el error se reduce en casi 1/4 entre iteraciones. El punto fijo converge a 2.3028

    Se muestra como referencia la tabla resumen.

    [[ x ,   g(x), 	 tramo  ] 
     [1.      2.      1.    ]
     [2.      2.2361  0.2361]
     [2.2361  2.2882  0.0522]
     [2.2882  2.2996  0.0114]
     [2.2996  2.3021  0.0025]
     [2.3021  2.3026  5.3672e-04]
     [2.3026  2.3027  1.1654e-04]
     [2.3027  2.3028  2.5305e-05]
    raiz:  2.3027686193257098
    

    con el siguiente comportamiento de la funcion:

    literal e

    Realizando el mismo ejercicio para el método de la bisección, se requiere cambiar a la forma f(x)=0

    x = \sqrt{3 + x} 0 = \sqrt{3 + x} -x f(x) = \sqrt{3 + x} -x

    tomando como intervalo el mismo que el inicio del problema [1,3], al realizar las operaciones se tiene que:

    a = 1 ; f(a) = 1
    b = 3 ; f(b) = -0.551
    c = (a+b)/2 = (1+3)/2 = 2
    f(c) = f(2) = (3 + 2)^(.5) +2 = 0.236
    Siendo f(c) positivo, y tamaño de paso 2, se reduce a 1
    
    a = 2 ; f(a) = 0.236
    b = 3 ; f(b) = -0.551
    c = (a+b)/2 = (2+3)/2 = 2.5
    f(c) = f(2.5) = (3 + 2.5)^(.5) +2.5 = -0.155
    Siendo fc(c) negativo y tamaño de paso 1, se reduce a .5
    
    a = 2
    b = 2.5
    ...

    Siguiendo las operaciones se obtiene la siguiente tabla:

    [ i, a,   c,   b,    f(a),  f(c),  f(b), paso]
     1 1.000 2.000 3.000 1.000  0.236 -0.551 2.000 
     2 2.000 2.500 3.000 0.236 -0.155 -0.551 1.000 
     3 2.000 2.250 2.500 0.236  0.041 -0.155 0.500 
     4 2.250 2.375 2.500 0.041 -0.057 -0.155 0.250 
     5 2.250 2.312 2.375 0.041 -0.008 -0.057 0.125 
     6 2.250 2.281 2.312 0.041  0.017 -0.008 0.062 
     7 2.281 2.297 2.312 0.017  0.005 -0.008 0.031 
     8 2.297 2.305 2.312 0.005 -0.001 -0.008 0.016 
     9 2.297 2.301 2.305 0.005  0.002 -0.001 0.008 
    10 2.301 2.303 2.305 0.002  0.000 -0.001 0.004 
    11 2.303 2.304 2.305 0.000 -0.001 -0.001 0.002 
    12 2.303 2.303 2.304 0.000 -0.000 -0.001 0.001 
    13 2.303 2.303 2.303 0.000 -0.000 -0.000 0.000 
    14 2.303 2.303 2.303 0.000 -0.000 -0.000 0.000 
    15 2.303 2.303 2.303 0.000 -0.000 -0.000 0.000 
    16 2.303 2.303 2.303 0.000  0.000 -0.000 0.000 
    raiz:  2.302764892578125
    

    Donde se observa que para la misma tolerancia de 10-4, se incrementan las iteraciones a 16. Mientra que con punto fijo eran solo 8.

    Nota: En la evaluación solo se requeria calcular hasta la 5ta iteración. Lo presentado es para fines didácticos

  • s1Eva_IIT2019_T3 Circuito eléctrico

    Ejercicio: 1Eva_IIT2019_T3 Circuito eléctrico

    Las ecuaciones del problema son:

    55 I_1 - 25 I_4 =-200 -37 I_3 - 4 I_4 =-250 -25 I_1 - 4 I_3 +29 I_4 =100 I_2 =-10

    Planteo del problema en la forma A.X=B

    A = [[ 55.0, 0,  0, -25],
         [  0  , 0,-37,  -4],
         [-25  , 0, -4,  29],
         [  0  ,  1, 0,   0]]
    
    B = [-200,-250,100,-10]
    

    El ejercicio se puede simplificar con una matriz de 3x3 dado que una de las corrientes I2 es conocida con valor -10, queda resolver el problema para
    [I1 ,I3 ,I4 ]

    A = [[ 55.0,   0, -25],
         [  0  , -37,  -4],
         [-25  ,  -4,  29]]
    
    B = [-200,-250,100]
    

    conformando la matriz aumentada

    [[  55.    0.  -25. -200.]
     [   0.  -37.   -4. -250.]
     [ -25.   -4.   29.  100.]]
    

    que se pivotea por filas para acercar a matriz diagonal dominante:

    [[  55.    0.  -25. -200.]
     [   0.  -37.   -4. -250.]
     [ -25.   -4.   29.  100.]]
    

    Literal a

    Para métodos directos se aplica el método de eliminación hacia adelante.

    Usando el primer elemento en la diagonal se convierten en ceros los números debajo de la posición primera de la diagonal

    [[  55.    0.  -25.         -200.      ]
     [   0.  -37.   -4.         -250.      ]
     [   0.   -4.   17.636363      9.090909]]
    

    luego se continúa con la segunda columna:

    [[  55.    0.  -25.         -200.      ]
     [   0.  -37.   -4.         -250.      ]
     [   0.    0.   18.068796     36.117936]]
    

    y para el método de Gauss se emplea sustitución hacia atrás
    se determina el valor de I4

    18.068796 I_4 = 36.11793612 I_4 =\frac{36.11793612}{18.068796}= 1.99891216 -37 I_3 -4 I_4 = -250 -37 I_3= -250 + 4 I_4 I_3=\frac{-250 + 4 I_4}{-37} I_3=\frac{-250 + 4 (1.99891216)}{-37} = 6.54065815

    y planteando se obtiene el último valor

    55 I_1 +25 I_4 = -200 55 I_1 = -200 -25 I_4 I_1 = \frac{-200 -25 I_4}{55} I_1 = \frac{-200 -25(1.99891216)}{55} = -2.7277672

    con lo que el vector solución es:

    [-2.7277672   6.54065815  1.99891216]
    

    sin embargo, para verificar la respuesta se aplica A.X=B

    verificar que A.X = B, obteniendo nuevamente el vector B.
    [-200.  -250.  100.]]
    

    literal b

    La norma de la matriz infinito se determina como:

    ||x|| = max\Big[ |x_i| \Big]

    considere que en el problema el término en A de magnitud mayor es 55.
    El vector suma de filas es:

    [[| 55|+|  0|+|-25|],    [[80],
     [|  0|+|-37|+| -4|],  =  [41],
     [[-25|+| -4|+| 29|]]     [58]]
    
    por lo que la norma ∞ ejemplo ||A||∞ 
    es el maximo de suma de filas: 80
    

    para revisar la estabilidad de la solución, se observa el número de condición

    >>> np.linalg.cond(A)
    4.997509004325602

    En éste caso no está muy alejado de 1. De resultar alejado del valor ideal de uno,  la solución se considera poco estable. Pequeños cambios en la entrada del sistema generan grandes cambios en la salida.

    Tarea: Matriz de transición de Jacobi


    Literal c

    En el método de Gauss-Seidel acorde a lo indicado, se inicia con el vector cero. Como no se indica el valor de tolerancia para el error, se considera tolera = 0.0001

    las ecuaciones para el método son:

    I_1 =\frac{-200 + 25 I_4}{55} I_3 = \frac{-250+ 4 I_4}{-37} I_4 =\frac{100 +25 I_1 + 4 I_3}{29}

    Como I2 es constante, no se usa en las iteraciones

    I_2 =-10

    teniendo como resultados de las iteraciones:

    Matriz aumentada
    [[  55.    0.  -25. -200.]
     [   0.  -37.   -4. -250.]
     [ -25.   -4.   29.  100.]]
    Pivoteo parcial:
      Pivoteo por filas NO requerido
    Iteraciones Gauss-Seidel
    itera,[X]
          diferencia,errado
    0 [0. 0. 0.] 2e-05
    1 [-3.6363636  6.7567568  1.2454461]
       [3.6363636 6.7567568 1.2454461] 6.756756756756757
    2 [-3.0702518  6.6221139  1.7149021]
       [0.5661119 0.1346428 0.469456 ] 0.5661118513783094
    3 [-2.8568627  6.5713619  1.891858 ]
       [0.2133891 0.050752  0.1769559] 0.2133891067340583
    4 [-2.7764282  6.5522316  1.9585594]
       [0.0804345 0.0191304 0.0667014] 0.08043447732439457
    5 [-2.7461094  6.5450206  1.9837016]
       [0.0303188 0.007211  0.0251423] 0.030318816370094925
    6 [-2.7346811  6.5423025  1.9931787]
       [0.0114283 0.0027181 0.0094771] 0.011428316023939011
    7 [-2.7303733  6.541278   1.996751 ]
       [0.0043078 0.0010246 0.0035723] 0.004307767346479974
    8 [-2.7287495  6.5408918  1.9980975]
       [0.0016238 0.0003862 0.0013465] 0.001623761494915943
    9 [-2.7281375  6.5407462  1.9986051]
       [0.0006121 0.0001456 0.0005076] 0.0006120575185017962
    10 [-2.7279068  6.5406913  1.9987964]
       [2.3070778e-04 5.4871039e-05 1.9131760e-04] 0.00023070777766820427
    11 [-2.7278198  6.5406707  1.9988685]
       [8.6962544e-05 2.0682983e-05 7.2114885e-05] 8.696254366213907e-05
    12 [-2.727787   6.5406629  1.9988957]
       [3.2779493e-05 7.7962038e-06 2.7182845e-05] 3.277949307367578e-05
    13 [-2.7277747  6.5406599  1.998906 ]
       [1.2355839e-05 2.9386860e-06 1.0246249e-05] 1.235583874370505e-05
    14 [-2.72777    6.5406588  1.9989098]
       [4.6573860e-06 1.1077026e-06 3.8622013e-06] 4.6573859666665385e-06
    numero de condición: 4.997509004325604
    respuesta con Gauss-Seidel
    [-2.72777    6.5406588  1.9989098]
    >>>
    

    con lo que el vector resultante es:

    respuesta con Gauss-Seidel
    [-2.72777 6.5406588 1.9989098]
    

    que para verificar, se realiza la operación A.X
    observando que el resultado es igual a B

    [[-200.00002751]
     [-249.9999956 ]
     [ 100.0000125 ]]
    


    Solución alterna


    Usando la matriz de 4x4, los resultados son iguales para las corrientes
    [I1 ,I2 , I3 ,I4 ]. Realizando la matriz aumentada,

    [[  55.    0.    0.  -25. -200.]
     [   0.    0.  -37.   -4. -250.]
     [ -25.    0.   -4.   29.  100.]
     [   0.    1.    0.    0.  -10.]]
    

    que se pivotea por filas para acercar a matriz diagonal dominante:

    [[  55.    0.    0.  -25. -200.]
     [   0.    1.    0.    0.  -10.]
     [   0.    0.  -37.   -4. -250.]
     [ -25.    0.   -4.   29.  100.]]
    

    Literal a

    Para métodos directos se aplica el método de eliminación hacia adelante.

    Usando el primer elemento  en la diagonal.

    [[  55.     0.     0.   -25.         -200.        ]
     [   0.     1.     0.     0.          -10.        ]
     [   0.     0.   -37.    -4.         -250.        ]
     [   0.     0.    -4.    17.63636364    9.09090909]]
    

    para el segundo no es necesario, por debajo se encuentran valores cero.
    Por lo que se pasa al tercer elemento de la diagonal

    [[  55.     0.     0.     -25.         -200.        ]
     [   0.     1.     0.      0.          -10.        ]
     [   0.     0.   -37.     -4.         -250.        ]
     [   0.     0.     0.     18.06879607    36.11793612]]
    

    y para el método de Gauss se emplea sustitución hacia atras.
    para x4:

    18.06879607 x_4 = 36.11793612 x_4 = 1.99891216

    para x3:

    -37 x_3 -4 x_3 = -250 37 x_3 = 250-4 x_4 = 250-4(1.99891216) x_3 = 6.54065815

    como ejercicio, continuar con x1, dado que x2=-10

    55 x_1 + 25 x_4 = -200

    El vector solución obtenido es:

    el vector solución X es:
    [[ -2.7277672 ]
     [-10.        ]
     [  6.54065815]
     [  1.99891216]]
    

    sin embargo, para verificar la respuesta se aplica A.X=B.

    [[-200.]
     [-250.]
     [ 100.]
     [ -10.]]
    

    Se revisa el número de condición de la matriz:

    >>> np.linalg.cond(A)
    70.21827416891405
    

    Y para éste caso, el número de condición se encuentra alejado del valor 1, contrario a la respuesta del la primera forma de solución con la matriz 3x3. De resultar alejado del valor ideal de uno, la solución se considera poco estable. Pequeños cambios en la entrada del sistema generan grandes cambios en la salida.


    Algoritmo en Python

    Presentado por partes para revisión:

    Para el método de Gauss, los resultados del algoritmo se muestran como:

    Matriz aumentada
    [[  55.    0.  -25. -200.]
     [   0.  -37.   -4. -250.]
     [ -25.   -4.   29.  100.]]
    Pivoteo parcial:
      Pivoteo por filas NO requerido
    Elimina hacia adelante:
     fila 0 pivote:  55.0
       factor:  0.0  para fila:  1
       factor:  -0.45454545454545453  para fila:  2
     fila 1 pivote:  -37.0
       factor:  0.10810810810810811  para fila:  2
     fila 2 pivote:  18.06879606879607
    [[  55.            0.          -25.         -200.        ]
     [   0.          -37.           -4.         -250.        ]
     [   0.            0.           18.06879607   36.11793612]]
    solución: 
    [-2.7277672   6.54065815  1.99891216]

    Instrucciones en Python usando las funciones creadas en la unidad:

    # 1Eva_IIT2019_T3 Circuito eléctrico
    # Método de Gauss
    # Solución a Sistemas de Ecuaciones
    # de la forma A.X=B
    import numpy as np
    
    def pivoteafila(A,B,vertabla=False):
        '''
        Pivotea parcial por filas
        Si hay ceros en diagonal es matriz singular,
        Tarea: Revisar si diagonal tiene ceros
        '''
        A = np.array(A,dtype=float)
        B = np.array(B,dtype=float)
        # Matriz aumentada
        nB = len(np.shape(B))
        if nB == 1:
            B = np.transpose([B])
        AB  = np.concatenate((A,B),axis=1)
        
        if vertabla==True:
            print('Matriz aumentada')
            print(AB)
            print('Pivoteo parcial:')
        
        # Pivoteo por filas AB
        tamano = np.shape(AB)
        n = tamano[0]
        m = tamano[1]
        
        # Para cada fila en AB
        pivoteado = 0
        for i in range(0,n-1,1):
            # columna desde diagonal i en adelante
            columna = np.abs(AB[i:,i])
            dondemax = np.argmax(columna)
            
            # dondemax no es en diagonal
            if (dondemax != 0):
                # intercambia filas
                temporal = np.copy(AB[i,:])
                AB[i,:] = AB[dondemax+i,:]
                AB[dondemax+i,:] = temporal
    
                pivoteado = pivoteado + 1
                if vertabla==True:
                    print(' ',pivoteado, 'intercambiar filas: ',i,'y', dondemax+i)
        if vertabla==True:
            if pivoteado==0:
                print('  Pivoteo por filas NO requerido')
            else:
                print(AB)
        return(AB)
    
    def gauss_eliminaAdelante(AB,vertabla=False, casicero = 1e-15):
        ''' Gauss elimina hacia adelante
        tarea: verificar términos cero
        '''
        tamano = np.shape(AB)
        n = tamano[0]
        m = tamano[1]
        if vertabla==True:
            print('Elimina hacia adelante:')
        for i in range(0,n,1):
            pivote = AB[i,i]
            adelante = i+1
            if vertabla==True:
                print(' fila',i,'pivote: ', pivote)
            for k in range(adelante,n,1):
                if (np.abs(pivote)>=casicero):
                    factor = AB[k,i]/pivote
                    AB[k,:] = AB[k,:] - factor*AB[i,:]
                    if vertabla==True:
                        print('   factor: ',factor,' para fila: ',k)
                else:
                    print('  pivote:', pivote,'en fila:',i,
                          'genera division para cero')
        if vertabla==True:
            print(AB)
        return(AB)
    
    def gauss_sustituyeAtras(AB,vertabla=False, casicero = 1e-15):
        ''' Gauss sustituye hacia atras
        '''
        tamano = np.shape(AB)
        n = tamano[0]
        m = tamano[1]
        # Sustitución hacia atras
        X = np.zeros(n,dtype=float) 
        ultfila = n-1
        ultcolumna = m-1
        for i in range(ultfila,0-1,-1):
            suma = 0
            for j in range(i+1,ultcolumna,1):
                suma = suma + AB[i,j]*X[j]
            X[i] = (AB[i,ultcolumna]-suma)/AB[i,i]
        return(X)
    
    # INGRESO
    A = [[ 55.0,   0, -25],
         [  0  , -37,  -4],
         [-25  ,  -4,  29]]
    
    B = [-200,-250,100]
    
    # PROCEDIMIENTO
    AB = pivoteafila(A,B,vertabla=True)
    
    AB = gauss_eliminaAdelante(AB,vertabla=True)
    
    X = gauss_sustituyeAtras(AB,vertabla=True)
    
    # SALIDA
    print('solución: ')
    print(X)
    

    literal c

    Resultados con el algoritmo de Gauss Seidel

    Matriz aumentada
    [[  55.    0.  -25. -200.]
     [   0.  -37.   -4. -250.]
     [ -25.   -4.   29.  100.]]
    Pivoteo parcial:
      Pivoteo por filas NO requerido
    Iteraciones Gauss-Seidel
    itera,[X]
          diferencia,errado
    0 [0. 0. 0.] 2e-05
    1 [-3.6363636  6.7567568  1.2454461]
       [3.6363636 6.7567568 1.2454461] 6.756756756756757
    2 [-3.0702518  6.6221139  1.7149021]
       [0.5661119 0.1346428 0.469456 ] 0.5661118513783094
    3 [-2.8568627  6.5713619  1.891858 ]
       [0.2133891 0.050752  0.1769559] 0.2133891067340583
    4 [-2.7764282  6.5522316  1.9585594]
       [0.0804345 0.0191304 0.0667014] 0.08043447732439457
    5 [-2.7461094  6.5450206  1.9837016]
       [0.0303188 0.007211  0.0251423] 0.030318816370094925
    6 [-2.7346811  6.5423025  1.9931787]
       [0.0114283 0.0027181 0.0094771] 0.011428316023939011
    7 [-2.7303733  6.541278   1.996751 ]
       [0.0043078 0.0010246 0.0035723] 0.004307767346479974
    8 [-2.7287495  6.5408918  1.9980975]
       [0.0016238 0.0003862 0.0013465] 0.001623761494915943
    9 [-2.7281375  6.5407462  1.9986051]
       [0.0006121 0.0001456 0.0005076] 0.0006120575185017962
    10 [-2.7279068  6.5406913  1.9987964]
       [2.3070778e-04 5.4871039e-05 1.9131760e-04] 0.00023070777766820427
    11 [-2.7278198  6.5406707  1.9988685]
       [8.6962544e-05 2.0682983e-05 7.2114885e-05] 8.696254366213907e-05
    12 [-2.727787   6.5406629  1.9988957]
       [3.2779493e-05 7.7962038e-06 2.7182845e-05] 3.277949307367578e-05
    13 [-2.7277747  6.5406599  1.998906 ]
       [1.2355839e-05 2.9386860e-06 1.0246249e-05] 1.235583874370505e-05
    14 [-2.72777    6.5406588  1.9989098]
       [4.6573860e-06 1.1077026e-06 3.8622013e-06] 4.6573859666665385e-06
    numero de condición: 4.997509004325604
    respuesta con Gauss-Seidel
    [-2.72777    6.5406588  1.9989098]
    >>> 
    

    Instrucciones en Python

    # 1Eva_IIT2019_T3 Circuito eléctrico
    # Algoritmo Gauss-Seidel
    # solución de matrices
    # métodos iterativos
    # Referencia: Chapra 11.2, p.310,
    #      Rodriguez 5.2 p.162
    import numpy as np
    
    def gauss_seidel(A,B,X0,tolera, iteramax=100,
                     vertabla=False, precision=4):
        ''' Método de Gauss Seidel, tolerancia, vector inicial X0
            para mostrar iteraciones: vertabla=True
        '''
        A = np.array(A, dtype=float)
        B = np.array(B, dtype=float)
        X0 = np.array(X0, dtype=float)
        tamano = np.shape(A)
        n = tamano[0]
        m = tamano[1]
        diferencia = 2*tolera*np.ones(n, dtype=float)
        errado = np.max(diferencia)
        X = np.copy(X0)
    
        itera = 0
        if vertabla==True:
            print('Iteraciones Gauss-Seidel')
            print('itera,[X]')
            print('      diferencia,errado')
            print(itera, X, errado)
            np.set_printoptions(precision)
        while (errado>tolera and itera<iteramax):
            for i in range(0,n,1):
                xi = B[i]
                for j in range(0,m,1):
                    if (i!=j):
                        xi = xi-A[i,j]*X[j]
                xi = xi/A[i,i]
                diferencia[i] = np.abs(xi-X[i])
                X[i] = xi
            errado = np.max(diferencia)
            itera = itera + 1
            if vertabla==True:
                print(itera, X)
                print('  ', diferencia, errado)
        # No converge
        if (itera>iteramax):
            X=itera
            print('iteramax superado, No converge')
        return(X)
    
    def pivoteafila(A,B,vertabla=False):
        '''
        Pivotea parcial por filas, entrega matriz aumentada AB
        Si hay ceros en diagonal es matriz singular,
        Tarea: Revisar si diagonal tiene ceros
        '''
        A = np.array(A,dtype=float)
        B = np.array(B,dtype=float)
        # Matriz aumentada
        nB = len(np.shape(B))
        if nB == 1:
            B = np.transpose([B])
        AB  = np.concatenate((A,B),axis=1)
        
        if vertabla==True:
            print('Matriz aumentada')
            print(AB)
            print('Pivoteo parcial:')
        
        # Pivoteo por filas AB
        tamano = np.shape(AB)
        n = tamano[0]
        m = tamano[1]
        
        # Para cada fila en AB
        pivoteado = 0
        for i in range(0,n-1,1):
            # columna desde diagonal i en adelante
            columna = np.abs(AB[i:,i])
            dondemax = np.argmax(columna)
            
            # dondemax no es en diagonal
            if (dondemax != 0):
                # intercambia filas
                temporal = np.copy(AB[i,:])
                AB[i,:] = AB[dondemax+i,:]
                AB[dondemax+i,:] = temporal
    
                pivoteado = pivoteado + 1
                if vertabla==True:
                    print(' ',pivoteado, 'intercambiar filas: ',i,'y', dondemax+i)
        if vertabla==True:
            if pivoteado==0:
                print('  Pivoteo por filas NO requerido')
            else:
                print('AB')
        return(AB)
    
    # INGRESO
    A = [[ 55.0,   0, -25],
         [  0  , -37,  -4],
         [-25  ,  -4,  29]]
    
    B = [-200,-250,100]
    
    X0  = [0.,0.,0.]
    
    tolera = 0.00001
    iteramax = 100
    verdecimal = 7
    
    # PROCEDIMIENTO
    # numero de condicion
    ncond = np.linalg.cond(A)
    
    AB = pivoteafila(A,B,vertabla=True)
    # separa matriz aumentada en A y B
    [n,m] = np.shape(AB)
    A = AB[:,:m-1]
    B = AB[:,m-1]
    
    respuesta = gauss_seidel(A,B,X0, tolera,
                             vertabla=True, precision=verdecimal)
    
    # SALIDA
    print('numero de condición:', ncond)
    print('respuesta con Gauss-Seidel')
    print(respuesta)
    

    .

  • s1Eva_IIT2019_T2 Proceso Termodinámico

    Ejercicio: 1Eva_IIT2019_T2 Proceso Termodinámico

    la ecuación para el problema se describe como:

    f(x)=e^{-0.5x}

    ecuación que se usa para describir los siguientes puntos:

    x 0 1 2 3 4
    f(x) 1 0.60653065 0.36787944 0.22313016  0.13533528

    Como el polinomio es de grado 2, se utilizan tres puntos. Para cubrir el intervalo los puntos seleccionados incluyen los extremos y el punto medio.

    literal a

    Con los puntos seleccionados se escriben las ecuaciones del polinomio:

    p_2(x)= a_0 x^2 + a_1 x + a_2

    usando los valores de la tabla:

    p_2(0)=a_0 (0)^2 + a_1 (0) + a_2 = 1 p_2(2)=a_0 (2)^2 + a_1 (2) + a_2 = 0.36787944 p_2(4)=a_0 (4)^2 + a_1 (4) + a_2 = 0.13533528

    con la que se escribe la matriz Vandermonde con la forma A.x=B

    A= [[ 0.,  0.,  1.,]
        [ 4.,  2.,  1.,]
        [16.,  4.,  1.,]]
    
    B= [[1.        ],
        [0.36787944],
        [0.13533528]]) 
    

    matriz aumentada

    [[ 0.,  0.,  1.,  1.        ]
     [ 4.,  2.,  1.,  0.36787944]
     [16.,  4.,  1.,  0.13533528]]
    

    matriz pivoteada

    [[16.,  4.,  1.,  0.13533528]
     [ 4.,  2.,  1.,  0.36787944]
     [ 0.,  0.,  1.,  1.        ]]
    

    Resolviendo por algún método directo, la solución proporciona los coeficientes del polinomio

    Tarea: escribir la solución del método directo, semejante a la presentada en el tema 3

    [ 0.04994705 -0.41595438  1.        ]
    

    con lo que el polinomio de interpolación es:

    p_2(x) = 0.04994705 x^2 - 0.41595438 x + 1.0

    en el enunciado se requiere la evaluación en x=2.4

    p_2(2.4) = 0.04994705 (2.4)^2 - 0.41595438 (2.4) + 1.0 f(2.4)=e^{-0.5(2.4)} error = |f(2.4)-p_2(2.4)|
    Evaluando en X1:  2.4
    Evaluando p(x1):  0.2894044975129779
    Error en x1:      0.011789714399224216
     Error relativo:  0.039143230291095066
    

    La diferencia entre la función y el polinomio de interpolación se puede observar en la gráfica:
    s1eIIT2019T2_grafica


    literal b

    Tarea: Encontrar la cota de error con f(1.7)


    Algoritmo en Python

    Resultado con el algoritmo

    Matriz Vandermonde: 
    [[ 0.  0.  1.]
     [ 4.  2.  1.]
     [16.  4.  1.]]
    los coeficientes del polinomio: 
    [ 0.04994705 -0.41595438  1.        ]
    Polinomio de interpolación: 
    0.049947050111716*x**2 - 0.415954379637711*x + 1.0
    
     formato pprint
                       2                            
    0.049947050111716*x  - 0.415954379637711*x + 1.0
    
    Evaluando en X1:  2.4
    Evaluando p(x1):  0.2894044975129779
    Error en x1:      0.011789714399224216
     Error relativo:  0.039143230291095066
    
    Evaluando en X2:  1.7
    Evaluando p(x2):  0.2894044975129779
    Error en x2:      0.011789714399224216
     Error relativo:  0.039143230291095066
    

    Presentado por secciones, semejante a lo desarrollado en clases

    # 1Eva_IIT2019_T2 Proceso Termodinámico
    # El polinomio de interpolación
    import numpy as np
    import sympy as sym
    
    # INGRESO
    fx = lambda x: np.exp(-0.5*x)
    xi =np.array([0,2,4],dtype=float)
    
    # determina vector
    fi= fx(xi)
    
    # PROCEDIMIENTO
    # Convierte a arreglos numpy 
    xi = np.array(xi,dtype=float)
    fi = np.array(fi,dtype=float)
    
    B = fi
    n = len(xi)
    
    # Matriz Vandermonde D
    D = np.zeros(shape=(n,n),dtype=float)
    for i in range(0,n,1):
        for j in range(0,n,1):
            potencia = (n-1)-j # Derecha a izquierda
            D[i,j] = xi[i]**potencia
    
    # Aplicar métodos Unidad03. Tarea
    # Resuelve sistema de ecuaciones A.X=B
    coeficiente = np.linalg.solve(D,B)
    
    # Polinomio en forma simbólica
    x = sym.Symbol('x')
    polinomio = 0
    for i in range(0,n,1):
        potencia = (n-1)-i   # Derecha a izquierda
        termino = coeficiente[i]*(x**potencia)
        polinomio = polinomio + termino
    
    # Polinomio a forma Lambda x:
    # para evaluación con vectores de datos xin
    muestras = 21
    px = sym.lambdify(x,polinomio)
    
    # SALIDA
    print('Matriz Vandermonde: ')
    print(D)
    print('los coeficientes del polinomio: ')
    print(coeficiente)
    print('Polinomio de interpolación: ')
    print(polinomio)
    print('\n formato pprint')
    sym.pprint(polinomio)
    
    
    # literal b
    x1 = 2.4
    px1 = px(x1)
    fx1 = fx(x1)
    errorx1 = np.abs(px1-fx1)
    errorx1rel = errorx1/fx1
    x2 = 1.7
    px2 = px(x1)
    fx2 = fx(x1)
    errorx2 = np.abs(px1-fx1)
    errorx2rel = errorx1/fx1
    print()
    print('Evaluando en X1: ',x1)
    print('Evaluando p(x1): ',px1)
    print('Error en x1:     ',errorx1)
    print(' Error relativo: ', errorx1rel)
    print()
    print('Evaluando en X2: ',x2)
    print('Evaluando p(x2): ',px2)
    print('Error en x2:     ',errorx2)
    print(' Error relativo: ', errorx2rel)
    
    
    # GRAFICA
    import matplotlib.pyplot as plt
    a = np.min(xi)
    b = np.max(xi)
    xin = np.linspace(a,b,muestras)
    yin = px(xin)
    
    # Usando evaluación simbólica
    ##yin = np.zeros(muestras,dtype=float)
    ##for j in range(0,muestras,1):
    ##    yin[j] = polinomio.subs(x,xin[j])
    
    plt.plot(xi,fi,'o', label='[xi,fi]')
    plt.plot(xin,yin, label='p(x)')
    plt.plot(xin,fx(xin), label='f(x)')
    plt.xlabel('xi')
    plt.ylabel('fi')
    plt.legend()
    plt.title(polinomio)
    plt.show()
    

     

  • s1Eva_IIT2019_T4 Concentración de químico

    Ejercicio: 1Eva_IIT2019_T4 Concentración de químico

    formula a usar:

    C = C_{ent} ( 1 - e^{-0.04t})+C_{0} e^{-0.03t}

    Se sustituyen los valores dados con:
    C0 = 4, Cent = 10, C = 0.93 Cent.

    0.93(10) = 10 ( 1 - e^{-0.04t}) + 4 e^{-0.03t}

    igualando a cero para forma estandarizada del algoritmo,

    10( 1 - e^{-0.04t}) + 4 e^{-0.03t} - 9.3 = 0 0.7 - 10 e^{-0.04t} + 4 e^{-0.03t} = 0

    se usas las funciones f(t) y f'(t) para el método de Newton-Raphson,

    f(t) = 0.7 - 10 e^{-0.04t} + 4 e^{-0.03t} f'(t) = - 10(-0.04) e^{-0.04t} + 4(-0.03) e^{-0.03t} f'(t) = 0.4 e^{-0.04t} - 0.12 e^{-0.03t}

    con lo que se pueden realizar los cálculos de forma iterativa.

    t_{i+1} = t_i -\frac{f(t_i)}{f'(t_i)}

    De no disponer de la gráfica de f(t), y se desconoce el valor inicial para t0 se usa 0. Como no se indica la tolerancia, se estima en 10-4

    Iteración 1

    t0 = 0

    f(0) = 0.7 - 10 e^{-0.04(0)} + 4 e^{-0.03(0)} = 5.3 f'(0) = 0.4 e^{-0.04(0)} - 0.12 e^{-0.03(0)} = -0.28 t_{1} = 0 -\frac{5.3}{-0.28} = 18.92 error = |18.92-0| = 18.92

    Iteración 2

    f(18.92) = 0.7 - 10 e^{-0.04(18.92)} + 4 e^{-0.03(18.92)} = -1.72308 f'(18.92) = 0.4 e^{-0.04(18.92)} - 0.12 e^{-0.03(18.92)} = 0.119593 t_{2} = 18.92 -\frac{-1.723087}{0.119593} = 33.3365 error = |33.3365 - 18.92| = 14.4079

    Iteración 3

    f(33.3365) = 0.7 - 10 e^{-0.04(33.3365)} + 4 e^{-0.03(33.3365)} = -0.4642 f'(33.3365) = 0.4 e^{-0.04(33.3365)} - 0.12 e^{-0.03(33.3365)} = 0.06128 t_{3} = 33.3365 -\frac{-0.46427}{-5.8013} = 40.912 error = |40.912 - 33.3365| = 7.5755

    Observando que los errores disminuyen entre cada iteración, se encuentra que el método converge.

    y se forma la siguiente tabla:

    ['xi' ,  'xnuevo', 'error']
    [ 0.      18.9286  18.9286]
    [18.9286  33.3365  14.4079]
    [33.3365  40.912    7.5755]
    [40.912   42.654     1.742]
    [42.654   42.7316   0.0776]
    [4.2732e+01 4.2732e+01 1.4632e-04]
    raiz en:  42.731721341402796
    

    Observando la gráfica de la función puede observar el resultado:


    Algoritmo en Python

    # 1Eva_IIT2019_T4
    # Método de Newton-Raphson
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    fx = lambda t: 0.7-10*np.exp(-0.04*t)+4*np.exp(-0.03*t)
    dfx = lambda t:0.40*np.exp(-0.04*t)-0.12*np.exp(-0.03*t)
    
    x0 = 0
    tolera = 0.001
    
    a = 0
    b = 60
    muestras = 21
    
    # PROCEDIMIENTO
    tabla = []
    tramo = abs(2*tolera)
    xi = x0
    while (tramo>=tolera):
        xnuevo = xi - fx(xi)/dfx(xi)
        tramo = abs(xnuevo-xi)
        tabla.append([xi,xnuevo,tramo])
        xi = xnuevo
    
    tabla = np.array(tabla)
    n=len(tabla)
    
    # para la gráfica
    xk = np.linspace(a,b,muestras)
    fk = fx(xk)
    
    # SALIDA
    print(['xi', 'xnuevo', 'error'])
    np.set_printoptions(precision = 4)
    for i in range(0,n,1):
        print(tabla[i])
    print('raiz en: ', xi)
    
    # grafica
    plt.plot(xk,fk)
    plt.axhline(0, color='black')
    plt.xlabel('t')
    plt.ylabel('f(t)')
    plt.show()
    
  • s1Eva_IT2019_T3 Vector perpendicular a plano

    Ejercicio: 1Eva_IT2019_T3 Vector perpendicular a plano

    Literal a

    Para que un vector sea perpendicular a otro, se debe cumplir que
    V1.V2 =0.

    \begin{bmatrix} 2 \\ -3 \\ a \end{bmatrix} . \begin{bmatrix} b \\ 1 \\ -4 \end{bmatrix} = 0

    se obtiene entonces la ecuación:

    (2)(b)+(-3)(1)+(a)(-4)=0
    2b -3 -4a =0
    

    procediendo de la misma forma con los siguientes pares de vectores:

    \begin{bmatrix} 2 \\ -3 \\ a \end{bmatrix} . \begin{bmatrix} 3 \\ c \\ 2 \end{bmatrix} = 0

    se obtiene entonces la ecuación:

    (2)(3)+(-3)(c)+(a)(2)=0
    6 -3c +2a = 0
    
    \begin{bmatrix} b \\ 1 \\ -4 \end{bmatrix} . \begin{bmatrix} 3 \\ c \\ 2 \end{bmatrix} = 2

    se obtiene entonces la ecuación:

    (b)(3)+(1)(c)+(-4)(2)=2
    3b +c -8 =2
    

    se obtiene el sistema de ecuaciones:

    \begin{cases}-4a+2b=3 \\ 2a-3c=-6 \\3b+c=10 \end{cases}

    Literal b

    Se convierte a la forma matricial Ax=B

    \begin{bmatrix} -4 && 2 && 0 \\ 2 && 0 && -3 \\ 0 && 3 && 1\end{bmatrix}.\begin{bmatrix} a \\b\\c \end{bmatrix} = \begin{bmatrix} 3 \\ -6 \\ 10 \end{bmatrix}

    se crea la matriz aumentada:

    \begin{bmatrix} -4 && 2 && 0 && 3 \\ 2 && 0 && -3 &&-6 \\ 0 && 3 && 1 && 10 \end{bmatrix}

    se pivotea por filas buscando hacerla diagonal dominante:

    \begin{bmatrix} -4 && 2 && 0 && 3 \\ 0 && 3 && 1 && 10 \\ 2 && 0 && -3 &&-6 \end{bmatrix}

    se aplica el algoritmo de eliminación hacia adelante:
    1ra Iteración

    la eliminación del primer término columna es necesario solo para la tercera fila:

    \begin{bmatrix} -4 && 2 && 0 && 3 \\ 0 && 3 && 1 && 10 \\ 2 -(-4)\Big( \frac{2}{-4}\Big) && 0-2\Big(\frac{2}{-4}\Big) && -3 -0\Big(\frac{2}{-4}\Big) &&-6 -3\Big(\frac{2}{-4}\Big) \end{bmatrix} \begin{bmatrix} -4 && 2 && 0 && 3 \\ 0 && 3 && 1 && 10 \\ 0 && 1 && -3 && -4.5 \end{bmatrix}

    2da Iteración

    \begin{bmatrix} -4 && 2 && 0 && 3 \\ 0 && 3 && 1 && 10 \\ 0 && 1 -3\Big(\frac{1}{3}\Big) && -3-(1)\Big(\frac{1}{3}\Big) && -4.5-10\Big(\frac{1}{3}\Big) \end{bmatrix} \begin{bmatrix} -4 && 2 && 0 && 3 \\ 0 && 3 && 1 && 10 \\ 0 && 0 && -\frac{10}{3} && -7.8333 \end{bmatrix}

    Aplicando eliminación hacia atras

    (-10/3)c = -7.8333
    c = -7.8333(-3/10) = 2.35
    
    3b +c = 10
    b= (10-c)/3 = (10-2.35)/3 = 2.55
    
    -4a +2b =3
    a= (3-2b)/(-4) = (3-2(2.55))/(-4) = 0.525
    

    como resultado, los vectores buscados:

    v1 = (2,-3,0.525)
    v2 = (2.55,1,-4)
    v3 = (3,2.35,2)

    comprobando resultados:

    >>> np.dot((2,-3,0.525),(2.55,1,-4))
    -4.440892098500626e-16
    >>> np.dot((2,-3,0.525),(3,2.35,2))
    -6.661338147750939e-16
    >>> np.dot((2.55,1,-4),(3,2.35,2))
    2.0
    

    Los dos primeros resultados son muy cercanos a cero, por lo que se los considera válidos

    literal c

    Para usar el método de Jacobi, se despeja una de las variables de cada ecuación:

    \begin{cases} a = \frac{2b -3}{4} \\b = \frac{10-c}{3} \\c = \frac{2a+6}{3} \end{cases}

    usando el vector x(0) = [0,0,0]

    1ra iteración

    a = \frac{2b -3}{4} = \frac{2(0) -3}{4} = -\frac{3}{4} b = \frac{10-c}{3} = \frac{10-0}{3} = \frac{10}{3} c = \frac{2a+6}{3 }= \frac{2(0)+6}{3} = 2

    x(1) = [-3/4,10/3,2]
    diferencias = [-3/4-0,10/3-0,2-0] = [-3/4,10/3,2]
    error = max|diferencias| = 10/3 = 3.3333

    2da iteración

    a = \frac{2b -3}{4} = \frac{2(10/3) -3}{4} = \frac{11}{12} b = \frac{10-c}{3} = \frac{10-2}{3} = \frac{8}{3} c = \frac{2a+6}{3} = \frac{2(-3/4)+6}{3} = \frac{3}{2}

    x(2) = [11/12,8/3,3/2]
    diferencias = [11/12-(-3/4),8/3-10/3,3/2-2] = [20/12, -2/3, -1/2]
    error = max|diferencias| = 5/3= 1.666

    3ra iteración

    a = \frac{2b -3}{4} = \frac{2(8/3)-3}{4} = \frac{7}{12} b = \frac{10-c}{3} = \frac{10-3/2}{3} = \frac{17}{6} c = \frac{2a+6}{3} = \frac{2(11/12)+6}{3} = 2.6111

    x(3) = [7/12, 17/6, 2.6111]
    diferencias = [7/12-11/12, 17/6-8/3, 2.6111-3/2] = [-1/3, 1/6, 1.1111]
    error = max|diferencias| = 1.1111

    Los errores disminuyen en cada iteración, por lo que el método converge,
    si se analiza en número de condición de la matriz A es 2, lo que es muy cercano a 1, por lo tanto el método converge.


    Revisión de resultados

    Resultados usando algoritmos desarrollados en clase:

    matriz aumentada: 
    [[-4.   2.   0.   3. ]
     [ 0.   3.   1.  10. ]
     [ 2.   0.  -3.  -6. ]]
    Elimina hacia adelante
    [[-4.   2.   0.   3. ]
     [ 0.   3.   1.  10. ]
     [ 0.   1.  -3.  -4.5]]
    Elimina hacia adelante
    [[-4.   2.   0.        3.      ]
     [ 0.   3.   1.       10.      ]
     [ 0.   0.  -3.333333 -7.833333]]
    Elimina hacia adelante
    [[-4.   2.   0.        3.      ]
     [ 0.   3.   1.       10.      ]
     [ 0.   0.  -3.333333 -7.833333]]
    Elimina hacia atras
    [[ 1.  -0.  -0.   0.525]
     [ 0.   1.   0.   2.55 ]
     [-0.  -0.   1.   2.35 ]]
    el vector solución X es:
    [[0.525]
     [2.55 ]
     [2.35 ]]
    verificar que A.X = B
    [[ 3.]
     [10.]
     [-6.]]
    
    Número de condición de A: 2.005894
    
    los resultados para [a,b,c]:
    [0.525 2.55  2.35 ]
    
    producto punto entre vectores:
    v12:  0.0
    v13:  1.3322676295501878e-15
    v23:  2.0
    

    Algoritmos en Python:

    # 1Eva_IT2019_T3 Vector perpendicular a plano
    import numpy as np
    
    # INGRESO
    A = np.array([[-4.,2,0],
                  [ 0., 3,1],
                  [ 2.,0,-3]])
    B = np.array([3.,10,-6])
    
    # PROCEDIMIENTO
    B = np.transpose([B])
    
    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]))
    
    numcond = np.linalg.cond(A)
    
    # para comprobar respuestas
    
    v1 = [2,-3,X[0]]
    v2 = [X[1],1,-4]
    v3 = [3,X[2],2]
    
    v12 = np.dot(v1,v2)
    v13 = np.dot(v1,v3)
    v23 = np.dot(v2,v3)
          
    # SALIDA
    print('\n Número de condición de A: ', numcond)
    
    print('\n los resultados para [a,b,c]:')
    print(X)
    
    print('\n productos punto entre vectores:')
    print('v12: ',v12)
    print('v13: ',v13)
    print('v23: ',v23)
    

    Tarea, usar el algoritmo de Jacobi usado en el taller correspondiente.