Autor: Edison Del Rosario

  • 1Eva_IT2019_T3 Vector perpendicular a plano

    1ra Evaluación I Término 2019-2020. 2/Julio/2019. MATG1013

    Tema 2. ( 30 puntos) Considere los siguientes vectores:
    V1 = (2,-3,a)
    V2=(b,1,-4)
    V3= (3,c,2)

    Se sabe que V1 es perpendicular a V y V3.

    También se sabe que V2.V3=2.

    Use un método para encontrar el valor de las incógnitas a,b,c

    a) Plantee el sistema

    b) Resuelva con el método de eliminación de Gauss

    c) Vuelva a resolver con el método de Jacobi con x(0) = [0,0,0], realice tres iteraciones

    d) Encuentre el residuo, cota del error absoluto y relativo

    Rúbrica: literal a (5 puntos), literal b, ordenar las ecuaciones(5 puntos), método Gauss (10 puntos);  literal c, aplicarJacobi (5 puntos), literal d (5 puntos)


    Notas:
    - Todos los temas deben mostrar evidencia del desarrollo del método numérico planteado.
    - En geometría euclídea se tiene, dos vectores v1 y v2 que son ortogonales forman un ángulo recto, por lo tanto v1 ⋅ v2 = 0. https://es.wikipedia.org/wiki/Ortogonalidad_(matem%C3%A1ticas)

    Referencia: Chapra 5ed. problema 10.18 p304, pdf 328.

  • 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.

  • 1Eva_IT2019_T2 Catenaria cable

    1ra Evaluación I Término 2019-2020. 2/Julio/2019. MATG1013

    Tema 2. (30 puntos) Un cable en forma catenaria es aquel que cuelga entre dos puntos que no se encuentran sobre la misma línea vertical. Como se muestra en la figura 1, no está sujeta a más carga que su propio peso. Así, su peso en N/m actúa como una carga uniforme por unidad de longitud a lo largo del cable.

    Cable Catenaria 01

    En la figura 2, se ilustra un diagrama de cuerpo libre de una sección AB, donde TA y TB son las fuerzas de tensión en el extremo.

    Con base en los balances de fuerzas horizontal y vertical, se obtiene para el cable el siguiente modelo:

    y = \frac{T_A}{w} cosh \Big( \frac{w}{T_A}x \Big) + y_0 - \frac{T_A}{w}

    Donde la altura y del cable está en función de la distancia x.

    Además se tiene que:

    cosh(z) = \frac{e^z+ e^{-z}}{2}

    Utilice el método de Newton-Raphson para hallar el valor del parámetro TA dado los valores de los parámetros w=12, y0=6 de modelo que el cable tenga una altura de 15 metros para x=50

    Rúbrica: Planteamiento del problema (10 puntos), obtener la derivada (5 puntos), plantear el método (5 puntos), iteraciones (5 puntos), verificar tolerancia (5 puntos)


    Nota: Todos los temas deben mostrar evidencia del desarrollo del método numérico planteado.

    Referencia: Chapra 5Ed Problema 8.17 p219 pdf243. Sears&Zemanski Vol1 12Ed problema 5.63. Cuerda con masa p173. https://es.wikipedia.org/wiki/Catenaria

  • s1Eva_IT2019_T2 Catenaria cable

    Ejercicio: 1Eva_IT2019_T2 Catenaria cable

    Las fórmulas con las que se requiere trabajar son:

    y = \frac{T_A}{w} cosh \Big( \frac{w}{T_A}x \Big) + y_0 - \frac{T_A}{w}

    Donde la altura y del cable está en función de la distancia x.

    Además se tiene que:

    cosh(z) = \frac{e^z+ e^{-z}}{2}

    que sustituyendo la segunda en la primera se convierte en:

    y = \frac{T_A}{w} \frac{e^{\frac{w}{T_A}x}+ e^{-\frac{w}{T_A}x}}{2} + y_0 - \frac{T_A}{w}

    y usando los valores del enunciado w=12, y0=6 , y=15, x=50 se convierte en:

    15 = \frac{T_A}{12} \frac{e^{\frac{12}{T_A}50}+ e^{-\frac{12}{T_A}50}}{2} + 6 - \frac{T_A}{12}

    simplificando, para usar el método de búsqueda de raíces:

    \frac{1}{2}\frac{T_A}{12} e^{\frac{12}{T_A}50} + \frac{1}{2}\frac{T_A}{12} e^{-\frac{12}{T_A}50} - \frac{T_A}{12} - 9 = 0

    cambiando la variable \frac{12}{T_A}=x

    \frac{1}{2x} e^{50x} + \frac{1}{2x} e^{-50x} - \frac{1}{x}-9=0

    la función a usar para la búsqueda de raíces es:

    f(x)=\frac{1}{2x} e^{50x} + \frac{1}{2x} e^{-50x} - \frac{1}{x}-9

    Para el método de Newton-Raphson se tiene que:

    x_{i+1} = x_i -\frac{f(x_i)}{f'(x_i)}

    por lo que se determina:

    f'(x)= - \frac{1}{2x^2}e^{50x} + \frac{1}{2x}(50) e^{50x} + - \frac{1}{2x^2} e^{-50x} + \frac{1}{2x}(-50)e^{-50x} + \frac{1}{x^2} f'(x)= -\frac{1}{2x^2}[e^{50x}+e^{-50x}] + + \frac{25}{x}[e^{50x}-e^{-50x}] +\frac{1}{x^2} f'(x)= \Big[\frac{25}{x} -\frac{1}{2x^2}\Big]\Big[e^{50x}+e^{-50x}\Big] +\frac{1}{x^2}

    Con lo que se puede inicar las iteraciones.

    Por no disponer de valor inicial para TA, considere que el cable colgado no debería tener tensión TA=0 N, pues en la forma x=12/TA se crea una indeterminación. Si no dispone de algún criterio para seleccionar el valor de TA puede iniciar un valor positivo, por ejemplo 120 con lo que el valor de x0=12/120=0.1

    Iteración 1

    f(0.1)=\frac{1}{2(0.1)} e^{50(0.1)} + \frac{1}{2(0.1)} e^{-50(0.1)} - \frac{1}{0.1}-9 =723.0994 f'(0.1)=\Big[\frac{25}{0.1} - \frac{1}{2(0.1)^2}\Big]\Big[e^{50(0.1)}+e^{-50(0.1)}\Big] + +\frac{1}{(0.1)^2} = 29780.61043 x_{1} = 0.1 -\frac{723.0994}{29780.61043} = 0.07571

    error = | x1 - x0| = | 0.07571 - 0.1| = 0.02428

    Iteración 2

    f(0.07571)=\frac{1}{2(0.07571)} e^{50(0.07571)}+ + \frac{1}{2(0.07571)} e^{-50(0.07571)} - \frac{1}{0.07571}-9 = 269.0042 f'(0.07571)= \Big[\frac{25}{0.07571} -\frac{1}{2(0.07571)^2}\Big]. .\Big[e^{50(0.07571)}+e^{-50(0.07571)}\Big] + +\frac{1}{(0.07571)^2} = 10874.0462 x_{2} = 0.07571 -\frac{269.0042}{10874.0462} = 0.05098

    error = | x2 - x1| = |0.05098- 0.02428| = 0.02473

    Iteración 3

    f(0.05098) = 97.6345 f'(0.05098) = 4144.1544 x_{3} = 0.0274

    error = | x3 - x2| = |0.05098- 0.0274| = 0.0236

    finalmente después de varias iteraciones, la raiz se encuentra en: 0.007124346154337298

    que convitiendo

    T_A = \frac{12}{x} = \frac{12}{0.0071243461} = 1684.36 N

    Revisión de resultados

    Usando como base los algoritmos desarrollados en clase:

    ['xi', 'xnuevo', 'tramo']
    [0.1    0.0757 0.0243]
    [0.0757 0.051  0.0247]
    [0.051  0.0274 0.0236]
    [0.0274 0.0111 0.0163]
    [0.0111 0.0072 0.0039]
    [7.2176e-03 7.1244e-03 9.3199e-05]
    [7.1244e-03 7.1243e-03 3.8351e-08]
    raiz en:  0.007124346154337298
    TA = 12/x =  1684.365096815854
    

    catenaria cable

    Algoritmos Python usando el procedimiento de:

    https://blog.espol.edu.ec/analisisnumerico/2-3-1-newton-raphson-ejemplo01/

    # 1Eva_IT2019_T2 Catenaria cable
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    a = 0.001
    b = 0.1
    muestras = 51
    
    x0 = 0.1
    tolera = 0.00001
    
    fx = lambda x: 0.5*(1/x)*np.exp(50*x) + 0.5*(1/x)*np.exp(-50*x)-1/x -9
    dfx = lambda x: -0.5*(1/(x**2))*(np.exp(50*x)+np.exp(-50*x)) + (25/x)*(np.exp(50*x)-np.exp(-50*x)) + 1/(x**2)
    
    # 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)
    
    TA = 12/xnuevo
    
    # para la gráfica
    xp = np.linspace(a,b,muestras)
    fp = fx(xp)
    
    # SALIDA
    print(['xi', 'xnuevo', 'tramo'])
    np.set_printoptions(precision = 4)
    for i in range(0,n,1):
        print(tabla[i])
    print('raiz en: ', xi)
    print('TA = 12/x = ', TA)
    
    # Grafica
    plt.plot(xp,fp)
    plt.xlabel('x=12/TA')
    plt.ylabel('f(x)')
    plt.axhline(0, color = 'green')
    plt.grid()
    plt.show()
    
  • 1Eva_IT2019_T1 Oxígeno y temperatura en agua

    1ra Evaluación I Término 2019-2020. 2/Julio/2019. MATG1013

    Tema 1. (40 puntos) La concentración de oxígeno disuelto a nivel del mar en agua dulce es función de la temperatura o(T)

    mapa mundi clima

    T (℃) 0 8 16 24 32 40
    o (mg/L) 14.6 11.5 9.9 8.4 7.3 6.4

    a) Con los siguientes datos, encuentre un modelo polinómico de grado 3 y estime la concentración para la temperatura de 15 grados y estime el error.

    b) Usando el polinomio del literal a, aproxime la derivada de la concentración de oxígeno en función de la temperatura en T = 16 grados.

    c) Usando el polinomio del literal a y el método de la bisección encuentre T cuando o=9 mg/L, con una tolerancia de 10-3

    Rúbrica: literal a, plantear polinomio (15 puntos), interpolar (5 puntos), literal b obtener derivada (5puntos), evaluar derivada (5 puntos) literal c, selección de rángo de búsqueda (3 puntos) desarrollo de al menos tres iteraciones (7 puntos)


    Nota: Todos los temas deben mostrar evidencia del desarrollo del método numérico planteado.

    tm = [0.,8,16,24,32,40]
    ox = [14.6,11.5,9.9,8.4,7.3,6.4]
    

    Referencia: Chapra 5ed, problema 19.15 p576, pdf600.  1Eva_IIT2014_T3 Oxigeno y temperatura en mar,
    http://blog.espol.edu.ec/analisisnumerico/1eva_iit2014_t3-oxigeno-y-temperatura-en-mar/.

    La "gigantesca" reserva de agua dulce hallada bajo el océano Atlántico (y qué esperanzas brinda para las zonas áridas del planeta). eluniverso.com 25/junio/2019.
    https://www.eluniverso.com/noticias/2019/06/25/nota/7394484/gigantesca-reserva-agua-dulce-hallada-bajo-oceano-atlantico-que

     

     

  • s1Eva_IT2019_T1 Oxígeno y temperatura en agua

    Ejercicio: 1Eva_IT2019_T1 Oxígeno y temperatura en agua

    Literal a

    Se requiere un polinomio de grado 3 siendo el eje x correspondiente a temperatura. Son necesarios 4 puntos de referencia alrededor de 15 grados, dos a la izquierda y dos a la derecha.

    Se observa que los datos en el eje x son equidistantes, h=8, y ordenados en forma ascendente, se cumple con los requisitos para usar diferencias finitas avanzadas. que tiene la forma de:

    p_n (x) = f_0 + \frac{\Delta f_0}{h} (x - x_0) + + \frac{\Delta^2 f_0}{2!h^2} (x - x_0)(x - x_1) + + \frac{\Delta^3 f_0}{3!h^3} (x - x_0)(x - x_1)(x - x_2) + \text{...}

    Tabla

    xi f[xi] f[x1,x0] f[x2,x1,x0] f[x2,x1,x0] f[x3,x2,x1,x0]
    8 11.5 9.9-11.5=
    -1.6
    -1.5-(-1.6) =
    0.1
    0.4-0.1=
    0.3
    ---
    16 9.9 8.4-9.9=
    -1.5
    -1.1-(1.5)=
    0.4
    --- ---
    24 8.4 7.3-8.4=
    -1.1
    --- --- ---
    32 7.3 --- --- --- ---

    Con lo que el polinomio buscado es:

    p_3 (x) = 11.5 + \frac{-1.6}{8} (x - 8) + + \frac{0.1}{2!8^2} (x - 8)(x - 16) + \frac{0.3}{3!8^3} (x - 8)(x - 16)(x - 24)

    Resolviendo y simplificando el polinomio, se puede observar que al aumentar el grado, la constante del término disminuye.

    p_3(x)=12.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3

    para el cálculo del error se puede usar un término adicional del polinomio, añadiendo un punto más a la tabla de diferencia finitas. Se evalúa éste término y se estima el error que dado que el término de grado 3 es del orden de 10-5, el error será menor. (Tarea)

    p_3(15)=12.9- 0.15 (15) - 0.00390625 (15)^2 + 0.00009765625 (15)^3

    Evaluando el polinomio en temperatura = 15:

    p3(15) = 10.1006835937500

    literal b

    se deriva el polinomio del literal anterior y se evalúa en 16:

    p'_3(x)=0- 0.15 - 0.00390625 (2) x + 0.00009765625 (3)x^2 p'_3(16)=0- 0.15 - 0.00390625 (2)(16) + 0.00009765625 (3)(16)^2

    p'3(16) = -0.20

    literal c

    El valor de oxígeno usado como referencia es 9, cuyos valores de temperatura se encuentran entre 16 y 24 que se toman como rango inicial de búsqueda [a,b]. Por lo que el polinomio se iguala a 9 y se crea la forma estandarizada del problema:

    p_3(x)=9 9 = 12.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3 12.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3 -9 = 0 f(x) = 3.9- 0.15 x - 0.00390625 x^2 + 0.00009765625 x^3

    Para mostrar el procedimiento se realizan solo tres iteraciones,

    1ra Iteración
    a=16 , b = 24, c = (16+24)/2 = 20
    f(a) = 0.9, f(b) = -0.6, f(c) = 0.011
    error = |24-16| = 8
    como f(c) es positivo, se mueve el extremo f(x) del mismo signo, es decir a

    2da Iteración
    a=20 , b = 24, c = (20+24)/2 = 22
    f(a) = 0.119, f(b) = -0.6, f(c) = -0.251
    error = |24-20|= 4
    como f(c) es negativo, se mueve el extremo f(x) del mismo signo, b

    3ra Iteración
    a=20 , b = 22, c = (20+22)/2 = 21
    f(a) = 0.119, f(b) = -0.251, f(c) = -0.068
    error = |22-20| = 2
    como f(c) es negativo, se mueve el extremo f(x) del mismo signo, b
    y así sucesivamente hasta que error< que 10-3

    Usando el algoritmo en python se obtendrá la raiz en 20.632 con la tolerancia requerida.


    Revisión de resultados

    Usando como base los algoritmos desarrollados en clase:

    oxigeno Temperatura p3

    tabla de diferencias finitas
    ['i', 'xi', 'fi', 'df1', 'df2', 'df3', 'df4']
    [[ 0.   8.  11.5 -1.6  0.1  0.3  0. ]
     [ 1.  16.   9.9 -1.5  0.4  0.   0. ]
     [ 2.  24.   8.4 -1.1  0.   0.   0. ]
     [ 3.  32.   7.3  0.   0.   0.   0. ]]
    dfinita:  [-1.6  0.1  0.3  0. ]
    11.5 +
    +( -1.6 / 8.0 )* ( x - 8.0 )
    +( 0.1 / 128.0 )*  (x - 16.0)*(x - 8.0) 
    +( 0.3 / 3072.0 )*  (x - 24.0)*(x - 16.0)*(x - 8.0) 
    polinomio simplificado
    9.8e-5*x**3 - 0.003923*x**2 - 0.149752*x + 12.898912
    Literal a
    9.8e-5*x**3 - 0.003923*x**2 - 0.149752*x + 12.898912
    p(15) =  10.1007070000000
    
    Literal b
    0.000294*x**2 - 0.007846*x - 0.149752
    dp(16) = -0.200024000000000
    método de Bisección
    i ['a', 'c', 'b'] ['f(a)', 'f(c)', 'f(b)']
       tramo
    0 [16, 20.0, 24] [ 0.9     0.1187 -0.6   ]
       4.0
    1 [20.0, 22.0, 24] [ 0.1187 -0.2509 -0.6   ]
       2.0
    2 [20.0, 21.0, 22.0] [ 0.1187 -0.0683 -0.2509]
       1.0
    3 [20.0, 20.5, 21.0] [ 0.1187  0.0246 -0.0683]
       0.5
    4 [20.5, 20.75, 21.0] [ 0.0246 -0.022  -0.0683]
       0.25
    5 [20.5, 20.625, 20.75] [ 0.0246  0.0013 -0.022 ]
       0.125
    6 [20.625, 20.6875, 20.75] [ 0.0013 -0.0104 -0.022 ]
       0.0625
    7 [20.625, 20.65625, 20.6875] [ 0.0013 -0.0045 -0.0104]
       0.03125
    8 [20.625, 20.640625, 20.65625] [ 0.0013 -0.0016 -0.0045]
       0.015625
    9 [20.625, 20.6328125, 20.640625] [ 0.0013 -0.0002 -0.0016]
       0.0078125
    10 [20.625, 20.62890625, 20.6328125] [ 0.0013  0.0006 -0.0002]
       0.00390625
    11 [20.62890625, 20.630859375, 20.6328125] [ 0.0006  0.0002 -0.0002]
       0.001953125
    12 [20.630859375, 20.6318359375, 20.6328125] [ 1.9762e-04  1.5502e-05 -1.6661e-04]
       0.0009765625
    raíz en:  20.6318359375
    

    Algoritmos Python usando la función de interpolación y un procedimiento encontrado en:

    Interpolación por Diferencias finitas avanzadas

    Método de la Bisección – Ejemplo con Python

    # 1Eva_IT2019_T1 Oxígeno y temperatura en mar
    import numpy as np
    import math
    import matplotlib.pyplot as plt
    import sympy as sym
    
    def interpola_dfinitasAvz(xi,fi, vertabla=False,
                           precision=6, casicero = 1e-15):
        '''Interpolación de diferencias finitas
        resultado: polinomio en forma simbólica,
        redondear a cero si es menor que casicero 
        '''
        xi = np.array(xi,dtype=float)
        fi = np.array(fi,dtype=float)
        n = len(xi)
        # revisa tamaños de paso equidistantes
        h_iguales = pasosEquidistantes(xi, casicero)
        if vertabla==True:
            np.set_printoptions(precision)
        # POLINOMIO con diferencias Finitas avanzadas
        x = sym.Symbol('x')
        polisimple = sym.S.Zero # expresión del polinomio con Sympy
        if h_iguales==True:
            tabla,titulo = dif_finitas(xi,fi,vertabla)
            h = xi[1] - xi[0]
            dfinita = tabla[0,3:]
            if vertabla==True:
                print('dfinita: ',dfinita)
                print(fi[0],'+')
            n = len(dfinita)
            polinomio = fi[0]
            for j in range(1,n,1):
                denominador = math.factorial(j)*(h**j)
                factor = np.around(dfinita[j-1]/denominador,precision)
                termino = 1
                for k in range(0,j,1):
                    termino = termino*(x-xi[k])
                if vertabla==True:
                    txt1='';txt2=''
                    if n<=2 or j<=1:
                        txt1 = '('; txt2 = ')'
                    print('+(',np.around(dfinita[j-1],precision),
                          '/',np.around(denominador,precision),
                          ')*',txt1,termino,txt2)
                polinomio = polinomio + termino*factor
            # simplifica multiplicando entre (x-xi)
            polisimple = polinomio.expand() 
        if vertabla==True:
            print('polinomio simplificado')
            print(polisimple)
        return(polisimple)
    
    def dif_finitas(xi,fi, vertabla=False):
        '''Genera la tabla de diferencias finitas
        resultado en: [título,tabla]
        Tarea: verificar tamaño de vectores
        '''
        xi = np.array(xi,dtype=float)
        fi = np.array(fi,dtype=float)
        # Tabla de Diferencias Finitas
        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 finitas 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('df'+str(j-2))
            # cada fila de columna
            i = 0
            while (i < diagonal):
                tabla[i,j] = tabla[i+1,j-1]-tabla[i,j-1]
                i = i+1
            diagonal = diagonal - 1
            j = j+1
        if vertabla==True:
            print('tabla de diferencias finitas')
            print(titulo)
            print(tabla)
        return(tabla, titulo)
    
    def pasosEquidistantes(xi, casicero = 1e-15):
        ''' Revisa tamaños de paso h en vector xi.
        True:  h son equidistantes,
        False: h tiene tamaño de paso diferentes y dónde.
        '''
        xi = np.array(xi,dtype=float)
        n = len(xi)
        # revisa tamaños de paso equidistantes
        h_iguales = True
        if n>3: 
            dx = np.zeros(n,dtype=float)
            for i in range(0,n-1,1): # calcula hi como dx
                dx[i] = xi[i+1]-xi[i]
            for i in range(0,n-2,1): # revisa diferencias
                dx[i] = dx[i+1]-dx[i]
                if dx[i]<=casicero: # redondea cero
                    dx[i]=0
                if abs(dx[i])>0:
                    h_iguales=False
                    print('tamaños de paso diferentes en i:',i+1,',',i+2)
            dx[n-2]=0
        return(h_iguales)
    
    # PROGRAMA ----------------
    
    # INGRESO
    tm = [0.,8,16,24,32,40]
    ox = [14.6,11.5,9.9,8.4,7.3,6.4]
    
    xi = [8,16,24,32]
    fi = [11.5,9.9,8.4,7.3]
    
    # PROCEDIMIENTO
    x = sym.Symbol('x')
    # literal a
    polinomio = interpola_dfinitasAvz(xi,fi, vertabla=True)
    p15 = polinomio.subs(x,15)
    # literal b
    derivap = polinomio.diff(x,1)
    dp16 = derivap.subs(x,16)
    
    px =  sym.lambdify(x,polinomio)
    xk = np.linspace(np.min(xi),np.max(xi))
    pk = px(xk)
    
    # SALIDA
    print('Literal a')
    print(polinomio)
    print('p(15) = ',p15)
    print('Literal b')
    print(derivap)
    print('dp(16) =', dp16)
    
    # gráfica
    plt.plot(tm,ox,'ro')
    plt.plot(xk,pk)
    plt.axhline(9,color="green")
    plt.xlabel('temperatura')
    plt.ylabel('concentracion de oxigeno')
    plt.grid()
    plt.show()
    
    # --------literal c ------------
    
    def biseccion(fx,a,b,tolera,iteramax = 20, vertabla=False, precision=4):
        '''
        Algoritmo de Bisección
        Los valores de [a,b] son seleccionados
        desde la gráfica de la función
        error = tolera
        '''
        fa = fx(a)
        fb = fx(b)
        tramo = np.abs(b-a)
        itera = 0
        cambia = np.sign(fa)*np.sign(fb)
        if cambia<0: # existe cambio de signo f(a) vs f(b)
            if vertabla==True:
                print('método de Bisección')
                print('i', ['a','c','b'],[ 'f(a)', 'f(c)','f(b)'])
                print('  ','tramo')
                np.set_printoptions(precision)
                
            while (tramo>=tolera and itera<=iteramax):
                c = (a+b)/2
                fc = fx(c)
                cambia = np.sign(fa)*np.sign(fc)
                if vertabla==True:
                    print(itera,[a,c,b],np.array([fa,fc,fb]))
                if (cambia<0):
                    b = c
                    fb = fc
                else:
                    a = c
                    fa = fc
                tramo = np.abs(b-a)
                if vertabla==True:
                    print('  ',tramo)
                itera = itera + 1
            respuesta = c
            # Valida respuesta
            if (itera>=iteramax):
                respuesta = np.nan
    
        else: 
            print(' No existe cambio de signo entre f(a) y f(b)')
            print(' f(a) =',fa,',  f(b) =',fb) 
            respuesta=np.nan
        return(respuesta)
    # se convierte forma de símbolos a numéricos
    buscar = polinomio-9
    fx = sym.lambdify(x,buscar)
    
    # INGRESO
    a = 16
    b = 24
    tolera = 0.001
    
    # PROCEDIMIENTO
    respuesta = biseccion(fx,a,b,tolera,vertabla=True)
    
    # SALIDA
    print('raíz en: ', respuesta)
    
  • 3Eva_IIT2018_T3 EDO d2y/dx2

    3ra Evaluación II Término 2018-2019. 12/Febrero/2018. MATG1013

    Tema 3. (40 puntos) Dada la ecuación, el intervalo de x, y las condiciones iniciales.

    y'' = 2y'-y +xe^{x} -x

    0 ≤ x ≤ 2
    y(0) = 0
    y(2) = -4

    a. Plantear el ejercicio usando las fórmulas en diferencias finitas para aproximar las soluciones en los nodos indicados con h = 0.25

    b. Estime el error

    c. Con los puntos calculados, construya el trazador cúbico natural

    Rúbrica: Plantear malla (5 puntos), plantear método (5 puntos), desarrollo de la ecuación (10 puntos), planteo del error (5 puntos), obtención del trazador (10 puntos)

  • 3Eva_IIT2018_T2 Drenar tanque cilíndrico

    3ra Evaluación II Término 2018-2019. 12/Febrero/2018. MATG1013

    Tema 2. (30 puntos) En un tanque cilíndrico vertical, al abrir una válvula en la base el agua fluirá rápidamente cuando el tanque esté lleno; conforme el tanque se vacía irá fluyendo más lentamente.

    Si la rapidez a la que disminuye el nivel del agua es:

    \frac{\delta y}{\delta t} = -k\sqrt{y}

    Donde k es una constante que depende del área de la sección transversal del tanque y del orificio de salida.

    La profundidad el agua "y" se mide en pies; y el tiempo t en minutos.

    Si k=0.5 e inicialmente el nivel del fluido es de 9 pies. ¿Cuál es el tiempo mínimo para que la altura del taque sea inferior a 6 pies?

    a. Utilice el método de Taylor de segundo orden para resolver este problema con h= 0.5 minutos

    b. Estime el error en cada paso.

    Rúbrica: Plantear el método (5 puntos), desarrollo de la ecuación (10 puntos), valor numérico (5 puntos), planteo del error(5 puntos), valor del error (5 puntos)

  • s3Eva_IIT2018_T2 Drenar tanque cilíndrico

    Ejercicio: 3Eva_IIT2018_T2 Drenar tanque cilíndrico

    La ecuación a desarrollar es:

    \frac{\delta y}{\delta t} = -k\sqrt{y}

    con valores de k =0.5, y(0)=9


    Formula de Taylor con término de error:

    P_{n}(x) = \sum_{k=0}^{n} \frac{f^{(k)}(x_0)}{k!} (x-x_0)^k P_{n}(x) = f(x_0)+\frac{f'(x_0)}{1!} (x-x_0) + + \frac{f''(x_0)}{2!}(x-x_0)^2 + + \frac{f'''(x_0)}{3!}(x-x_0)^3 + \text{...}

    Se requiere la 2da y 3ra derivadas:

    \frac{\delta^2 y}{\delta t^2} = -k\frac{1}{2} y^{(\frac{1}{2}-1)} = -\frac{k}{2} y^{-\frac{1}{2}} \frac{\delta^3 y}{\delta t^3} = -\frac{k}{2}\Big(-\frac{1}{2}\Big) y^{(-\frac{1}{2}-1)} = \frac{k}{4} y^{-\frac{3}{2}}

    con lo que inicia las iteraciones y cálculo del error, con avance de 0.5 para t.


    t=0 , y(0) = 9


    t = 0.5

    \frac{\delta y(0)}{\delta t} = -(0.5)\sqrt{9} = -1.5 \frac{\delta^2 y(0)}{\delta t^2} = -\frac{0.5}{2} 9^{-\frac{1}{2}} = - 0.08333 \frac{\delta^3 y(0)}{\delta t^3} = \frac{0.5}{4} 9^{-\frac{3}{2}} = 0.004628 P_{2}(0.5) = 9 - 1.5 (0.5-0) + \frac{-0.08333}{2}(0.5-0)^2 P_{2}(0.5) = 8.2395

    Error orden de:

    Error = \frac{0.004628}{3!}(0.5-0)^3 = 9.641 . 10^{-5}

    t = 1

    \frac{\delta y(0.5)}{\delta t} = -(0.5)\sqrt{8.2395} = -1.4352 \frac{\delta^2 y(0.5)}{\delta t^2} = -\frac{0.5}{2} (8.2395)^{-\frac{1}{2}} = - 0.08709 \frac{\delta^3 y(0.5)}{\delta t^3} = \frac{0.5}{4} (8.2395)^{-\frac{3}{2}} = 0.005285 P_{2}(1) = 8.2395 - 1.4352(1-0.5) + \frac{-0.08709}{2}(1-0.5)^2 P_{2}(1) = 7.5110

    Error orden de:

    Error = \frac{0.005285}{3!}(1-0.5)^3 = 4.404 . 10^{-4}

    t = 1.5

    \frac{\delta y(1)}{\delta t} = -(0.5)\sqrt{7.5110} = -1.3703 \frac{\delta^2 y(1)}{\delta t^2} = -\frac{0.5}{2} (7.5110)^{-\frac{1}{2}} = - 0.09122 \frac{\delta^3 y(1)}{\delta t^3} = \frac{0.5}{4} (7.5110)^{-\frac{3}{2}} = 0.006072 P_{2}(1.5) = 7.5110 - 1.3703(1.5-1) + \frac{-0.09122}{2}(1.5-1)^2 P_{2}(1.5) = 6.8144

    Error orden de:

    Error = \frac{0.006072}{3!}(1.5-1)^3 = 1.4 . 10^{-4}

    t = 2

    \frac{\delta y(1.5)}{\delta t} = -(0.5)\sqrt{6.8144} = -1.3052 \frac{\delta^2 y(1.5)}{\delta t^2} = -\frac{0.5}{2} (6.8144)^{-\frac{1}{2}} = - 0.09576 \frac{\delta^3 y(1.5)}{\delta t^3} = \frac{0.5}{4} (6.8144)^{-\frac{3}{2}} = 0.007026 P_{2}(2) = 6.8144 - 1.3052 (2-1.5) - \frac{0.09576}{2}(2-1.5)^2 P_{2}(2) = 6.1498

    Error orden de:

    Error = \frac{0.007026}{3!}(2-1.5)^3 = 1.4637 . 10^{-4}

    Se estima que el próximo término pasa debajo de 6 pies.
    Por lo que estima esperar entre 2 y 2.5 minutos.

    resultados usando el algoritmo:

    ti, p_i,  error
    [[0.00000000e+00 9.00000000e+00 0.00000000e+00]
     [5.00000000e-01 8.23958333e+00 9.64506173e-05]
     [1.00000000e+00 7.51107974e+00 1.10105978e-04]
     [1.50000000e+00 6.81451855e+00 1.26507192e-04]
     [2.00000000e+00 6.14993167e+00 1.46391550e-04]
     [2.50000000e+00 5.51735399e+00 1.70751033e-04]]
    

    Algoritmo en Python

    # 3Eva_IIT2018_T2 Drenar tanque cilíndrico
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    y0 = 9
    t0 = 0
    buscar = 6
    k = 0.5
    h = 0.5
    
    dy  = lambda t,y: -k*np.sqrt(y)
    d2y = lambda t,y: -(k/2)*(y**(-1/2))
    d3y = lambda t,y: (k/4)*(y**(-3/2))
    
    # PROCEDIMIENTO
    resultado = [[t0,y0,0]]
    yi = y0
    ti = t0
    while not(yi<buscar):
        ti = ti+h
        dyi = dy(ti,yi)
        d2yi = d2y(ti,yi)
        d3yi = d3y(ti,yi)
        p_i = yi +dyi*(h) + (d2yi/2)*(h**2)
        errado = (d3yi/6)*(h**3)
        yi = p_i
        resultado.append([ti,p_i,errado])
    resultado = np.array(resultado)
    
    # SALIDA
    print('ti, p_i,  error')
    print(resultado)
    
    # Grafica
    plt.plot(resultado[:,0],resultado[:,1])
    plt.ylabel('nivel de agua')
    plt.xlabel('tiempo')
    plt.grid()
    plt.show()
    
  • 3Eva_IIT2018_T1 Integral doble con Cuadratura de Gauss

    3ra Evaluación II Término 2018-2019. 12/Febrero/2018. MATG1013

    Tema 1. (30 puntos) Aproxime el resultado de la integral doble:

    \displaystyle \int_{0}^{\pi/4} \displaystyle\int_{\sin (x)}^{\cos (x)} \Big( 2y \sin(x) + \cos ^2 (x) \Big) \delta y \delta x

    a. Use el método de cuadratura de Gauss de dos términos en cada eje

    b. Determine el error al comparar el resultado numérico con el valor exacto.

    Rúbrica: Plantear el método (5 puntos), desarrollo (10 puntos), plantear el error (10 puntos), valor del error (5 puntos)