Autor: Edison Del Rosario

  • 3Eva_2023PAOI_T1 Matriz cadena de Markov

    3ra Evaluación 2023-2024 PAO I. 12/Septiembre/2023

    Tema 1 (25 puntos) Un call-center para soporte técnico de una mediana empresa se conforma de una recepcionista y dos técnicos. Se considera como “satisfecho” al cliente si su llamada fue procesada por la recepcionista y cualquiera de los técnicos.

    call center diagrama Markov

    La probabilidad PRT de atención a llamadas se modelan con un sistema de ecuaciones (cadena de Markov) que al ser resuelta muestra probabilidad de encontrarse en cada estado.

    λ P00 = μT P01

    T + λ) P01 = 2 μT P02 + μR P10

    (2 μT + λ) P02 = μR P11 + μR P12

    μR P10 = λ P00 + μT P11

    R + μT) P11 = λ P01 +  2 μT P12

    R + 2 μT) P12 = λ P02

    La suma de probabilidades es uno.

    P00 + P01 + P02 + P10 + P11+ P12 = 1

    λ = 1/10, μR = 1/3, μT =1/15

    Los estados descritos en la gráfica y ecuaciones expresan el proceso de atención:
    - En una llamada, los clientes son atendidos por la recepcionista que toma los datos y redirige la llamada a uno de los técnicos disponible (libre).
    - Si un cliente llama mientras la recepcionista está ocupada, el cliente recibe tono de ocupado y cierra.
    - Si ambos técnicos están disponibles, se selecciona uno con igual probabilidad.
    - Si solo hay un técnico disponible, se le asigna la llamada.
    - Si los dos técnicos están ocupados, se pierde la llamada.

    Los tiempos de atención y llamadas siguen distribuciones exponenciales: recepcionista es de 3 minutos (μR = 1/3), por técnico es de 15 minutos (μT =1/15). Los clientes llaman a intervalos de 10 minutos (λ = 1/10).

    a. Plantee el sistema de ecuaciones, reemplazando la última ecuación con la que indica que la suma de probabilidades por cada estado PRT suma 1.

    b. Establezca la forma matricial del sistema de ecuaciones y como matriz aumentada

    c. De ser necesario realice el pivoteo parcial por filas.

    d. Comente sobre la convergencia del sistema de ecuaciones y justifique sus observaciones usando los errores entre iteraciones o número de condición.

    e. Use un método directo, realizando al menos 3 iteraciones con todas las expresiones.

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

    Referencia: [1] 1Eva_IT2017_T3 Call Center Operadora y Dos Técnicos. ESTG1003-Blog de procesos estocásticos. http://blog.espol.edu.ec/estg1003/1eva_it2017_t3-call-center-operadora-y-dos-tecnicos/
    [2] Cadenas de Markov 01 Introducción. Goal Project. 30 agosto 2021.

  • 6.6.1 EDO lineal - ecuaciones auxiliar, general y complementaria con Sympy-Python

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]


    Referencia: Sympy ODE solver. Stewart James. Cálculo de varias variables. 17.2 p1148.

    Continuando con el ejercicio de la sección anterior de una ecuación diferencial ordinaria, lineal y de coeficientes constantes, se obtuvo la solución homogénea o ecuación complementaria con dsolve().  Para el desarrollo analítico de la solución se requieren describir los pasos tales como la ecuación auxiliar, como se describe a continuación como un ejercicio de análisis de expresiones con Sympy.

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]
    ..


    1. Ejemplo. Ecuación diferencial de un circuito RLC

    Referencia: Lathi Ejemplo 2.1.a p155, Ejemplo 2.9 p175, Oppenheim 2.4.1 p117, ejemplo 1 de Modelo entrada-salida

    circuito RLC

    El circuito RLC con entrada x(t) de la figura tiene una corriente y(t) o salida del sistema que se representa  por medio de una ecuación diferencial.

    \frac{d^{2}y(t)}{dt^{2}} + 3\frac{dy(t)}{dt} + 2y(t) = \frac{dx(t)}{dt}

    Las condiciones iniciales del sistema a tiempo t=0 son y(0)=0 , y'(0)=-5

    1.1 Ecuación diferencial y condiciones de frontera o iniciales

    La ecuación diferencial del ejercicio con Sympy se escribe con el operador sym.diff(y,t,1). Indicando la variable independiente 't', que 'y' es una función y el orden de la derivada con 1. esquema que se mantiene para la descripción de las condiciones iniciales.

    # ecuacion: lado izquierdo = lado derecho
    #           Left Hand Side = Right Hand Side
    LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
    RHS = sym.diff(x(t),t,1)
    ecuacion = sym.Eq(LHS,RHS)
    
    # condiciones de frontera o iniciales
    y_cond = {y(0) : 0,
              sym.diff(y(t),t,1).subs(t,0) : -5}
    

    1.2 Clasificar la ecuación diferencial ordinaria

    Sympy permite revisar el tipo de EDO a resolver usando la instrucción:

    >>> sym.classify_ode(ecuacion, y(t))
    ('factorable', 
     'nth_linear_constant_coeff_variation_of_parameters', 
     'nth_linear_constant_coeff_variation_of_parameters_Integral')
    >>>

    1.3 Ecuación homogénea

    Para el análisis de la respuesta del circuito, se inicia haciendo la entrada x(t)=0, también conocida como ecuación para "respuesta a entrada cero" o ecuación homogénea.

    \frac{d^{2}y(t)}{dt^{2}} + 3\frac{dy(t)}{dt} + 2y(t) = 0

    En el algoritmo, La ecuación homogénea se obtiene al substituir x(t)=0 en cada lado de la ecuación, que también es un paso para encontrar la respuesta a entrada cero. La ecuación homogénea se escribe de la forma f(t)=0.

    # ecuación homogénea x(t)=0, entrada cero
    RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
    LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
    homogenea = LHSx0 - RHSx0
    

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]
    ..


    1.4. Ecuación auxiliar o característica.

    En la ecuación homogénea , se procede a sustituir en la ecuación el operador dy/dt de la derivada con una variable r elevada al orden de la derivada de cada término . El resultado es una ecuación algebraica que se analiza encontrando las raíces de r.

    r ^2 + 3r +2 = 0

    Los valores de r que resuelven la ecuación permiten estimar la forma de la solución para y(t) conocida como la ecuación general.

    Se usan diferentes formas para mostrar la ecuación auxiliar, pues en algunos casos se requiere usar la forma de factores, en otros casos los valores de las raíces y las veces que se producen. Formas usadas para generar diagramas de polos y ceros, o expresiones de transformada de Laplace. Motivo por el que los resultados se los presenta en un diccionario, y así usar la respuesta que sea de interés en cada caso.

    homogenea :
                            2          
               d           d           
    2*y(t) + 3*--(y(t)) + ---(y(t)) = 0
               dt           2          
                          dt           
    auxiliar : r**2 + 3*r + 2
    Q : r**2 + 3*r + 2
    Q_factor : (r + 1)*(r + 2)
    Q_raiz : {-1: 1, -2: 1}
    >>> 
    

    Instrucciones con Python

    # Ecuación Diferencial Ordinaria EDO
    # ecuación auxiliar o característica 
    # Lathi 2.1.a pdf 155, (D^2+ 3D + 2)y = Dx
    import sympy as sym
    
    # INGRESO
    t = sym.Symbol('t', real=True)
    r = sym.Symbol('r')
    y = sym.Function('y')
    x = sym.Function('x')
    
    # ecuacion: lado izquierdo = lado derecho
    #           Left Hand Side = Right Hand Side
    LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
    RHS = sym.diff(x(t),t,1)
    ecuacion = sym.Eq(LHS,RHS)
    
    # condiciones de frontera o iniciales
    y_cond = {y(0) : 0,
              sym.diff(y(t),t,1).subs(t,0) : -5}
    
    # PROCEDIMIENTO
    def edo_lineal_auxiliar(ecuacion,
                     t = sym.Symbol('t'),r = sym.Symbol('r'),
                     y = sym.Function('y'),x = sym.Function('x')):
        ''' ecuacion auxiliar o caracteristica de EDO
            t independiente
        '''
        # ecuación homogénea x(t)=0, entrada cero
        RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
        LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
        homogenea = LHSx0 - RHSx0
        homogenea = sym.expand(homogenea,t)
    
        # ecuación auxiliar o característica
        Q = 0*r
        term_suma = sym.Add.make_args(homogenea)
        for term_k in term_suma:
            orden_k = sym.ode_order(term_k,y)
            coef = 1 # coefientes del término suma
            factor_mul = sym.Mul.make_args(term_k)
            for factor_k in factor_mul:
                cond = factor_k.has(sym.Derivative)
                cond = cond or factor_k.has(y(t))
                if not(cond):
                    coef = coef*factor_k
            Q = Q + coef*(r**orden_k)
                   
        # Q factores y raices
        Q_factor = sym.factor(Q,r)
        Q_poly   = sym.poly(Q,r)
        Q_raiz   = sym.roots(Q_poly)
        
        auxiliar = {'homogenea' : sym.Eq(homogenea,0),
                    'auxiliar'  : Q,
                    'Q'         : Q,
                    'Q_factor'  : Q_factor,
                    'Q_raiz'    : Q_raiz }
        return(auxiliar)
    
    # analiza la ecuación diferencial
    edo_tipo = sym.classify_ode(ecuacion, y(t))
    auxiliar = edo_lineal_auxiliar(ecuacion,t,r)
    
    # SALIDA
    print('clasifica EDO:')
    for untipo in edo_tipo:
        print(' ',untipo)
    print('ecuacion auxiliar:')
    for entrada in auxiliar:
        print(' ',entrada,':',auxiliar[entrada])
    

    Otra forma de mostrar el resultado es usando un procedimiento creado para mostrar elementos del diccionario según corresponda a cada tipo. el procedimiento se adjunta al final.

    Las funciones se incorporan a los algoritmos del curso en matg1052.py

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]
    ..


    1.5 Ecuación diferencial, ecuación general y complementaria con Sympy-Python

    La ecuación general se encuentra con la instrucción sym.dsolve(), sin condiciones iniciales, por que el resultado presenta constantes Ci por determinar.

        # solucion general de ecuación homogénea
        general = sym.dsolve(homogenea, y(t))
        general = general.expand()
    

    el resultado para el ejercicio es

    general :
               -t       -2*t
    y(t) = C1*e   + C2*e

    Para encontrar los valores de las constantes, se aplica cada una de las condiciones iniciales a la ecuación general, obteniendo un sistema de ecuaciones.

         # Aplica condiciones iniciales o de frontera
        eq_condicion = []
        for cond_k in y_cond: # cada condición
            valor_k = y_cond[cond_k]
            orden_k = sym.ode_order(cond_k,y)
            if orden_k==0: # condicion frontera
                t_k = cond_k.args[0] # f(t_k)
                expr_k = general.rhs.subs(t,t_k)
            else: # orden_k>0
                # f.diff(t,orden_k).subs(t,t_k)
                subs_param = cond_k.args[2] # en valores
                t_k = subs_param.args[0]  # primer valor
                dyk = general.rhs.diff(t,orden_k)
                expr_k = dyk.subs(t,t_k)
            eq_condicion.append(sym.Eq(valor_k,expr_k))
    

    con el siguiente resultado:

    eq_condicion :
    0 = C1 + C2
    -5 = -C1 - 2*C2

    El sistema de ecuaciones se resuelve con la instrucción

    constante = sym.solve(eq_condicion)
    

    que entrega un diccionario con cada valor de la constante

    constante : {C1: -5, C2: 5}

    La ecuación complementaria se obtiene al sustituir en la ecuación general los valores de las constantes.

    El resultado del algoritmo

    homogenea :
                            2          
               d           d           
    2*y(t) + 3*--(y(t)) + ---(y(t)) = 0
               dt           2          
                          dt           
    general :
               -t       -2*t
    y(t) = C1*e   + C2*e    
    eq_condicion :
    0 = C1 + C2
    -5 = -C1 - 2*C2
    constante : {C1: -5, C2: 5}
    complementaria :
                -t      -2*t
    y(t) = - 5*e   + 5*e    
    >>>
    

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]
    ..


    2. Algoritmo con Python

    Las instrucciones detalladas se presentan en el algoritmo integrado.

    # Solución complementaria a una Ecuación Diferencial Ordinaria EDO
    # Lathi 2.1.a pdf 155, (D^2+ 3D + 2)y = Dx
    import sympy as sym
    equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                    {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                    'numpy',]
    import matg1052 as fcnm
    
    # INGRESO
    t = sym.Symbol('t', real=True)
    r = sym.Symbol('r')
    y = sym.Function('y')
    x = sym.Function('x')
    
    # ecuacion: lado izquierdo = lado derecho
    #           Left Hand Side = Right Hand Side
    LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
    RHS = sym.diff(x(t),t,1)
    ecuacion = sym.Eq(LHS,RHS)
    
    # condiciones de frontera o iniciales
    y_cond = {y(0) : 0,
              sym.diff(y(t),t,1).subs(t,0) : -5}
    
    # PROCEDIMIENTO
    def edo_lineal_complemento(ecuacion,y_cond):
        # ecuación homogénea x(t)=0, entrada cero
        RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
        LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
        homogenea = LHSx0 - RHSx0
    
        # solucion general de ecuación homogénea
        general = sym.dsolve(homogenea, y(t))
        general = general.expand()
    
        # Aplica condiciones iniciales o de frontera
        eq_condicion = []
        for cond_k in y_cond: # cada condición
            valor_k = y_cond[cond_k]
            orden_k = sym.ode_order(cond_k,y)
            if orden_k==0: # condicion frontera
                t_k    = cond_k.args[0] # f(t_k)
                expr_k = general.rhs.subs(t,t_k)
            else: # orden_k>0
                subs_param = cond_k.args[2] # en valores
                t_k = subs_param.args[0]  # primer valor
                dyk = sym.diff(general.rhs,t,orden_k)
                expr_k = dyk.subs(t,t_k)
            eq_condicion.append(sym.Eq(valor_k,expr_k))
    
        constante = sym.solve(eq_condicion)
    
        # ecuacion complementaria
        # reemplaza las constantes en general
        yc = general
        for Ci in constante:
            yc = yc.subs(Ci, constante[Ci])
        
        complemento = {'homogenea'      : sym.Eq(homogenea,0),
                       'general'        : general,
                       'eq_condicion'   : eq_condicion,
                       'constante'      : constante,
                       'complementaria' : yc}
        return(complemento)
    
    # analiza ecuacion diferencial
    edo_tipo = sym.classify_ode(ecuacion, y(t))
    auxiliar = fcnm.edo_lineal_auxiliar(ecuacion,t,r)
    complemento = edo_lineal_complemento(ecuacion,y_cond)
    yc = complemento['complementaria'].rhs
    
    # SALIDA
    print('clasifica EDO:')
    for elemento in edo_tipo:
        print(' ',elemento)
    
    fcnm.print_resultado_dict(auxiliar)
    fcnm.print_resultado_dict(complemento)
    

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]
    ..


    3. Gráfica de la ecuación complementaria yc

    Para la gráfica se procede a convertir la ecuación yc en la forma numérica con sym.lambdify(). Se usa un intervalo de tiempo entre [0,5] y 51 muestras con el siguiente resultado:

    solucion homogenea EDO

    Instrucciones en Python

    # GRAFICA ------------------
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    t_a = 0 ; t_b = 5 # intervalo tiempo [t_a,t_b]
    muestras = 51
    
    # PROCEDIMIENTO
    yt = sym.lambdify(t,yc, modules=equivalentes) 
    ti = np.linspace(t_a,t_b,muestras)
    yi = yt(ti)
    
    # Grafica
    plt.plot(ti,yi, color='orange', label='yc(t)')
    untitulo = 'yc(t)=$'+ str(sym.latex(yc))+'$'
    plt.title(untitulo)
    plt.xlabel('t')
    plt.ylabel('yc(t)')
    plt.legend()
    plt.grid()
    plt.show()
    

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]


    4.  Mostrar el resultado del diccionario según el tipo de entrada

    Para mostrar los resultados de una forma más fácil de leer, se usará sym.pprint() para las ecuaciones, y print() simple para los demás elementos del resultado

    def print_resultado_dict(resultado):
        ''' print de diccionario resultado
            formato de pantalla
        '''
        for entrada in resultado:
            tipo = type(resultado[entrada])
            if tipo == sym.core.relational.Equality:
                print(entrada,':')
                sym.pprint(resultado[entrada])
            elif tipo==list or tipo==tuple:
                tipoelem = type(resultado[entrada][0])
                if tipoelem==sym.core.relational.Equality:
                    print(entrada,':')
                    for fila in resultado[entrada]:
                        sym.pprint(fila)
                else:
                    print(entrada,':')
                    for fila in resultado[entrada]:
                        print(' ',fila)
            else:
                print(entrada,':',resultado[entrada])
        return()
    

    [ ejemplo ] ecuación: [ auxiliar ] [ general, complementaria ] [ algoritmo ] [ gráfica ]

  • 6.6 EDO lineal - solución complementaria y particular con Sympy-Python

    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]


    Referencia: [1] Sympy ODE solver. [2] Stewart James. Cálculo de varias variables. 17.2 p1148

    Los métodos analíticos para encontrar una solución y(t) a una ecuación diferencial ordinaria EDO requieren identificar el tipo de la ecuación para establecer el método de solución. Sympy incorpora librerías que pueden asistir en la solución con muchos de los métodos analíticos conocidos.

    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]
    ..


    1. Ecuación diferencial de un circuito RLC

    Referencia:  Lathi Ejemplo 2.1.a p155, Ejemplo 2.9 p175, Oppenheim 2.4.1 p117, ejemplo 1 de Modelo entrada-salidacircuito RLC

    El circuito RLC con entrada x(t) de la figura tiene una corriente y(t) o salida del sistema que se representa  por medio de una ecuación diferencial.

    \frac{d^{2}y(t)}{dt^{2}} + 3\frac{dy(t)}{dt} + 2y(t) = \frac{dx(t)}{dt}

    Las condiciones iniciales del sistema a tiempo t=0 son y(0)=0 , y'(0)=-5

    Encuentre la solución considerando como entrada x(t)

    x(t) = 10 e^{-3t} \mu(t)

    1.1 Ecuación diferencial y condiciones de frontera o iniciales

    La ecuación diferencial del ejercicio con Sympy se escribe con el operador sym.diff(y,t,k). Indicando la variable independiente, que 'y' es una función y el orden de la derivada con k.

    La igualdad de una ecuación puede escribirse como lado izquierdo (LHS) es igual al lado derecho (RHS). Una ecuación en Sympy se compone de las dos partes sym.Eq(LHS,RHS).

    # INGRESO
    t = sym.Symbol('t', real=True)
    r = sym.Symbol('r')
    y = sym.Function('y')
    x = sym.Function('x')
    
    # ecuacion: lado izquierdo = lado derecho
    #           Left Hand Side = Right Hand Side
    LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
    RHS = sym.diff(x(t),t,1)
    ecuacion = sym.Eq(LHS,RHS)

    Las condiciones de frontera o iniciales y(0)=0, y'(0)=-5 se establecen en un diccionario en el siguiente formato,

    # condiciones de frontera o iniciales
    y_cond = {y(0) : 0,
              sym.diff(y(t),t,1).subs(t,0) : -5}
    

    La entrada x(t) para el sistema, que inicia en t=0 se define junto a μ(t) o Heaviside(t) como:

    # ecuacion entrada x(t)
    xp = 10*sym.exp(-3*t)*sym.Heaviside(t)

    1.2 Clasificar la ecuación diferencial ordinaria

    Para revisar el tipo de EDO a resolver se tiene la instrucción:

    >>> sym.classify_ode(ecuacion, y(t))
    ('factorable', 
     'nth_linear_constant_coeff_variation_of_parameters', 
     'nth_linear_constant_coeff_variation_of_parameters_Integral')
    >>>

    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]


    Solución EDO como suma de solución complementaria y solución particular

    La solución para una EDO puede presentarse también como la suma de una solución complementaria y una solución particular

    y(t) = y_p(t) + y_c(t)

    respuesta entrada cero de un sistema
    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]
    ..


    1.3 Solución complementaria yc(t)

    La solución complementaria de la EDO se interpreta también como respuesta de entrada cero del circuito, donde la salida y(t) depende solo de las condiciones iniciales del circuito. Para el ejemplo, considera solo las energías internas almacenadas en el capacitor y el inductor. Para éste caso x(t) = 0

    Es necesario crear la ecuación homogénea con x(t)=0 en la ecuación diferencial para encontrar la solución con las condiciones iniciales dadas en el enunciado del ejercicio.

    # ecuación homogénea x(t)=0, entrada cero
    RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
    LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
    homogenea = LHSx0 - RHSx0
    
    # solucion general de ecuación homogénea
    yc = sym.dsolve(homogenea, y(t),ics=y_cond)
    yc = yc.expand()
    

    el resultado de la ecuación complementaria es

    solucion complementaria y_c(t): 
                -t      -2*t
    y(t) = - 5*e   + 5*e    
    

    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]
    ..


    1.4 Solución particular yp(t)

    En el caso de la solución particular, se simplifica la ecuación diferencial al sustituir x(t) con la entrada particular xp(t). Las condiciones iniciales en este caso consideran que el circuito no tenía energía almacenada en sus componentes (estado cero), por lo que las condiciones iniciales no se consideran.

    # ecuación particular x(t)=0, estado cero
    RHSxp = ecuacion.rhs.subs(x(t),x_p).doit()
    LHSxp = ecuacion.lhs.subs(x(t),x_p).doit()
    particular = LHSxp - RHSxp
    
    # solucion particular de ecuación homogénea
    yp = sym.dsolve(particular, y(t))
    

    Se aplica nuevamente la búsqueda de la solución con sym.dsolve() y se obtiene la solución particular que incluye parte del modelo de la ecuación homogénea con los coeficientes Ci

    >>> sym.pprint(yp.expand())
               -t       -2*t      -t                    -2*t                    -3*t
    y(t) = C1*e   + C2*e     - 5*e  *Heaviside(t) + 20*e    *Heaviside(t) - 15*e    *Heaviside(t)
    
    >>> yp.free_symbols
    {C2, C1, t}
    >>>

    En éste punto se incrementan los términos de las constantes C1 y C2 como símbolos, que para tratar exclusivamente la solución particular, se reemplazan con ceros. Para obtener las variables de la ecuación se usa la instrucción yp.free_symbols que entrega un conjunto. El conjunto se descarta el símbolo t y se sustituye todos los demás por cero en la ecuación.

        # particular sin terminos Ci
        y_Ci = yp.free_symbols
        y_Ci.remove(t) # solo Ci
        for Ci in y_Ci: 
            yp = yp.subs(Ci,0)
    

    quedando la solución particular como:

                -t                    -2*t                    -3*t             
    y(t) = - 5*e  *Heaviside(t) + 20*e    *Heaviside(t) - 15*e    *Heaviside(t)
    

    1.5 Solución EDO como suma de complementaria + particular

    La solución de la ecuación diferencial ordinaria, ante la entrada x(t) y condiciones iniciales es la suma de los componentes complementaria y particular:

    # solucion total = complementaria + particular
    ytotal = yc.rhs + yp.rhs
    

    El resultado de todo el algoritmo  permite interpretar la respuesta con los conceptos de las respuestas del circuito a entrada cero y estado cero, que facilitan el análisis de las soluciones en ejercicios de aplicación.

    ecuación diferencial a resolver: 
                            2                 
               d           d          d       
    2*y(t) + 3*--(y(t)) + ---(y(t)) = --(x(t))
               dt           2         dt      
                          dt                  
    condiciones iniciales
      y(0)  =  0
      Subs(Derivative(y(t), t), t, 0)  =  -5
    clasifica EDO:
      factorable
      nth_linear_constant_coeff_variation_of_parameters
      nth_linear_constant_coeff_variation_of_parameters_Integral
    x(t): 
        -3*t             
    10*e    *Heaviside(t)
    solucion complementaria yc(t): 
                -t      -2*t
    y(t) = - 5*e   + 5*e    
    solucion particular yp(t): 
           /     -t       -2*t       -3*t\             
    y(t) = \- 5*e   + 20*e     - 15*e    /*Heaviside(t)
    solucion y(t) = yc(t) +yp(t): 
    /     -t       -2*t       -3*t\                   -t      -2*t
    \- 5*e   + 20*e     - 15*e    /*Heaviside(t) - 5*e   + 5*e    
    >>> 
    

    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]
    ..


    2. Algoritmo en Python

    # Solución de unaEcuación Diferencial Ordinaria EDO
    # Lathi 2.1.a pdf 155, (D^2+ 3D + 2)y = Dx
    import sympy as sym
    
    # INGRESO
    t = sym.Symbol('t', real=True)
    y = sym.Function('y')
    x = sym.Function('x')
    
    # ecuacion: lado izquierdo = lado derecho
    #           Left Hand Side = Right Hand Side
    LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
    RHS = sym.diff(x(t),t,1)
    ecuacion = sym.Eq(LHS,RHS)
    
    # condiciones de frontera o iniciales
    y_cond = {y(0) : 0,
              sym.diff(y(t),t,1).subs(t,0) : -5}
    
    # ecuacion entrada x(t)
    xp = 10*sym.exp(-3*t)*sym.Heaviside(t)
    
    # PROCEDIMIENTO
    edo_tipo = sym.classify_ode(ecuacion, y(t))
    
    # ecuación homogénea x(t)=0, entrada cero
    RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
    LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
    homogenea = LHSx0 - RHSx0
    
    # solucion general de ecuación homogénea
    yc = sym.dsolve(homogenea, y(t),ics=y_cond)
    yc = yc.expand()
    
    def edo_lineal_particular(ecuacion,xp):
        ''' edo solucion particular con entrada x(t)
        '''
        # ecuación particular x(t)=0, estado cero
        RHSxp = ecuacion.rhs.subs(x(t),xp).doit()
        LHSxp = ecuacion.lhs.subs(x(t),xp).doit()
        particular = LHSxp - RHSxp
    
        # solucion particular de ecuación homogénea
        yp = sym.dsolve(particular, y(t))
    
        # particular sin terminos Ci
        y_Ci = yp.free_symbols
        y_Ci.remove(t) # solo Ci
        for Ci in y_Ci: 
            yp = yp.subs(Ci,0)
            
        # simplifica y(t) y agrupa por escalon unitario
        yp = sym.expand(yp.rhs,t)
        lista_escalon = yp.atoms(sym.Heaviside)
        yp = sym.collect(yp,lista_escalon)
        yp = sym.Eq(y(t),yp)
        
        return(yp)
    
    yp = edo_lineal_particular(ecuacion,xp)
    # solucion total
    ytotal = yp.rhs + yc.rhs
    
    
    # SALIDA
    print('ecuación diferencial a resolver: ')
    sym.pprint(ecuacion)
    
    # condiciones iniciales
    print('condiciones iniciales')
    for caso in y_cond:
        print(' ',caso,' = ', y_cond[caso])
    
    print('clasifica EDO:')
    for elemento in edo_tipo:
        print(' ',elemento)
    
    print('x(t): ')
    sym.pprint(xp)
    
    print('solucion complementaria yc(t): ')
    sym.pprint(yc)
    
    print('solucion particular yp(t): ')
    sym.pprint(yp)
    
    print('solucion y(t) = yc(t) +yp(t): ')
    sym.pprint(ytotal)
    

    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]
    ..


    3.  Grafica de resultados

    Se adjunta la gráfica de los resultados de las ecuaciones complementaria, particular y total

    EDO lineal Complementaria Particular 01

    Instrucciones adicionales en Python

    # GRAFICA ------------------
    import numpy as np
    import matplotlib.pyplot as plt
    equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                    {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                    'numpy',]
    
    # INGRESO
    t_a = 0 ; t_b = 5 # intervalo tiempo [t_a,t_b]
    muestras = 51
    
    # PROCEDIMIENTO
    y_c = sym.lambdify(t,yc.rhs, modules=equivalentes)
    y_p = sym.lambdify(t,yp.rhs, modules=equivalentes)
    y_cp = sym.lambdify(t,ytotal, modules=equivalentes)
    ti = np.linspace(t_a,t_b,muestras)
    yci = y_c(ti)
    ypi = y_p(ti)
    ycpi = y_cp(ti)
    
    # Grafica
    plt.plot(ti,yci, color='orange', label='yc(t)')
    plt.plot(ti,ypi, color='dodgerblue', label='yp(t)')
    plt.plot(ti,ycpi, color='green', label='y(t)')
    untitulo = 'y(t)=$'+ str(sym.latex(ytotal))+'$'
    plt.title(untitulo)
    plt.xlabel('t')
    plt.legend()
    plt.grid()
    plt.show()
    

    Un desarrollo semejante del ejercicio aplicando conceptos del curso de señales y sistemas de proporciona en:

    LTI CT Respuesta del Sistema Y(s)=ZIR+ZSR con Sympy-Python

    [ ejemplo ] solución: [ complementaria ] [ particular ] [ algoritmo ] [ gráfica ]

  • s2Eva_2023PAOI_T3 EDP elíptica, placa rectangular con frontera variable

    Ejercicio: 2Eva_2023PAOI_T3 EDP elíptica, placa rectangular con frontera variable

    Dada la EDP elíptica,

    \frac{\partial ^2 u}{\partial x^2} + \frac{\partial ^2 u}{\partial y^2} = \Big( x^2 + y^2 \Big) e^{xy} 0 \lt x \lt 1 0 \lt y \lt 0.5

    Se convierte a la versión discreta usando diferencias divididas centradas, según se puede mostrar con la gráfica de malla.

    literal b

    EDP eliptica rectangular frontera variable

    literal a


    \frac{u[i-1,j]-2u[i,j]+u[i+1,j]}{\Delta x^2} + + \frac{u[i,j-1]-2u[i,j]+u[i,j+1]}{\Delta y^2} = \Big( x^2 + y^2 \Big) e^{xy}

    literal c

    Se agrupan los términos Δx, Δy semejante a formar un λ al multiplicar todo por Δy2

    \frac{\Delta y^2}{\Delta x^2}\Big(u[i-1,j]-2u[i,j]+u[i+1,j] \Big) + + \frac{\Delta y^2}{\Delta y^2}\Big(u[i,j-1]-2u[i,j]+u[i,j+1]\Big) = \Big( x^2 + y^2 \Big) e^{xy}\frac{\Delta y^2}{\Delta x^2}

    los tamaños de paso en ambos ejes son de igual valor, se simplifica la ecuación

    \lambda= \frac{\Delta y^2}{\Delta x^2} = 1

    se simplifica el coeficiente en λ =1

    u[i-1,j]-2u[i,j]+u[i+1,j] + + u[i,j-1]-2u[i,j]+u[i,j+1] = \Big( x^2 + y^2 \Big) e^{xy}

    Se agrupan los términosiguales

    u[i-1,j]-4u[i,j]+ u[i+1,j] + u[i,j-1] +u[i,j+1] = \Big( x^2 + y^2 \Big) e^{xy}

    Se desarrollan las iteraciones para tres rombos y se genera el sistema de ecuacioens a resolver.
    para i=1,j=1

    u[0,1]-4u[1,1]+ u[2,1] + u[1,0] +u[1,2] = \Big( x[1]^2 + y[1]^2 \Big) e^{x[1]y[1]} 1-4u[1,1]+ u[2,1] + 1 + \frac{1}{8} = \Big( 0.25^2 + 0.25^2 \Big) e^{(0.25) (0.25)} -4u[1,1]+ u[2,1] = \Big( 0.25^2 + 0.25^2 \Big) e^{(0.25) (0.25)} - \frac{1}{8}

    para i=2, j=1

    u[1,1]-4u[2,1]+ u[3,1] + u[2,0] +u[2,2] = \Big( x[2]^2 + y[1]^2 \Big) e^{x[2]y[1]} u[1,1]-4u[2,1]+ u[3,1] + 1 + 0.25 = \Big( 0.5^2 + 0.25^2 \Big) e^{(0.5)(0.25)} u[1,1]-4u[2,1]+ u[3,1] = \Big( 0.5^2 + 0.25^2 \Big) e^{(0.5)(0.25)} -1.25

    para i=3, j=1

    u[2,1]-4u[3,1]+ u[4,1] + u[3,0] +u[3,2] = \Big( x[3]^2 + y[1]^2 \Big) e^{x[3]y[1]} u[2,1]-4u[3,1]+ 0.25 + 0 + \frac{3}{8} = \Big( 0.75^2 + 0.25^2 \Big) e^{(0.75)(0.25)} u[2,1]-4u[3,1] = \Big( 0.75^2 + 0.25^2 \Big) e^{(0.75)(0.25)} - 0.25 - \frac{3}{8}

    con lo que se puede crear un sistema de ecuaciones y resolver el sistema para cada punto desconocido

    \begin{pmatrix} -4 & 1 & 0 & \Big| & 0.008061807364732415 \\ 1 & -4 & 1 & \Big| & -0.8958911084166168 \\0 & 1 & -4 &\Big| & 0.1288939058881129 \end{pmatrix}

    se obtiene los resultados para:

    u[1,1] = 0.05953113
    u[2,1] = 0.24618634
    u[3,1] = 0.02932311

    >>> import numpy as np
    >>> (0.25**2+0.25**2)*np.exp(0.25*0.25) - 1/8
    0.008061807364732415
    >>> (0.5**2+0.25**2)*np.exp(0.5*0.25) - 1.25
    -0.8958911084166168
    >>> (0.75**2+0.25**2)*np.exp(0.75*0.25) - 0.25 -3/8
    0.1288939058881129
    >>> A=[[-4,1,0],[1,-4,1],[0.0,1.0,-4.0]]
    >>> B = [0.008061807364732415, -0.8958911084166168, 0.1288939058881129]
    >>> np.linalg.solve(A,B)
    array([0.05953113, 0.24618634, 0.02932311])
    
  • 2Eva_2023PAOI_T3 EDP elíptica, placa rectangular con frontera variable

    2da Evaluación 2023-2024 PAO I. 29/Agosto/2023

    Tema 3 (35 puntos) Aproxime la solución de la Ecuación Diferencial Parcial

    \frac{\partial ^2 u}{\partial x^2} + \frac{\partial ^2 u}{\partial y^2} = \Big( x^2 + y^2 \Big) e^{xy} 0 \lt x \lt 1 0 \lt y \lt 0.5

    Con las condiciones de frontera:

    u(0,y)=1, u(1,y)= y, 0≤y≤0.5
    u(x,0)=1, u(x,0.5)=x/2, 0≤x≤1

    Aproxime la solución con tamaños de paso Δx = 0.25, Δy = 0.25
    Utilice diferencias finitas centradas para las variables independientes x,y

    a. Plantee las ecuaciones para usar un método numérico en un nodo i,j

    b. Realice la gráfica de malla,

    c. desarrolle y obtenga el modelo discreto para u(xi,tj)

    d. Realice al menos tres iteraciones en el eje tiempo.

    e. Estime el error de u(xi,tj) y adjunte los archivos del algoritmo y resultados.

    Rúbrica: Aproximación de las derivadas parciales (5 puntos), construcción de la malla (10), construcción del sistema lineal (15), resolución del sistema (5 puntos).

    Referencia: 2Eva_IT2012_T3 EDP elíptica, placa rectangular

  • s2Eva_2023PAOI_T2 EDO Péndulo vertical amortiguado

    Ejercicio: 2Eva_2023PAOI_T2 EDO Péndulo vertical amortiguado

    literal a

    \frac{d^2 \theta}{dt^2} = -\mu \frac{d\theta}{ dt}-\frac{g}{L}\sin (\theta)

    Se simplifica su forma a:

    \frac{d\theta}{dt}= z = f_t(t,\theta,z) \frac{d^2\theta }{dt^2}= z' = -\mu z -\frac{g}{L}\sin (\theta) = g_t(t,\theta,z)

    se usan los valores dados: g = 9.81 m/s2, L = 2 m

    f_t(t,\theta,z) = z g_t(t,\theta,z) = - 0.5 z -\frac{9.81}{2}\sin (\theta)

    y los valores iniciales para la tabla: θ(0) = π/4 rad, θ' (0) = 0 rad/s, se complementan los valores en la medida que se aplica el desarrollo.

    ti θ(ti) θ'(ti)=z
    0 π/4 0
    0.2 0.7161 -0.6583
    0.4 0.5267 -0.1156
    0.6 0.2579 -0.1410
    ...

    literal b

    Iteración 1:  ti = 0 ; yi = π/4 ; zi = 0

    K1y = h * ft(ti,yi,zi) 
        = 0.2*(0) = 0
    K1z = h * gt(ti,yi,zi) 
        = 0.2*(-0.5(0) -(9.81/2)sin (π/4) = -0.6930
            
    K2y = h * ft(ti+h, yi + K1y, zi + K1z)
        = 0.2*(0-0.6930)= -0.1386
    K2z = h * gt(ti+h, yi + K1y, zi + K1z)
        = 0.2*(-0.5(0-0.6930) -(9.81/2)sin(π/4-0) 
        = -0.6237
    
    yi = yi + (K1y+K2y)/2 
       = π/4+ (0+(-0.1386))/2 = 0.7161
    zi = zi + (K1z+K2z)/2 
       = 0+(-0.6930-0.6237)/2 = -0.6583
    ti = ti + h = 0 + 0.2 = 0.2
    
    estimado[i] = [0.2,0.7161,-0.6583]
    

    Iteración 2:  ti = 0.2 ; yi = 0.7161 ; zi = -0.6583

    K1y = h * ft(ti,yi,zi) 
        = 0.2*(-0.6583) = -0.1317
    K1z = h * gt(ti,yi,zi) 
        = 0.2*(- 0.5 ( -0.6583) -(9.81/2)sin (0.7161) 
        = -0.5775
            
    K2y = h * ft(ti+h, yi + K1y, zi + K1z)
        = 0.2*(-0.6583 -0.5775)= -0.2472
    K2z = h * gt(ti+h, yi + K1y, zi + K1z)
        = 0.2*(- 0.5 (-0.6583 -0.5775) -(9.81/2)sin(0.7161-0.1317) 
        = -0.4171
    
    yi = yi + (K1y+K2y)/2 
       = 0.7161 + (-0.1317-0.2472)/2 = 0.5267
    zi = zi + (K1z+K2z)/2 
       = -0.6583+(-0.5775-0.4171)/2 = -0.1156
    ti = ti + h = 0.2 + 0.2 = 0.4
    
    estimado[i] = [0.4,0.5267,-0.1156]
    

    Iteración 3:  ti = 0.4 ; yi = 0.5267 ; zi = -1.156

    K1y = h * ft(ti,yi,zi) 
        = 0.2*(-1.156) = -0.2311
    K1z = h * gt(ti,yi,zi) 
        = 0.2*(- 0.5(-1.156) -(9.81/2)sin (0.5267) 
        = -0.3771
            
    K2y = h * ft(ti+h, yi + K1y, zi + K1z)
        = 0.2*(-1.156 -0.3771)= -0.3065
    K2z = h * gt(ti+h, yi + K1y, zi + K1z)
        = 0.2*(- 0.5 ( -1.156 -0.3771) -(9.81/2)sin(0.5267-0.2311) 
        = -0.1322
    
    yi = yi + (K1y+K2y)/2 
       = 0.5267 + (-0.2311-0.3065)/2 = 0.2579
    zi = zi + (K1z+K2z)/2 
       = -1.156+(-0.3771-0.1322)/2 = -1.410
    ti = ti + h = 0.4 + 0.2 = 0.6
    
    estimado[i] = [0.6,0.2579,-1.410]
    

    literal c

    resultados del algoritmo:

    [ t, 		 y, 	 dyi/dti=z,  K1y,	 K1z,	    K2y,      K2z]
    [[ 0.000e+00  7.854e-01  0.000e+00  0.000e+00  0.000e+00  0.000e+00   0.000e+00]
     [ 2.000e-01  7.161e-01 -6.583e-01  0.000e+00 -6.930e-01 -1.386e-01  -6.237e-01]
     [ 4.000e-01  5.267e-01 -1.156e+00 -1.317e-01 -5.775e-01 -2.472e-01  -4.171e-01]
     [ 6.000e-01  2.579e-01 -1.410e+00 -2.311e-01 -3.771e-01 -3.065e-01  -1.322e-01]
     [ 8.000e-01 -3.508e-02 -1.377e+00 -2.820e-01 -1.089e-01 -3.038e-01    1.756e-01]
    ...
    

    péndulo amortiguado 03

    con h=0.2 se tienen 1/0.2 = 5 tramos por segundo, por lo que para 10 segundo serán 50 tramos. La cantidad de muestras = tramos + 1(valor inicial) = 51

    con lo que se puede usar el algoritmo en EDO Runge-Kutta d2y/dx2

    literal d

    Se observa que la respuesta es oscilante y amortiguada en magnitud como se esperaba según el planteamiento. Con el tiempo se estabilizará en cero.

    Instrucciones en Python

    # 2Eva_2023PAOI_T2 Péndulo vertical amortiguado
    import numpy as np
    import matplotlib.pyplot as plt
    
    def rungekutta2_fg(f,g,x0,y0,z0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,7),dtype=float)
        # incluye el punto [x0,y0,z0]
        estimado[0] = [x0,y0,z0,0,0,0,0]
        xi = x0
        yi = y0
        zi = z0
        for i in range(1,tamano,1):
            K1y = h * f(xi,yi,zi)
            K1z = h * g(xi,yi,zi)
            
            K2y = h * f(xi+h, yi + K1y, zi + K1z)
            K2z = h * g(xi+h, yi + K1y, zi + K1z)
    
            yi = yi + (K1y+K2y)/2
            zi = zi + (K1z+K2z)/2
            xi = xi + h
            
            estimado[i] = [xi,yi,zi,K1y,K1z,K2y,K2z]
        return(estimado)
    
    # INGRESO theta = y
    g = 9.8
    L  = 2
    ft = lambda t,y,z: z
    gt = lambda t,y,z: -0.5*z +(-g/L)*np.sin(y)
    
    t0 = 0
    y0 = np.pi/4
    z0 = 0
    h = 0.2
    muestras = 51
    
    # PROCEDIMIENTO
    tabla = rungekutta2_fg(ft,gt,t0,y0,z0,h,muestras)
    
    # SALIDA
    np.set_printoptions(precision=3)
    print(' [ t, \t\t y, \t dyi/dti=z, K1y,\t K1z,\t K2y,\t K2z]')
    print(tabla)
    
    # Grafica
    ti = np.copy(tabla[:,0])
    yi = np.copy(tabla[:,1])
    zi = np.copy(tabla[:,2])
    plt.subplot(121)
    plt.plot(ti,yi)
    plt.grid()
    plt.xlabel('ti')
    plt.title('yi')
    plt.subplot(122)
    plt.plot(ti,zi, color='green')
    plt.xlabel('ti')
    plt.title('dyi/dti')
    plt.grid()
    plt.show()
    
  • 2Eva_2023PAOI_T2 EDO Péndulo vertical amortiguado

    2da Evaluación 2023-2024 PAO I. 29/Agosto/2023

    Tema 2 (35 puntos) Una mejor aproximación a un péndulo oscilante con un ángulo θ más amplio y con un coeficiente de amortiguamiento μ se expresa con una ecuación diferencial ordinaria de segundo orden.

    pendulo Amortuguado 02\frac{d^2 \theta}{dt^2} = -\mu \frac{d\theta}{ dt}-\frac{g}{L}\sin (\theta)

    g = 9.81 m/s2
    L = 2 m
    θ(0) = π/4 rad
    θ' (0) = 0 rad/s

    El péndulo se suelta desde el reposo, desde un ángulo de π/4 respecto al eje vertical. El coeficiente de amortiguamiento μ=0.5 es proporcional a la velocidad angular.

    a. Realice el planteamiento del ejercicio usando Runge-Kutta de 2do Orden

    b. Desarrolle tres iteraciones para θ(t) con tamaño de paso h=0.2

    c. Usando el algoritmo, aproxime la solución entre t=0 a t=10 s, adjunte sus resultados en la evaluación.

    d. Realice una observación sobre el movimiento estimado del péndulo a lo largo del tiempo.

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

    Referencia: 2Eva_IT2019_T2 Péndulo vertical

    Vista general de ecuaciones diferenciales I Capítulo 1, 6min 54s. 3Blue1Brown 31-Marzo-2023.

  • s2Eva_2023PAOI_T1 Material para medalla de academia

    Ejercicio: 2Eva_2023PAOI_T1 Material para medalla de academia

    medalla área con integral numérico f(x) = 2-8\Big( \frac{1}{2} - x \Big)^2

    0 \le x \lt 1 g(x) = -\Big( 1-x\Big)\ln \Big( 1- x \Big)

    Para f(x) se usará Simpson de 1/3 que requiere al menos dos tramos para aplicar:

    a. Realice el planteamiento de las ecuaciones para el ejercicio.

    I\cong \frac{h}{3}[f(x_0)+4f(x_1) + f(x_2)]

    b. Describa el criterio usado para determinar el número de tramos usado en cada caso.

    h = \frac{b-a}{2} = \frac{1-0}{2} = 0.5

    c. Desarrolle las expresiones completas del ejercicio para cada función.

    I_{fx}\cong \frac{0.5}{3}[f(0)+4f(0.5) + f(1)] f(0) = 2-8\Big( \frac{1}{2} - (0) \Big)^2 = 0 f(0.5) = 2-8\Big( \frac{1}{2} - (0.5) \Big)^2 = 2 f(1) = 2-8\Big( \frac{1}{2} - (1) \Big)^2 = 0 I_{fx} = \frac{1}{6}[0+4(2) + 0] = \frac{8}{6} = \frac{4}{3} = 1.3333

    cota de error O(h5) = O(0.55)= O(0.03125)

    Para g(x) se usará Simpson de 3/8 que requiere al menos tres tramos para aplicar:

    I\cong \frac{3h}{8}[f(x_0)+3f(x_1) +3 f(x_2)+f(x_3)] h = \frac{b-a}{3} = \frac{1-0}{3} = 0.3333 I_{gx}\cong \frac{3(0.3333)}{8}[f(0)+3f(0.3333) +3 f(0.6666)+f(1)] g(0) = -\Big( 1-0\Big)\ln \Big( 1- 0 \Big) = 0 g(0.3333) = -\Big( 1-0.3333\Big)\ln \Big( 1- 0.3333 \Big) = 0.2703 g(0.6666) = -\Big( 1-0.6666\Big)\ln \Big( 1- 0.6666 \Big) = 0.3662 g(0.9999) = -\Big( 1-0.9999\Big)\ln \Big( 1- 0.9999 \Big) = 0

    para la evaluación numérica de 1 se usa un valor muy cercano desplazado con la tolerancia aplicada.

    I_{gx}\cong \frac{3(0.3333)}{8}[0+3(0.2703) + 3(0.3662)+0] = 0.2387

    d. Indique el resultado obtenido para el área requerida y la cota de error
    Area = I_{fx} - I_{gx} = 1.3333 - 0.2387 = 1.0945

    cota de error = O(0.03125) + O(0.00411) = 0.03536

    e. Encuentre el valor del tamaño de paso si se requiere una cota de error de 0.00032

    Si el factor de mayor error es de Simpson 1/3, se considera como primera aproximación que:

    cota de error O(h5) = O(0.00032), h = (0.00032)(1/5) = 0.2
    es decir el número de tramos es de al menos (b-a)/tramos = 0.2 , tramos = 5.
    El número de tramos debe ser par en Simpson de 1/3, por lo que se toma el entero mayor tramos=6 y el tamaño de paso recomendado es al menos 1/6. EL error al aplicar 3 veces la formula es 3(O((1/6)5)) = 0.0003858.

    Lo que podría indicar que es necesario al menos dos tramos adicionales con h=1/8 y error O(0,00012) que cumple con el requerimiento.

    Se puede aplicar el mismo criterio para Simpson 3/8 y se combinan los errores para verificar que cumplen con el requerimiento.

    Algoritmo con Python

    Resultados

    Ifx:  1.3333332933359998
    Igx:  0.238779092876627
    Area:  1.094554200459373

    medalla area con integral numerico

    Instrucciones en Python usando las funciones

    # 2Eva_2023PAOI_T1 Material para medalla de academia
    import numpy as np
    import matplotlib.pyplot as plt
    
    def integrasimpson13_fi(xi,fi,tolera = 1e-10):
        ''' sobre muestras de fi para cada xi
            integral con método de Simpson 1/3
            respuesta es np.nan para tramos desiguales,
            no hay suficientes puntos.
        '''
        n = len(xi)
        i = 0
        suma = 0
        while not(i>=(n-2)):
            h = xi[i+1]-xi[i]
            dh = abs(h - (xi[i+2]-xi[i+1]))
            if dh<tolera:# tramos iguales
                unS13 = (h/3)*(fi[i]+4*fi[i+1]+fi[i+2])
                suma = suma + unS13
            else:  # tramos desiguales
                suma = 'tramos desiguales'
            i = i + 2
        if i<(n-1): # incompleto, faltan tramos por calcular
            suma = 'tramos incompletos, faltan '
            suma = suma ++str((n-1)-i)+' tramos'
        return(suma)
    
    def integrasimpson38_fi(xi,fi,tolera = 1e-10):
        ''' sobre muestras de fi para cada xi
            integral con método de Simpson 3/8
            respuesta es np.nan para tramos desiguales,
            no hay suficientes puntos.
        '''
        n = len(xi)
        i = 0
        suma = 0
        while not(i>=(n-3)):
            h  = xi[i+1]-xi[i]
            h1 = (xi[i+2]-xi[i+1])
            h2 = (xi[i+3]-xi[i+2])
            dh = abs(h-h1)+abs(h-h2)
            if dh<tolera:# tramos iguales
                unS38 = fi[i]+3*fi[i+1]+3*fi[i+2]+fi[i+3]
                unS38 = (3/8)*h*unS38
                suma = suma + unS38
            else:  # tramos desiguales
                suma = 'tramos desiguales'
            i = i + 3
        if (i+1)<n: # incompleto, tramos por calcular
            suma = 'tramos incompletos, faltan '
            suma = suma +str(n-(i+1))+' tramos'
        return(suma)
    
    # INGRESO
    fx = lambda x: 2-8*(0.5-x)**2
    gx = lambda x: -(1-x)*np.log(1-x)
    a = 0
    b = 1-1e-4
    muestras1 = 2+1
    muestras2 = 3+1
    
    # PROCEDIMIENTO
    xi1 = np.linspace(a,b,muestras1)
    xi2 = np.linspace(a,b,muestras2)
    fi = fx(xi1)
    gi = gx(xi2)
    
    Ifx = integrasimpson13_fi(xi1,fi)
    Igx = integrasimpson38_fi(xi2,gi)
    Area = Ifx - Igx
    
    # SALIDA
    print('Ifx: ', Ifx)
    print('Igx: ', Igx)
    print('Area: ', Area)
    
    plt.plot(xi1,fi,'ob',label='f(x)')
    plt.plot(xi2,gi,'or', label='g(x)')
    plt.grid()
    plt.legend()
    plt.xlabel('xi')
    
    # curvas suave con mas muestras (no en evaluación)
    xi = np.linspace(a,b,51)
    fxi = fx(xi)
    gxi = gx(xi)
    plt.fill_between(xi,fxi,gxi,color='navajowhite')
    plt.plot(xi,fxi,color='blue',linestyle='dotted')
    plt.plot(xi,gxi,color='red',linestyle='dotted')
    
    plt.show()
    
  • 2Eva_2023PAOI_T1 Material para medalla de academia

    2da Evaluación 2023-2024 PAO I. 29/Agosto/2023

    Tema 1 (30 puntos) medalla area con integral numerico
    Una academia encarga a un joyero un modelo de medalla cuyo costo unitario se determina por el área descrita entre las funciones f(x) y g(x) presentadas.

    Se considera que el grosor de la medalla es único e independiente de la forma de la medalla.

    f(x) = 2-8\Big( \frac{1}{2} - x \Big)^2 0 \le x \lt 1 g(x) = -\Big( 1-x\Big)\ln \Big( 1- x \Big)

    Para el desarrollo numérico, use diferentes métodos de Simpson para cada función.

    a. Realice el planteamiento de las ecuaciones para el ejercicio.

    b. Describa el criterio usado para determinar el número de tramos usado en cada caso.

    c. Desarrolle las expresiones completas del ejercicio para cada función.

    d. Indique el resultado obtenido para el área requerida y la cota de error.

    e. Encuentre el valor del tamaño de paso si se requiere una cota de error de 0.00032

    Nota: en Python ln(x) se escribe np.log(x).

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

    Referencia: Star Trek https://intl.startrek.com/
    ¿A quien se le ocurrió crear la moneda? | Discovery en Español Youtube.com 8 nov 2016.

  • s1Eva_2023PAOI_T3 Recoger los restos de sumergible

    ejercicio: 1Eva_2023PAOI_T3 Recoger los restos de sumergible

    literal a

    Para realizar el planteamiento del ejercicio, se realiza la gráfica para observar mejor los puntos.

    recorrido de polinomio

    Se podría observar los puntos y plantear un primer recorrido como el siguiente

    Rov Sumergible Polinomio01a

    los puntos corresponden a los índices j = [0 ,2, 5, 6, 11]:

    # INGRESO
    xj = np.array([0.2478, 0.6316, 1.3802, 2.4744, 2.7351, 2.8008,
                   3.5830, 3.6627, 3.7213, 4.2796, 4.3757, 4.6794])
    fj = np.array([1.8108, 0.1993, 4.7199, 2.4529, 2.3644, 3.5955,
                   2.6558, 4.3657, 4.1932, 4.6998, 4.7536, 1.5673])
    
    # selecionando puntos
    j = [0, 2, 5, 6, 11]
    xi = xj[j]
    fi = fj[j]
    

    literal b

    Partiendo del algoritmo de Diferencias divididas de Newton, y añadiendo vectores xj y fj para todos los puntos dados en el ejercicio.

    Tabla Diferencia Dividida
    [['i   ', 'xi  ', 'fi  ', 'F[1]', 'F[2]', 'F[3]', 'F[4]', 'F[5]']]
    [[ 0.      0.2478  1.8108  2.569  -1.3163  0.3389 -0.0561  0.    ]
     [ 1.      1.3802  4.7199 -0.7915 -0.1861  0.09    0.      0.    ]
     [ 2.      2.8008  3.5955 -1.2014  0.111   0.      0.      0.    ]
     [ 3.      3.583   2.6558 -0.9928  0.      0.      0.      0.    ]
     [ 4.      4.6794  1.5673  0.      0.      0.      0.      0.    ]]
    dDividida: 
    [ 2.569  -1.3163  0.3389 -0.0561  0.    ]
    polinomio: 
    2.56896856234546*x - 0.0561488275125463*(x - 3.583)*(x - 2.8008)*(x - 1.3802)*(x - 0.2478) 
    + 0.338875729488637*(x - 2.8008)*(x - 1.3802)*(x - 0.2478) 
    - 1.31628089036375*(x - 1.3802)*(x - 0.2478) + 1.17420959025079
    polinomio simplificado: 
    -0.0561488275125463*x**4 + 0.788728905753656*x**3 
    - 3.98331084054791*x**2 + 7.41286537452727*x 
    + 0.206696844067185
    >>>

    usando la tabla de diferencias divididas se plantea la expresión para el polinomio:

    p(x) = 1.8108 + 2.569 (x-0.2478) + + (-1.3163)(x-0.2478)(x-1.3802) + + 0.3389 (x-0.2478)(x-1.3802)(x-2.8008) + + (-0.0561)(x-0.2478)(x-1.3802)(x-2.8008)(x-3.583)

    el algoritmo simplifica la expresión al siguiente polinomio,

    p(x) = -0.0561 x^4 + 0.7887 x^3 - 3.9833 x^2 + 7.4128 x + 0.2066

    literal c

    Se usa el algoritmo Interpolación polinómica de Lagrange con Python para desarrollar el polinomio a partir de los puntos no usados en el literal anterior.

    j = [3,4,7,8,9,10]

    Para evitar oscilaciones grandes, se excluye el punto con índice 1, y se obtiene una opción mostrada:

    Rov Sumergible Polinomio 02a

    con el siguiente resultado:

        valores de fi:  [2.4529 2.3644 4.3657 4.1932 4.6998 4.7536]
    divisores en L(i):  [-1.32578996  0.60430667 -0.02841115  0.02632723 -0.09228243  0.13986517]
    
    Polinomio de Lagrange, expresiones
    -1.85014223337671*(x - 4.3757)*(x - 4.2796)*(x - 3.7213)*(x - 3.6627)*(x - 2.7351) 
    + 3.9125829809921*(x - 4.3757)*(x - 4.2796)*(x - 3.7213)*(x - 3.6627)*(x - 2.4744) 
    - 153.661523787291*(x - 4.3757)*(x - 4.2796)*(x - 3.7213)*(x - 2.7351)*(x - 2.4744) 
    + 159.272361555669*(x - 4.3757)*(x - 4.2796)*(x - 3.6627)*(x - 2.7351)*(x - 2.4744) 
    - 50.928437685792*(x - 4.3757)*(x - 3.7213)*(x - 3.6627)*(x - 2.7351)*(x - 2.4744) 
    + 33.9870187307222*(x - 4.2796)*(x - 3.7213)*(x - 3.6627)*(x - 2.7351)*(x - 2.4744)
    
    Polinomio de Lagrange: 
    -9.26814043907703*x**5 + 163.708008152209*x**4 
    - 1143.16428460497*x**3 + 3941.13583467614*x**2 
    - 6701.74628786718*x + 4496.64364271972
    >>> 
    

    Para presentar la parte analítica puede seleccionar menos puntos, se busca mostrar la aplicación del algoritmo, no necesariamente cuan largo puede ser.

    p(x) = + 2.4529\frac{(x - 4.3757)(x - 4.2796)(x - 3.7213)(x - 3.6627)(x - 2.7351) }{(2.4744 - 4.3757)(2.4744 - 4.2796)(2.4744 - 3.7213)(2.4744 - 3.6627)(2.4744 - 2.7351)} + 2.3644\frac{ (x - 4.3757)(x - 4.2796)(x - 3.7213)(x - 3.6627)(x - 2.4744) }{(2.7351 - 4.3757)(2.7351 - 4.2796)(2.7351 - 3.7213)(2.7351 - 3.6627)(2.7351 - 2.4744)} +4.3657\frac{(x - 4.3757)(x - 4.2796)(x - 3.7213)(x - 2.7351)(x - 2.4744) }{(3.6627 - 4.3757)(3.6627 - 4.2796)(3.6627 - 3.7213)(3.6627 - 2.7351)(3.6627 - 2.4744)} + 4.1932 \frac{(x - 4.3757)(x - 4.2796)(x - 3.6627)(x - 2.7351)(x - 2.4744) }{(3.7213 - 4.3757)(3.7213 - 4.2796)(3.7213 - 3.6627)(3.7213 - 2.7351)(3.7213 - 2.4744)} +4.6998\frac{(x - 4.3757)(x - 3.7213)(x - 3.6627)(x - 2.7351)(x - 2.4744) }{(4.2796 - 4.3757)(4.2796 - 3.7213)(4.2796 - 3.6627)(4.2796 - 2.7351)(4.2796 - 2.4744)} + 4.7536 \frac{(x - 4.2796)(x - 3.7213)(x - 3.6627)(x - 2.7351)(x - 2.4744)}{(4.3757 - 4.2796)(4.3757 - 3.7213)(4.3757 - 3.6627)(4.3757 - 2.7351)(4.3757 - 2.4744)}

    literal d

    las gráficas se han presentado en el planteamiento para justificar los criterios usados.

    literal e

    Los errores de encuentran como la diferencia de los puntos no usados en el polinomio, y evaluando el polinomio en cada coordenada x.

    Como las propuestas de polinomio pueden ser variadas se obtendrán diferentes respuestas para cada literal.

    Se revisa la aplicación de conceptos en las propuestas.

     

    Algoritmos usados

    literal b. Diferencias divididas de Newton

    # 1Eva_2023PAOI_T3 Recoger los restos de sumergible
    # 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
    xj = np.array([0.2478, 0.6316, 1.3802, 2.4744, 2.7351, 2.8008,
                   3.5830, 3.6627, 3.7213, 4.2796, 4.3757, 4.6794])
    fj = np.array([1.8108, 0.1993, 4.7199, 2.4529, 2.3644, 3.5955,
                   2.6558, 4.3657, 4.1932, 4.6998, 4.7536, 1.5673])
    
    # selecionando puntos
    j = [0, 2, 5, 6, 11]
    xi = xj[j]
    fi = fj[j]
    
    
    # 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)
    
    # 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)
    
    # Gráfica
    plt.plot(xj,fj,'o',color='red')
    plt.plot(xi,fi,'o', label = 'Puntos')
    ##for i in range(0,n,1):
    ##    plt.axvline(xi[i],ls='--', color='yellow')
    
    plt.plot(pxi,pfi, label = 'Polinomio')
    plt.legend()
    plt.grid()
    plt.xlabel('xi')
    plt.ylabel('fi')
    plt.title('Diferencias Divididas - Newton')
    plt.show()
    
    

    literal c. Polinomio de Lagrange

    # 1Eva_2023PAOI_T3 Recoger los restos de sumergible
    # Interpolacion de Lagrange
    # divisoresL solo para mostrar valores
    import numpy as np
    import sympy as sym
    import matplotlib.pyplot as plt
    
    # INGRESO , Datos de prueba
    xj = np.array([0.2478, 0.6316, 1.3802, 2.4744, 2.7351, 2.8008,
                   3.5830, 3.6627, 3.7213, 4.2796, 4.3757, 4.6794])
    fj = np.array([1.8108, 0.1993, 4.7199, 2.4529, 2.3644, 3.5955,
                   2.6558, 4.3657, 4.1932, 4.6998, 4.7536, 1.5673])
    
    # selecionando puntos
    #j = [0, 2, 5, 6, 11]
    j = [3,4,7,8,9,10]
    xi = xj[j]
    fi = fj[j]
    
    # 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)
    
    # 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)
    
    # Gráfica
    plt.plot(xj,fj,'o',color='red')
    plt.plot(xi,fi,'o', label = 'Puntos')
    plt.plot(pxi,pfi, label = 'Polinomio')
    plt.legend()
    plt.grid()
    plt.xlabel('xi')
    plt.ylabel('fi')
    plt.title('Interpolación Lagrange')
    plt.show()