Autor: Edison Del Rosario

  • s1Eva_IIT2008_T1_MN Bacterias contaminantes

    Ejercicio: 1Eva_IIT2008_T1_MN Bacterias contaminantes

    a.  Planteamiento del problema

    estandarizar la fórmula a la forma f(x) = 0

    c = 70 e^{-1.5t} + 25 e^{-0.075t}

    el valor que debe tomar c = 9, por lo que la función a desarrollar se convierte en:

    9 = 70 e^{-1.5t} + 25 e^{-0.075t}

    y la que se usará en el algoritmo de búsqueda de raices es:

    70 e^{-1.5t} + 25 e^{-0.075t} -9 = 0 f(t) = 70 e^{-1.5t} + 25 e^{-0.075t} -9 = 0

    b. Intervalo de búsqueda [a,b]

    Como la variable t representa el tiempo, se inicia el análisis con cero por la izquierda o un poco mayor. a=0

    Para verificar que existe raíz se evalúa f(a) y f(b) buscando valores donde se presenten cambios de signo.

    La función depende de tiempo, por lo que a = 0, y b seleccionar un valor mayor.

    Para el caso de b,  si fuesen minutos, se pueden probar con valores considerando el tiempo que duraría un "experimento" en el laboratorio durante una clase. Por ejemplo 60 minutos, 30 minutos, etc, para obtener un punto "b" donde se garantice un cambio de signo f(a) y f(b)

    Para el ejemplo, se prueba con b = 15

    a = 0
    b = 15
    f(a) = f(0) = 70*e0 + 25 e0 -9 = 86
    f(b) = f(15) = 70*e-1.5*15. + 25 e-0.075*15 -9 = - 0.0036
    

    c. Número de iteraciones

    Calcular el número de iteraciones para llegar a la raíz con el error tolerado

    error = 0.001

    \frac{|15-0|}{2^n} = 0.001 15/0.001 = 2^n log(15/0.001) = nlog(2) n = \frac{log(15/0.001)}{log(2)} = 13.87 n = 14

    Verificando la selección usando una gráfica, usando 50 tramos entre [a,b] o 51 muestras en el intervalo.

    bacteriasLago02


    d. iteraciones

    Se encuentra la derivada f'(t) y se aplica el algoritmo Newton-Raphson con valor inicial cero.

    f(t) = 70 e^{-1.5t} + 25 e^{-0.075t} -9 = 0 f'(t) = 70(-1.5) e^{-1.5t} + 25(-0.075) e^{-0.075t}

    itera = 0 , t0=0

    f(0) = 70 e^{-1.5(0)} + 25 e^{-0.075(0)} -9 = 86 f'(0) = 70(-1.5) e^{-1.5(0)} + 25(-0.075) e^{-0.075(0)} =-106.875 t_1 = 0 - \frac{86}{-106.875} = 0.8047 errado = |0.8047- 0| = 0.8047

    itera = 1

    f(0.8047) = 70 e^{-1.5(0.8047)} + 25 e^{-0.075(0.8047)} -9 = 35.472 f'(0.8047) = 70(-1.5) e^{-1.5(0.8047)} + 25(-0.075) e^{-0.075(0.8047)} = -33.1694 x_2 = 0.8047 - \frac{35.472}{-33.1694} = 1.8741 errado = |1.8741-0.8047| = 1.0694

    itera = 2

    f(1.8741) = 70 e^{-1.5(1.8741)} + 25 e^{-0.075(1.8741)} -9 = 16.93146 f'(1.8741) = 70(-1.5) e^{-1.5(1.8741)} + 25(-0.075) e^{-0.075(1.8741)} = -7.9434 t_1 = 1.8741 - \frac{16.9314}{-7.9434} = 4.0056 errado = |4.0056 -1.8741| = 2.1315

    Se observa que el valor del error crece en cada iteración, por lo que si solo se hacen tres iteraciones, se concluye que el método No converge.
    Sin embargo con el algoritmo se observa que el método luego comienza a disminuir, por lo que se calcula hasta la iteración 7, obteniendo un error de 10-6 y una raíz en 13.62.

    El resultado final se lo encuentra al usar el algoritmo:

    método de Newton-Raphson
    i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
    0 [   0.       86.     -106.875     0.8047    0.8047]
    1 [  0.8047  35.472  -33.1694   1.8741   1.0694]
    2 [ 1.8741 16.9314 -7.9434  4.0056  2.1315]
    3 [ 4.0056  9.6848 -1.6465  9.8875  5.8819]
    4 [ 9.8875  2.9093 -0.8932 13.1445  3.257 ]
    5 [13.1445  0.3282 -0.6996 13.6136  0.4691]
    6 [ 1.3614e+01  5.7056e-03 -6.7543e-01  1.3622e+01  8.4474e-03]
    7 [ 1.3622e+01  1.8070e-06 -6.7500e-01  1.3622e+01  2.6771e-06]
    raiz en:  13.622016772385326
    

    Se usa el algoritmo en Python para encontrar el valor. El algoritmo Newton-Raphson mostrado es más pequeño que por ejemplo la bisección, pero requiere realizar un trabajo previo para encontrar la derivada de la función.

    Algoritmo en Python

    # 1Eva_IIT2008_T1_MN Bacterias contaminantes
    # Método de Newton-Raphson
    import numpy as np
    
    def newton_raphson(fx,dfx,xi, tolera, iteramax=100, vertabla=False, precision=4):
        '''
        fx y dfx en forma numérica lambda
        xi es el punto inicial de búsqueda
        '''
        itera=0
        tramo = abs(2*tolera)
        if vertabla==True:
            print('método de Newton-Raphson')
            print('i', ['xi','fi','dfi', 'xnuevo', 'tramo'])
            np.set_printoptions(precision)
        while (tramo>=tolera):
            fi = fx(xi)
            dfi = dfx(xi)
            xnuevo = xi - fi/dfi
            tramo = abs(xnuevo-xi)
            if vertabla==True:
                print(itera,np.array([xi,fi,dfi,xnuevo,tramo]))
            xi = xnuevo
            itera = itera + 1
    
        if itera>=iteramax:
            xi = np.nan
            print('itera: ',itera, 'No converge,se alcanzó el máximo de iteraciones')
    
        return(xi)
    
    
    # PROGRAMA ---------------------------------
    fx = lambda t: 70*(np.e**(-1.5*t)) +25*(np.e**(-0.075*t))-9
    dfx = lambda t: -70*1.5*(np.e**(-1.5*t)) -25*0.075*(np.e**(-0.075*t))
    
    # INGRESO
    x0 = 0
    tolera = 0.001
    
    # PROCEDIMIENTO
    raiz = newton_raphson(fx, dfx, x0, tolera, vertabla=True)
    
    # SALIDA
    print('raiz en: ', raiz)
    
    # GRAFICA
    import matplotlib.pyplot as plt
    a = 0
    b = 15
    muestras = 21
    
    xi = np.linspace(a,b,muestras)
    fi = fx(xi)
    plt.plot(xi,fi, label='f(x)')
    plt.axhline(0)
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.grid()
    plt.legend()
    plt.show()
    

    Tarea: Para el problema, realice varios métodos y compare el número de iteraciones y el trabajo realizado al plantear el problema al implementar cada uno.

  • s1Eva_IT2008_T1 Raíz de funcion(f)

    Ejercicio: 1Eva_IT2008_T1 Raíz de funcion(f)

    Pasos a Seguir usando: BISECCION

    1. Plantear la fórmula estandarizada f(x) = 0
    2. Seleccionar el rango de análisis [a,b] donde exista cambio de signo.
    3. Calcular el número de iteraciones para llegar a la raíz con el error tolerado
    4. Calcular la raíz:
      4.1 Solución manual en papel: Realizar la tabla que muestre las iteraciones del método:
      4.2 Solución usando el algoritmo: Usar el algoritmo para encontrar la raiz.

    1. Plantear la fórmula estandarizada f(x) = 0

    \sqrt{f} . ln \Big( R\frac{\sqrt{f}}{2.51} \Big) - 1.1513 = 0

    La función depende de la variable f, por lo que por facilidad de trabajo se cambiará a x para no ser confundida con una función f(x).
    El valor de R también se reemplaza con R=5000 como indica el problema.
    El error tolerado para el problema es de 0.00001

    \sqrt{x} . ln \Big( 5000\frac{\sqrt{x}}{2.51} \Big) - 1.1513 = 0

    2. Seleccionar el rango de análisis [a,b] donde exista cambio de signo

    La función tiene un logaritmo, por lo que no será posible iniciar con cero, sin o con  valor un poco mayor a=0.01. Para el límite superior se escoge para prueba b=2. y se valida el cambio de signo en la función.

    >>> import numpy as np
    >>> fx = lambda x: np.sqrt(x)*np.log((5000/2.51)*np.sqrt(x))-1.1513
    >>> fx(0.01)
    -0.62186746547214999
    >>> fx(2)
    10.082482845673042
    

    validando el rango por cambio de signo en la función [0.01 ,2]

    3. Calcular el número de iteraciones para llegar a la raíz con el error tolerado

    error = 0.00001

    \frac{|2-0.01|}{2^n} = 0.001 1.99/0.00001 = 2^n log(1.99/0.00001) = nlog(2) n = \frac{log(1.99/0.00001)}{log(2)} = 17.6 n = 18

    4. Calcular la raíz:

    Usando el algoritmo se encuentra que la raiz está en:

    raiz:  0.0373930168152
    f(raiz) =  -2.25294254252e-06
    

    Primeras iteraciones de la tabla resultante:

     
    a,b,c, fa, fb, fc, error
    [[  1.00000000e-02   2.00000000e+00   1.00500000e+00  -6.21867465e-01
        6.46707903e+00   6.46707903e+00   1.99000000e+00]
     [  1.00000000e-02   1.00500000e+00   5.07500000e-01  -6.21867465e-01
        4.01907320e+00   4.01907320e+00   9.95000000e-01]
     [  1.00000000e-02   5.07500000e-01   2.58750000e-01  -6.21867465e-01
        2.36921961e+00   2.36921961e+00   4.97500000e-01]
     [  1.00000000e-02   2.58750000e-01   1.34375000e-01  -6.21867465e-01
        1.26563722e+00   1.26563722e+00   2.48750000e-01]
     [  1.00000000e-02   1.34375000e-01   7.21875000e-02  -6.21867465e-01
        5.36709904e-01   5.36709904e-01   1.24375000e-01]
     [  1.00000000e-02   7.21875000e-02   4.10937500e-02  -6.21867465e-01
        6.51903790e-02   6.51903790e-02   6.21875000e-02]
    ...
    

    el número de iteraciones es filas-1 de la tabla

    >>> len(tabla)
    19
    

    con lo que se comprueba los resultados.

  • 1Eva_IIIT2007_T3 Factorar polinomio

    1ra Evaluación III Término 2007-2008. 3/Marzo/2008. ICM00158

    Tema 3. Se requiere factorar el polinomio:

    P_3(x) = 2x^3-5x^2 + 3x-0.1 P_3(x) = (x - r_1)(x - r_2)(x - r_3)

    Utilizando el siguiente procedimiento:

    a. Calcule r1 resolviendo P3(x) = 0 con Newton, ε = 0.0001

    b. Obtenga el polinomio cociente Q2(x), a partir de P3(x) = (x - r1)Q2(x)

    c. Calcule r2 y r3 de la ecuación Q2(x) = 0

    d. Escriba los otros factores de Q2(x) = (x - r2)(x - r3)


    Observe la gráfica del problema para la solución

    factorar polinomio 01

  • 1Eva_IIIT2007_T2 Función Cobb-Douglas

    1ra Evaluación III Término 2007-2008. 3/Marzo/2008. ICM00158

    Tema 2. La función de producción llamada Cobb-Douglas relaciona funcionalmente a los insumos de capital y trabajo necesarios para producir de la manera más óptima de una determinada cantidad de un bien.Fabrica Produccion Cobb-Douglas

    Y = f(K,L) es la cantidad máxima del bien que se puede producir dados los insumos utilizados de capital y trabajo. K y L representan las cantidades de capital y trabajo respectivamente.

    En la industria de lácteos se han observado los siguientes valores óptimos de producción Y (en miles de Kg) para diferentes valores de L (número de trabajadores)  y capital invertido K (en miles de dólares).

     L\K (miles $) 10 20 30 40
    0 0 0 0 0
    10 11.0000 13.0813 14.4768 15.5563
    20 18.4997 22.0000 24.3470 26.1626
    30 25.0746 29.8189 33.0000 35.4608

    a. Determinar usando el polinomio de interpolación de Lagrange,

    Cobb Douglas 3D¿cuál será la producción óptima de lácteos en una empresa que emplea 25 trabajadores y que invierte un capital de $ 25000 en el plan de producción?

     

    b.  Una empresa que tiene 25 trabajadores desea producir 30000 Kg de lácteos. ¿cuánto dinero deberá invertir?, use el polinomio de interpolación y el método de Newton-Raphson con una precisión de 10-5


    a.1 Plantear y Desarrollar las expresiones de al menos dos polinomios de Lagrange por filas de la tabla. Los demás puede completar con el algoritmo.

    a.2 Use el resultado de cada polinomio para evaluar con K=25. Con los datos de la columna K=25, genere un nuevo polinomio p(K=25)(L) para usarlo para encontrar el valor de Y con L=25.

    b.1 Realice el planteamiento del ejercicio,  para L= 25, es decir ahora por columnas y obtenga el polinomio p(L=25)(K).

    b.2 Plantear usando el polinomio Y(K) = p(L=25)(K) con el método de Newton-Raphson, que encuentre el valor de inversión K para una producción Y.

    b.3 Desarrolle las expresiones para tres iteraciones.

    b.4 Analice la convergencia del método.

    Adjunte sus algoritmos.py, resultados.txt y gráficas.png.

    Rúbrica: literal a.1 (10 puntos), literal a.2 (5 puntos)m literal b.1 (5 puntos), b.2(5 puntos), b.3 (5 puntos)

    Referencia: Wikipedia/Cobb-Douglas

    # INGRESO
    M = [[ 0,       0,       0,       0     ],
         [11.0000, 13.0813, 14.4768, 15.5563],
         [18.4997, 22.0000, 24.3470, 26.1626],
         [25.0746, 29.8189, 33.0000, 35.4608]]
    li = [0, 10, 20, 30]
    kj = [10, 20, 30, 40]
    
    l_busca = 25 # trabajadores
    k_busca = 25 # inversion en miles de $
    
  • 1Eva_IIIT2007_T1 Container: Cocinas y Refrigeradoras

    1ra Evaluación III Término 2007-2008. 3/Marzo/2008. ICM00158

    Tema 1. En un container se transportaron cocinas y refrigeradoras.

    container en montacarga
    Cada cocina pesa 100Kg y cada refrigeradora 200Kg.

    Por otro lado, una cocina ocupa un espacio de 1.05 m3 y cada refrigeradora 2 m3.

    En total entre cocinas y refrigeradoras se registró un peso de 1000Kg y ocuparon juntas un espacio de 10.4 m3.

    dibujo refrigeradora y cocinaSe desea conocer cuántas cocinas y refrigeradoras se transportó en el container.

    a. Plantear este problema como el de un sistema de ecuaciones y resolverlo con un método directo (Gauss), usar aritmética de 4 dígitos.

    b. El encargado de transporte se equivocó, y en realidad cada cocina ocupa un espacio de 1.1 m3. Encuentre nuevamente la solución.

    c. El sistema de ecuaciones usado ¿Es bien o mal condicionado?


  • 1Eva_IIT2007_T3 Interpolación inversa, encontrar xi para fi dado

    1ra Evaluación II Término 2007-2008. 4/Diciembre/2007.
    ICM00158

    Tema 3. Dado los datos de una función:

    f(0.50) = 1.648
    f(0.65) = 1.915
    f( x  ) = 2.117
    f(0.80) = 2.225
    f(0.95) = 2.5857

    Determinar el valor de x, usando interpolación inversa.

    interpola inversa


    xi = [0.50 , 0.65 , x, 0.80 , 0.95  ]
    fi = [1.648, 1.915, 2.117, 2.225, 2.5857]
    

    a. Plantear el ejercicio describiendo los criterios a usar para el polinomios para el eje y.

    b. Desarrolle el método sobre los puntos seleccionados con las expresiones completas desarrolladas con el algoritmo.

    c. Presentar el polinomio resultante y la gráfica usando la resolución requerida para el estudio.

    d. Adjunte los archivos: algoritmos.py, resultados.txt y gráfica.png del polinomio.

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

  • 1Eva_IIT2007_T2 Aplicar Gauss-Seidel 6x6

    1ra Evaluación II Término 2007-2008. 4/Diciembre/2007. ICM00158

    Tema 2. Dadas las matrices:

    A = [[7.63, 0.30, 0.15,  0.50, 0.34, 0.84],
         [0.38, 6.40, 0.70,  0.90, 0.29, 0.57],
         [0.83, 0.19, 8.33,  0.82, 0.34, 0.37],
         [0.50, 0.68, 0.86, 10.21, 0.53, 0.70],
         [0.71, 0.30, 0.85,  0.82, 5.95, 0.55],
         [0.43, 0.54, 0.59,  0.66, 0.31, 9.25]]
    
    B = [ -9.44, 25.27, -48.01, 19.76, -23.63, 62.59]

    a) Escribir los sistemas AX=B y X=TX+C

    b) Determine ||A||, y ||T||

    c) Establezca la solución con el método de Gauss-Seidel con una tolerancia de 10-5

  • 1Eva_IIT2007_T1 Distribución Binomial acumulada

    1ra Evaluación II Término 2007-2008. 4/Diciembre/2007. ICM00158

    Tema 1. Un modelo de uso frecuente en teoría de probabilidad es la distribución binomial acumulada, cuya fórmula es:

    F = \sum_{t=0}^{k} \binom{n}{t} p^t (1-p)^{n-t}

    Con la fórmula de Newton-Raphson, calcule con cuatro decimales exactos el valor de p tal que F=0.4, dado que n=5 y k=1

    Nota: El valor de p debe ser un número real entre 0 y 1


    a. Plantear el ejercicio para encontrar h para un t dado, muestre el intervalo de búsqueda y una gráfica.

    b. Desarrolle usando el método de Newton-Raphson para tres iteraciones y tolerancia milimétrica.

    c. Verifique el orden de convergencia y observe sus resultados usando el algoritmo.

    Rúbrica: Planteamiento (5 puntos), iteraciones y error (15 puntos), análisis de la convergencia (5 puntos). observación de resultados, algoritmo y gráficas adjuntos (5 puntos).

  • s1Eva_IIIT2007_T3 Factorar polinomio

    Ejercicio: 1Eva_IIIT2007_T3 Factorar polinomio

    Para factorar el polinomio:

    P_3(x) = 2 x^3 - 5 x^2 + 3 x - 0.1

    Se realiza la gráfica para observar los intervalos de búsqueda de raíces.factorar polinomio 01

    Para la solución con Newton-Raphson se plantea f(x)=0

    2x^3-5x^2 + 3x - 0.1 = 0 f(x) = 2x^3-5x^2 + 3x - 0.1 f'(x) =6x^2-10x + 3 x_{i+1} = x_i -\frac{f(x_i)}{f'(x_i)}

    Para la primera raíz a la izquierda, se usa x0 = 0

    itera = 0

    f(0) = 2(0)^3-5(0)^2 + 3(0) - 0.1 = - 0.1 f'(0) =6(0)^2-10(0) + 3 = 3 x_{1} = 0 -\frac{- 0.1}{3} = 0.03333 error = |0.03333 -0| = 0.03333

    itera = 1

    f(0.0333) = 2(0.0333)^3-5(0.0333)^2 + 3(0.0333) - 0.1 = -0.0054815 f'(0.0333) =6(0.0333)^2-10(0.0333) + 3 = 2.6733 x_{2} = 0.0333 -\frac{-0.0054815}{2.6733} = 0.035384 error = |0.035384 - 0.03333| = 0.0020504

    itera = 2

    f(0.035384) = 2(0.035384)^3-5(0.035384)^2 + 3(0.035384) - 0.1 = -0.000020163 f'(0.035384) =6(0.035384)^2-10(0.035384) + 3 = 2.6537 x_{3} = 0.0333 -\frac{-0.000020163}{2.6537} = 0.035391 error = |0.035391 - 0.035384| = 0.0000075982

    como el error es del orden de 10-6 que es menor que tolera de 10-5 se considera la raíz encontrada.

    raíz en: 0.03539136103889022

    los resultados con el algoritmo son:

    i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
    0 [ 0.     -0.1     3.      0.0333  0.0333]
    1 [ 3.3333e-02 -5.4815e-03  2.6733e+00  3.5384e-02  2.0504e-03]
    2 [ 3.5384e-02 -2.0163e-05  2.6537e+00  3.5391e-02  7.5982e-06]
    raíz en:  0.03539136103889022

    para raíz cerca de 1

    i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
    0 [ 1.  -0.1 -1.   0.9  0.1]
    1 [ 0.9    0.008 -1.14   0.907  0.007]
    2 [ 9.0702e-01  2.0390e-05 -1.1341e+00  9.0704e-01  1.7979e-05]
    raíz en:  0.9070355226186211

    para raíz cercana a 1.5

    i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
    0 [ 1.5    -0.1     1.5     1.5667  0.0667]
    1 [1.5667 0.0184 2.06   1.5577 0.0089]
    2 [1.5577e+00 3.4849e-04 1.9820e+00 1.5576e+00 1.7583e-04]
    3 [1.5576e+00 1.3436e-07 1.9805e+00 1.5576e+00 6.7843e-08]
    raíz en:  1.557573116112315

    Instrucciones en Python

    # 1ra Eval III Término 2007
    # Tema 3. Factorar polinomio
    import numpy as np
    import matplotlib.pyplot as plt
    
    def newton_raphson(fx,dfx,xi, tolera, iteramax=100, vertabla=False, precision=4):
        '''
        fx y dfx en forma numérica lambda
        xi es el punto inicial de búsqueda
        '''
        itera=0
        tramo = abs(2*tolera)
        if vertabla==True:
            print('método de Newton-Raphson')
            print('i', ['xi','fi','dfi', 'xnuevo', 'tramo'])
            np.set_printoptions(precision)
        while (tramo>=tolera):
            fi = fx(xi)
            dfi = dfx(xi)
            xnuevo = xi - fi/dfi
            tramo = abs(xnuevo-xi)
            if vertabla==True:
                print(itera,np.array([xi,fi,dfi,xnuevo,tramo]))
            xi = xnuevo
            itera = itera + 1
    
        if itera>=iteramax:
            xi = np.nan
            print('itera: ',itera, 'No converge,se alcanzó el máximo de iteraciones')
    
        return(xi)
    
    # Literal a)
    fx = lambda x: 2*x**3 - 5*x**2 + 3*x -0.1
    dfx = lambda x: 6*x**2 - 10*x +3
    # Literal b)
    #fx =  lambda x: (2*x**3 - 5*x**2 + 3*x -0.1)/(x-0.03539136103889022)
    #dfx = lambda x: (6*x**2 - 10*x + 3)/(x - 0.0353913610388902) - (2*x**3 - 5*x**2 + 3*x - 0.1)/(x - 0.0353913610388902)**2
    
    x0 = 0
    tolera = 0.0001
    
    # PROCEDIMIENTO
    respuesta = newton_raphson(fx,dfx,x0, tolera, vertabla=True)
    
    # SALIDA
    print('raíz en: ', respuesta)
    
    # simplificando el polinomio
    import sympy as sym
    x = sym.Symbol('x')
    p = 2*x**3 - 5*x**2 + 3*x -0.1
    Q2 = p/(x-respuesta)
    dQ2 = sym.diff(Q2,x,1)
    print('Q2')
    print(Q2)
    print('dQ2')
    print(dQ2)
    
    
    # grafica
    a = 0
    b = 2
    muestras = 21
    xi = np.linspace(a,b, muestras)
    fi = fx(xi)
    plt.plot(xi,fi, label='P(x)')
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.title('P3(x)')
    plt.axhline(0)
    plt.grid()
    plt.show()
    

    literal b

    Obtenga el polinomio cociente Q2(x), a partir de P3(x) = (x – r1)Q2(x)

    Se simplifica el polinomio realizando la división:

    Q_2(x) = \frac{2 x^3 - 5 x^2 + 3 x - 0.1}{x-0.03539136103889022} Q'_2(x) = \frac{ 6 x^2 - 10 x + 3}{x - 0.0353913610388902} - \frac{2 x^3 - 5 x^2 + 3 x - 0.1}{(x - 0.0353913610388902)^2}

    Se reutiliza el algoritmo usando las nuevas expresiones

    # Literal b)
    # PROCEDIMIENTO
    fx =  lambda x: (2*x**3 - 5*x**2 + 3*x -0.1)/(x-raiz1)
    dfx = lambda x: (6*x**2 - 10*x + 3)/(x - 0.0353913610388902) - (2*x**3 - 5*x**2 + 3*x - 0.1)/(x - 0.0353913610388902)**2
    

    la derivada se puede obtener usando la librería Sympy, con las instrucciones:

    # simplificando el polinomio
    import sympy as sym
    x = sym.Symbol('x')
    p = 2*x**3 - 5*x**2 + 3*x -0.1
    Q2 = p/(x-respuesta)
    dQ2 = sym.diff(Q2,x,1)
    print('Q2')
    print(Q2)
    print('dQ2')
    print(dQ2)
    

    Usando los resultados de Q2(x) y actualizando las expresiones para f(x) y f'(x) se obtienen los siguientes resultados, que verifican las raíces encontradas en el literal a.

    i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
    0 [ 0.      2.8255 -4.9292  0.5732  0.5732]
    1 [ 0.5732  0.6572 -2.6363  0.8225  0.2493]
    2 [ 0.8225  0.1243 -1.6392  0.8983  0.0758]
    3 [ 0.8983  0.0115 -1.336   0.9069  0.0086]
    4 [ 9.0692e-01  1.4809e-04 -1.3015e+00  9.0704e-01  1.1379e-04]
    5 [ 9.0704e-01  2.5894e-08 -1.3011e+00  9.0704e-01  1.9902e-08]
    raíz en:  0.9070355227446406
    

    La gráfica obtenida para Q2(x) es:

    factorar polinomio Q2(x)


    literal c

    La otra raíz cercana a 1.5 se calcula a partir de Q2(x) usando el algoritmo.

    i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
    0 [ 1.5    -0.0683  1.0708  1.5638  0.0638]
    1 [1.5638 0.0081 1.3258 1.5576 0.0061]
    2 [1.5576e+00 7.5234e-05 1.3013e+00 1.5576e+00 5.7814e-05]
    raíz en:  1.5575731212503858

    literal d

    El polinomio:

    P_3(x) = 2 x^3 - 5 x^2 + 3 x - 0.1

    se expresa también formado como parte de sus raíces:

    P_3(x) = (x - 0.0353913)(x - 0.907035 )(x -1.557573 )
  • s1Eva_IIIT2007_T2 Función Cobb-Douglas

    Ejercicio: 1Eva_IIIT2007_T2 Función Cobb-Douglas

    [ a1 interpola filas ] [a2 interpola punto Y] [ b1 interpola columnas ] [ b2 raíz Newton-Raphson]  [ Algoritmo ]
    ..


    literal a.1 Interpola tabla por filas

    Se usa la tabla para plantear los polinomios usando los datos de cada fila. Se evalúa el polinomio con el valor de K=25 (en miles) para completar los datos de la columna K=25

     L\K (miles $) 10 20 25 30 40
    0 0 0 0 0
    10 11.0000 13.0813 14.4768 15.5563
    20 18.4997 22.0000 24.3470 26.1626
    25 Y
    30 25.0746 29.8189 33.0000 35.4608

    Para la fila L=0 no es necesario realizar un polinomio, pues se observa que para 0 trabajadores la producción es nula, no existe producción p(K)=0  y pK(25)=0.

    Para la fila L=10, se disponen de 4 puntos, por lo que se plantea un polinomio de grado 3:

    P_{L10}(K) = 11\frac{(K-20)(K-30)(K-40)}{(10-20)(10-30)(10-40)} + + 13.0813\frac{(K-10)(K-30)(K-40)}{(20-10)(20-30)(20-40)} + + 14.4768\frac{(K-10)(K-20)(K-40)}{(30-10)(30-20)(30-40)} + + 15.5563\frac{(k-10)(k-20)(k-30)}{(40-10)(40-20)(40-30)}

    Con el algoritmo se simplifica la expresión:

    P_{L10}(K) =0.0000616335 K^3 - 0.0071269*K^2 + 0.378796 K + 7.8630

    Se evalúa el polinomio con K=25

    P_{L10}(K) =0.0000616335 (25)^3 - 0.0071269*(25)^2 + 0.378796 (25) + 7.8630 P_{L10}(25) = 13.84166

    Se observan los resultados encontrados en la primera gráfica:

    Cobb Douglas

    Se continua el ejercicio usando los algoritmos para encontrar los polinomios de Lagrange obteniendo:

     **** literal a:
    Polinomio de Lagrange por fila de L
    fila: 0 , li[fila]: 0  , polinomio pk :
    0
     pk[25]: 0
    ___
    fila: 1 , li[fila]: 10  , polinomio pk :
                         3                        2                               
    6.16333333333342e-5*K  - 0.00712699999999999*K  + 0.378796666666668*K + 7.86309999999999
     pk[25]: 13.8416625000000
    ___
    fila: 2 , li[fila]: 20  , polinomio pk :
                          3              2                                
    0.000103649999999999*K  - 0.0119855*K  + 0.637039999999995*K + 13.2242
     pk[25]: 23.2787937499999
    ___
    fila: 3 , li[fila]: 30  , polinomio pk :
                         3                       2                                
    0.00014048333333333*K  - 0.0162449999999998*K  + 0.863441666666663*K + 17.9242
     pk[25]: 31.5521687500000
    ___
     Datos para el polinomio de L
    li:
    [ 0 10 20 30]
    k_buscado:
    [0, 13.8416625000000, 23.2787937499999, 31.5521687500000]
    

    [ a1 interpola filas ] [a2 interpola punto Y] [ b1 interpola columnas ] [ b2 raíz Newton-Raphson]  [ Algoritmo ]

    ..


    literal a.2 Interpola un punto en Y con K=25

    Con los datos obtenidos se genera el siguiente polinomio P(L), que corresponde a la parte derecha de la gráfica mostrada.

    P_{k=25}(L) = 0\frac{(L-10)(L-20)(L-30)}{(0-10)(0-20)(0-30)} + + 13.84166\frac{(L-0)(L-20)(L-30)}{(10-0)(10-20)(10-30)} + + 23.27879\frac{(L-0)(L-10)(L-30)}{(20-0)(20-10)(20-30)} + + 31.55216\frac{(L-0)(L-10)(L-20)}{(30-0)(30-10)(30-20)}

    simplificando con el algoritmo se tiene:

    P_{k=25}(L) = 00.00054012 L^3 - 0.038226 L^2 + 1.71241 L

    evaluando el polinomio con L=25

    P_{k=25}(L) = 00.00054012 (25)^3 - 0.038226 (25)^2 + 1.71241 (25) P_{k=25}(L) = 27.358402

    Con los datos obtenidos se realiza la gráfica en 3D marcando los puntos calculados con los polinomios.

    Cobb Douglas Y[L,K]

    [ a1 interpola filas ] [a2 interpola punto Y] [ b1 interpola columnas ] [ b2 raíz Newton-Raphson]  [ Algoritmo ]

    ..


    literal b.1 Interpola tabla por columnas

     L\K (miles $) 10 20 K=? 30 40
    0 0 0 0 0
    10 11.0000 13.0813 14.4768 15.5563
    20 18.4997 22.0000 24.3470 26.1626
    25 Y=30
    30 25.0746 29.8189 33.0000 35.4608

    Se repite el ejercicio del literal a, con el mismo algoritmo para no rescribir todo por las filas por columnas. En el algoritmo se intercambian las filas por columnas y se transpone la matriz.

    # INGRESO 
    
    ...
    # Se intercambian los valores de fila columna para repetir el algoritmo
    # obteniendo Y(L=25,k)
    M = np.transpose(M)
    kj = [0, 10, 20, 30]
    li = [10, 20, 30, 40]
    
    l_busca = 25 # trabajadores
    k_busca = 25 # inversión en miles de $
    

    Se ajustan las etiquetas de las gráficas y se obtiene el polinomio a usar, que es la producción Y(k) para un capital K dado:

    Y(K) = P_{L=25}(K) = 
    0.000121812500000016*K**3 - 0.0140857812500013*K**2 +
     0.748676562500027*K + 15.5417812499999
    Y(K) = 0.00012181 K^3 - 0.014085 K^2 + 0.74867 K + 15.54178

    [ a1 interpola filas ] [a2 interpola punto Y] [ b1 interpola columnas ] [ b2 raíz Newton-Raphson]  [ Algoritmo ]

    ..


    literal b.2 raíz con Newton-Raphson

    Para el algoritmo de Newton- Raphson, el ejercicio se plantea igualando el polinomio al valor buscado de producción Y=30. Se escribe luego la expresión en como f(x)=0 y f'(x):.

    0.00012181 K^3 - 0.014085 K^2 + 0.74867 K + 15.54178 = 30 f(K) = 0.00012181 K^3 - 0.014085 K^2 + 0.74867 K + 15.54178 - 30 f'(K) = 0.0001218(3) K^2 - 0.014085(2) K+ 0.74867 f'(K) = 0.00036543 K^2 - 0.02817 K+ 0.74867

    Usando la gráfica se inicia con K0=30, por ser el valor mas cercano de los puntos conocidos a Y=30, se obtienen los siguientes resultados:

    itera = 0

    f(30) = 0.00012181 (30)^3 - 0.014085 (30)^2 + 0.74867 (30) + + 15.54178 - 30 = -1.3862 f'(30) = 0.00036543 (30)^2 - 0.02817 (30)+ 0.74867 = 0.2325 K_{1} = 30 -\frac{-1.3862}{0.2325} = 35.963 errado = |35.963 -30| = 5.963

    itera = 1

    f(35.963) = 0.00012181 (35.963)^3 - 0.014085 (35.963)^2 + + 0.74867 (35.963) + 15.54178 - 30 = -0.0854 f'(35.963) = 0.00036543 (35.963)^2 - 0.02817 (35.963) + 0.74867 = 0.2082 K_{2} = 35.963 -\frac{-0.0854}{0.2082} = 36.3734 errado = |36.3734 -35.963| = 0.4104

    itera = 2

    f( 36.3734) = 0.00012181 ( 36.3734)^3 - 0.014085 ( 36.3734)^2 + + 0.74867 ( 36.3734) + 15.54178 - 30 = -0.00016955 f'( 36.3734) = 0.00036543 ( 36.3734)^2 - 0.02817 ( 36.3734)+ + 0.74867 = 0.20751 K_{3} = 36.3734 -\frac{-0.00016955}{0.20751} = 36.374 errado = |36.374 - 36.3734| = 0.00081705

    Se observa que el error disminuye en cada iteración, por lo que el método converge.

    Se sigue con las iteraciones usando el algoritmo:

    método de Newton-Raphson
    i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
    0 [30.     -1.3862  0.2325 35.963   5.963 ]
    1 [35.963  -0.0854  0.2082 36.3734  0.4104]
    2 [ 3.6373e+01 -1.6955e-04  2.0751e-01  3.6374e+01  8.1705e-04]
    3 [ 3.6374e+01 -3.8858e-08  2.0751e-01  3.6374e+01  1.8726e-07]
    raíz en:  36.3742052500759
    

    Se encuentra la raíz en 36.3741, que corresponde a una inversión K un poco mas de 36 mil dólares para una producción Y de 30 mil unidades.

    Cobb Douglas K para Y-30[ a1 interpola filas ] [a2 interpola punto Y] [ b1 interpola columnas ] [ b2 raíz Newton-Raphson]  [ Algoritmo ]

    ..


    Instrucciones en Python. literal a

    #1Eva_IIIT2007_T2 Función Cobb-Douglas
    # Interpolacion de Lagrange
    import numpy as np
    import matplotlib.pyplot as plt
    import sympy as sym
    
    def interpola_lagrange(xi,yi):
        '''
        Interpolación con método de Lagrange
        resultado: polinomio en forma simbólica
        '''
        # PROCEDIMIENTO
        n = len(xi)
        x=sym.Symbol('x')
        # Polinomio
        polinomio = 0*x # inicializa con cero
        for i in range(0,n,1):
            # Termino de Lagrange
            termino = 1
            for j  in range(0,n,1):
                if (j!=i):
                    termino = termino*(x-xi[j])/(xi[i]-xi[j])
            polinomio = polinomio + termino*yi[i]
        # Expande el polinomio
        polinomio = polinomio.expand()
        return(polinomio)
    
    # INGRESO
    M = [[ 0,       0,       0,       0     ],
         [11.0000, 13.0813, 14.4768, 15.5563],
         [18.4997, 22.0000, 24.3470, 26.1626],
         [25.0746, 29.8189, 33.0000, 35.4608]]
    li = [0, 10, 20, 30]
    kj = [10, 20, 30, 40]
    
    l_busca = 25 # trabajadores
    k_busca = 25 # inversion en miles de $
    
    # PROCEDIMIENTO
    M = np.array(M)
    tamano = np.shape(M)
    n = tamano[0]
    m = tamano[1]
    x,K,L = sym.symbols('x,K,L')
    
    # Literal a.1 Interpola polinomio pk
    # por fila de trabajadores L
    # evalua en k_busca, inversiones en miles
    poli_fila = []
    pk_columna =[]
    for fila in range(0,n,1):
        pk = interpola_lagrange(kj,M[fila,:])
        pk = pk.subs(x,K)
        poli_fila.append(pk)
        pk_busca = poli_fila[fila].subs(K,k_busca)
        pk_columna.append(pk_busca)
    
    # Interpola un polinomio en columna de inversiones pk_columna
    # evalua en l_busca
    pkl_busca = interpola_lagrange(li,pk_columna)
    pkl_busca = pkl_busca.subs(x,L)
    Ykl_busca = pkl_busca.subs(L,l_busca)
    
    # SALIDA
    np.set_printoptions(precision=4)
    print(' **** literal a:')
    print('___ Polinomio por fila de trabajadores L')
    for fila in range(0,n,1):
        print(fila,', L['+str(fila)+']=',li[fila], ', pk(K) :')
        print(poli_fila[fila])
        print(' pk['+str(k_busca)+']:',pk_columna[fila])
        print('___')
    print('\n Datos para el polinomio de L')
    print('     Li: ',li)
    print('k_busca: ',pk_columna)
    print('Polinomio p(L):')
    print(pkl_busca)
    print('Y[l_busca,k_busca]: ',Ykl_busca)
    
    # Grafica de P(k) por cada L
    muestras = 20
    xk = np.linspace(min(kj),max(kj),muestras)
    
    plt.subplot(121)
    for fila in range(0,n,1):
        pk = poli_fila[fila]
        if pk.has(K):
            pk_lambda = sym.lambdify(K,pk)
            pkx = pk_lambda(xk)
        else:
            nk = len(xk)
            pkx = np.ones(nk)*float(pk)
        plt.plot(xk,pkx, label='pk(K);li='+str(li[fila]))
        plt.plot(k_busca,pk_columna[fila],'o')
    plt.ylabel('p(K)')
    plt.xlabel('K inversiones en miles')
    plt.axvline(k_busca, linestyle ='dashed')
    plt.title('Polinomios pk(K)')
    plt.legend()
    
    # Grafica de p(L) en k_busca 
    xl = np.linspace(min(li),max(li),muestras)
    pl_lambda = sym.lambdify(L,pkl_busca)
    plx = pl_lambda(xl)
    
    plt.subplot(122)
    plt.plot(xl,plx, label='p(L)')
    plt.plot(li,pk_columna,'o', label='[li,pk(K)]')
    plt.axvline(l_busca, linestyle ='dashed')
    plt.plot(l_busca,Ykl_busca,'o')
    plt.ylabel('p(L)')
    plt.xlabel('L trabajadores')
    plt.title('Polinomio pl(L)')
    plt.legend()
    # plt.show()
    
    # Grafica 3D
    from mpl_toolkits.mplot3d import axes3d
    X, Y = np.meshgrid(kj,li)
    figura = plt.figure()
    ax = figura.add_subplot(111, projection = '3d')
    ax.plot_wireframe(X,Y,M)
    ax.plot(k_busca,l_busca,Ykl_busca,'o',label='(25,25,Y)')
    ax.plot(k_busca*np.ones(len(li)),li,pk_columna,'o')
    ax.set_xlabel('K inversion')
    ax.set_ylabel('L trabajadores')
    ax.set_zlabel('Y producción')
    ax.set_title('Cobb-Douglas')
    plt.show()
    

    [ a1 interpola filas ] [a2 interpola punto Y] [ b1 interpola columnas ] [ b2 raíz Newton-Raphson]  [ Algoritmo ]

    Instrucciones en Python. literal b

    #1Eva_IIIT2007_T2 Función Cobb-Douglas
    # Interpolacion de Lagrange # Newton-Raphson
    import numpy as np
    import matplotlib.pyplot as plt
    
    def newton_raphson(fx,dfx,xi, tolera, iteramax=100, vertabla=False, precision=4):
        '''
        funciónx y fxderiva en forma numérica lambda
        xi es el punto inicial de búsqueda
        '''
        itera=0
        tramo = abs(2*tolera)
        if vertabla==True:
            print('i', ['xi','fi','dfi', 'xnuevo', 'tramo'])
            np.set_printoptions(precision)
        while (tramo>=tolera and itera<iteramax):
            fi = fx(xi)
            dfi = dfx(xi)
            xnuevo = xi - fi/dfi
            tramo = abs(xnuevo-xi)
            if vertabla==True:
                print(itera,np.array([xi,fi,dfi,xnuevo,tramo]))
            xi = xnuevo
            itera = itera + 1
        if itera>=iteramax:
            xi = np.nan
            print('itera: ',itera, 'No converge,se alcanzó el máximo de iteraciones')
        return(xi)
    
    # INGRESO
    y_busca = 30
    fx  = lambda K: 0.0001218125*K**3 - 0.0140857812500013*K**2 + 0.748676562500027*K + 15.5417812499999 -y_busca
    dfx = lambda K: 0.00036543*K**2 - 0.02817*K + 0.748676562500027
    
    x0 = 30
    tolera = 0.00001
    muestras = 20
    
    # PROCEDIMIENTO
    respuesta = newton_raphson(fx,dfx,x0, tolera, vertabla=True)
    # SALIDA
    print('raíz en: ', respuesta)
    
    # Grafica
    xl = np.linspace(0,40,muestras)
    plx = fx(xl)
    plt.plot(xl,plx, label='Y(k)')
    plt.axhline(0,linestyle='dotted')
    plt.ylabel('f(K)')
    plt.xlabel('K inversiones en miles')
    plt.title('f(K) = Y(K)-'+str(y_busca))
    plt.show()
    

    [ a1 interpola filas ] [a2 interpola punto Y] [ b1 interpola columnas ] [ b2 raíz Newton-Raphson]  [ Algoritmo ]