Categoría: Solución 2da Eva

  • s2Eva_2022PAOII_T3 EDP Parabólica con coseno 3/4π

    Ejercicio: 2Eva_2022PAOII_T3 EDP Parabólica con coseno 3/4π

    \frac{\partial^2 u}{\partial x^2} = b \frac{\partial u}{\partial t}

    2Eva_2022PAOII_T3 EDP Parabolica Malla

    \frac{u_{i+1,j}-2u_{i,j}+u_{i-1,j}}{(\Delta x)^2} = b\frac{u_{i,j+1}-u_{i,j}}{\Delta t}

    agrupando variables

    \frac{\Delta t}{b} \frac{u_{i+1,j}-2u_{i,j}+u_{i-1,j}}{(\Delta x)^2} = \frac{\Delta t}{b}b\frac{u_{i,j+1}-u_{i,j}}{\Delta t} λ = \frac{\Delta t}{b(\Delta x)^2} λ = \frac{0.002}{2(0.2)^2} =0.025

    como λ<0.5 el método converge.

    \lambda \Big[u[i+1,j]-2u[i,j]+u[i-1,j]\Big] = u[i,j+1]-u[i,j]

    por el método explícito:

    u[i,j+1] =\lambda \Big[u[i+1,j]-2u[i,j]+u[i-1,j]\Big] + u[i,j] u[i,j+1] =\lambda u[i+1,j]+(1-2\lambda)u[i,j]+\lambda u[i-1,j]

    iteración i=1, j=0

    u[1,1] =\lambda u[0,0]+(1-2\lambda)u[1,0]+\lambda u[2,0] u[1,1] =0.025(1) +(1-2(0.025))\cos \Big( \frac{3π}{2}0.2\Big)+0.025 \cos \Big( \frac{3π}{2}0.4\Big)

    iteración i=2, j=0

    u[2,1] =\lambda u[1,0]+(1-2\lambda)u[2,0]+\lambda u[3,0] u[2,1] =0.025\cos \Big( \frac{3π}{2}0.2\Big) +(1-2(0.025))\cos \Big( \frac{3π}{2}0.4\Big) +0.025 \cos \Big( \frac{3π}{2}0.6\Big)

    iteración i=3, j=0

    u[3,1] =\lambda u[2,0]+(1-2\lambda)u[3,0]+\lambda u[4,0] u[3,1] =0.025\cos \Big( \frac{3π}{2}0.4\Big) +(1-2(0.025))\cos \Big( \frac{3π}{2}0.6\Big) +0.025 \cos \Big( \frac{3π}{2}0.8\Big)

    iteración i=4, j=0

    u[4,1] =\lambda u[3,0]+(1-2\lambda)u[4,0]+\lambda u[5,0] u[4,1] =0.025\cos \Big( \frac{3π}{2}0.6\Big) +(1-2(0.025))\cos \Big( \frac{3π}{2}0.8\Big) +0.025 (0)

    continuar con las iteraciones en el algoritmo

    Resultados con el algoritmo

    Tabla de resultados
    [[ 1.    1.    1.    1.    1.    1.    1.    1.    1.    1.  ]
     [ 0.59  0.58  0.56  0.55  0.54  0.53  0.53  0.52  0.51  0.5 ]
     [-0.31 -0.3  -0.3  -0.29 -0.28 -0.28 -0.27 -0.27 -0.26 -0.26]
     [-0.95 -0.93 -0.91 -0.89 -0.88 -0.86 -0.84 -0.82 -0.81 -0.79]
     [-0.81 -0.79 -0.78 -0.76 -0.74 -0.73 -0.71 -0.7  -0.68 -0.67]
     [ 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.  ]]
    

    2Eva2022PAOII_T3 EDP Parabolica 02

    Instrucciones en Python

    # EDP parabólicas d2u/dx2  = K du/dt
    # método explícito,usando diferencias divididas
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    # Valores de frontera
    Ta = 1
    Tb = 0
    #T0 = 25
    fx = lambda x: np.cos(3*np.pi/2*x)
    # longitud en x
    a = 0
    b = 1
    # Constante K
    K = 2
    # Tamaño de paso
    dx = 0.2
    dt = dx/100
    # iteraciones en tiempo
    n = 10
    
    # PROCEDIMIENTO
    # iteraciones en longitud
    xi = np.arange(a,b+dx,dx)
    fi = fx(xi)
    m = len(xi)
    ultimox = m-1
    
    # Resultados en tabla u[x,t]
    u = np.zeros(shape=(m,n), dtype=float)
    
    # valores iniciales de u[:,j]
    j=0
    ultimot = n-1
    u[0,:]= Ta
    u[1:ultimox,j] = fi[1:ultimox]
    u[ultimox,:] = Tb
    
    # factores P,Q,R
    lamb = dt/(K*dx**2)
    P = lamb
    Q = 1 - 2*lamb
    R = lamb
    
    # Calcula U para cada tiempo + dt
    j = 0
    while not(j>=ultimot): # igual con lazo for
        for i in range(1,ultimox,1):
            u[i,j+1] = P*u[i-1,j] + Q*u[i,j] + R*u[i+1,j]
        j=j+1
    
    # SALIDA
    print('Tabla de resultados')
    np.set_printoptions(precision=2)
    print(u)
    
    # Gráfica
    salto = int(n/10)
    if (salto == 0):
        salto = 1
    for j in range(0,n,salto):
        vector = u[:,j]
        plt.plot(xi,vector)
        plt.plot(xi,vector, '.r')
        
    plt.xlabel('x[i]')
    plt.ylabel('t[j]')
    plt.title('Solución EDP parabólica')
    plt.show()
    
  • s2Eva_2022PAOII_T2 EDO - población de protestantes en una sociedad

    Ejercicio: 2Eva_2022PAOII_T2 EDO - población de protestantes en una sociedad

    \frac{\delta}{\delta t}x(t) = b x(t) - d (x(t))^2 \frac{\delta}{\delta t}y(t) = b y(t) - d (y(t))^2 +r b (x(t)-y(t))

    literal a

    simplificando la nomenclatura

    x' = b x - d x^2 y' = b y - d y^2 +r b (x-y)

    sustituyendo constantes, y considerando x(0)=1 ; y(0)=0.01 ; h=0.5

    x' = 0.02 x - 0.015 x^2 y' = 0.02 y - 0.015 y^2 +0.1(0.02) (x-y)

    el planteamiento de Runge Kutta se hace junto a la primera iteración, además de encontrarse en las instrucciones con Python.

    literal b

    Se describen 3 iteraciones usando los resultados de la tabla con el algoritmo, para mostrar la comprensión del algoritmo.

    t = 0
    K1x = 0.5 (0.02 (1) - 0.015 (1)2 = 0.0025
    K1y = 0.5(0.02 (0.01) - 0.015 (0.01)2 +0.1(0.02) (1-0.01)= 0.001089

    K2x = 0.5 (0.02 (1+0.0025) - 0.015 (1+0.0025)2= 0.00248
    K2y = 0.5(0.02 (0.01+0.00108) - 0.015 (0.01+0.00108)2+0.1(0.02) ((1+0.0025)-(0.01+0.00108)) = 0.001101

    x1 = 1 + (1/2)(0.0025+0.00248) = 1.0025
    y1 = 0.01 + (1/2)(0.001089+0.001101) = 0.01109
    t1 = 0 + 0.5 =0.5

    t=0.5
    K1x = 0.5 (0.02 (1.0025) - 0.015 (1.0025)2 = 0.002487
    K1y = 0.5(0.02 (0.01109) - 0.015 (0.01109)2 +0.1(0.02) (1.0025-0.01109)= 0.001101

    K2x = 0.5 (0.02 (1.0025+ 0.002487) - 0.015 (1.0025+ 0.002487)2= 0.002474
    K2y = 0.5(0.02 (0.01109+0.001101) - 0.015 (0.01109+0.001101)2+0.1(0.02) ((1.0025+ 0.002487)-(0.01109+0.001101)) = 0.001113

    x2 = 1.0025 + (1/2)(0.002487+0.002474) = 1.0050
    y2 = 0.01109 + (1/2)(0.001101+0.001113) = 0.01220
    t2 = 0.5 + 0.5 = 1

    t=1
    K1x = 0.5 (0.02 (1.0050) - 0.015 (1.0050)2 = 0.002474
    K1y = 0.5(0.02 (0.01220) - 0.015 (0.01220)2 +0.1(0.02) (1.0050-0.01220)= 0.001113

    K2x = 0.5 (0.02 (1.0050+ 0.002474) - 0.015 (1.0050+ 0.002474)2= 0.002462
    K2y = 0.5(0.02 (0.01220+0.001113) - 0.015 (0.01220+0.001113)2+0.1(0.02) ((1.0050+ 0.002474)-(0.01220+0.001113)) = 0.001126

    x3 = 1.0050 + (1/2)(0.002474+0.002462) = 1.0074
    y3 = 0.01220 + (1/2)(0.001113+0.001126) = 0.01332
    t3 = 1 + 0.5 = 1.5

    Resultado con el algoritmo

    Para obtener los datos de las iteraciones, primero se ejecuta el algoritmo para pocas iteraciones.
    Para la pregunta sobre 200 años, se incrementa las iteraciones a 2 por año y las condiciones iniciales, es decir 401 muestras.

     [ ti, xi, yi]
     [ ti, xi, yi]
    [[0.0000e+00 1.0000e+00 1.0000e-02 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00]
     [5.0000e-01 1.0025e+00 1.1095e-02 2.5000e-03 1.0892e-03 2.4875e-03 1.1014e-03]
     [1.0000e+00 1.0050e+00 1.2203e-02 2.4875e-03 1.1014e-03 2.4749e-03 1.1136e-03]
     [1.5000e+00 1.0074e+00 1.3323e-02 2.4749e-03 1.1137e-03 2.4623e-03 1.1260e-03]
     [2.0000e+00 1.0099e+00 1.4455e-02 2.4624e-03 1.1260e-03 2.4497e-03 1.1384e-03]
     [2.5000e+00 1.0123e+00 1.5600e-02 2.4498e-03 1.1384e-03 2.4371e-03 1.1509e-03]
     [3.0000e+00 1.0148e+00 1.6757e-02 2.4371e-03 1.1509e-03 2.4245e-03 1.1634e-03]
     [3.5000e+00 1.0172e+00 1.7926e-02 2.4245e-03 1.1635e-03 2.4118e-03 1.1761e-03]
     [4.0000e+00 1.0196e+00 1.9109e-02 2.4118e-03 1.1761e-03 2.3991e-03 1.1888e-03]
    ...
     [1.9950e+02 1.3252e+00 1.1561e+00 ... 1.7202e-03 8.1217e-05 1.7059e-03]
     [2.0000e+02 1.3252e+00 1.1578e+00 ... 1.7060e-03 8.0418e-05 1.6918e-03]
     [2.0050e+02 1.3253e+00 1.1595e+00 ... 1.6919e-03 7.9628e-05 1.6778e-03]]
    >>> 
    

    Observación: La población identificada como protestante, continua creciendo, mientras que la proporción de "conformistas" se reduce según los parámetros indicados en el ejercicio. Los valores de natalidad y defunción cambian con el tiempo mucho más en años por otras variables, por lo que se deben realizar ajustes si se pretende extender el modelo.

    2Eva2022PAOII_T2 poblacion protestantes
    Instrucciones en Python

    # Modelo predador-presa de Lotka-Volterra
    # Sistemas EDO con Runge Kutta de 2do Orden
    import numpy as np
    
    def rungekutta2_fg(f,g,t0,x0,y0,h,muestras):
        tamano = muestras +1
        tabla = np.zeros(shape=(tamano,7),dtype=float)
        tabla[0] = [t0,x0,y0,0,0,0,0]
        ti = t0
        xi = x0
        yi = y0
        for i in range(1,tamano,1):
            K1x = h * f(ti,xi,yi)
            K1y = h * g(ti,xi,yi)
            
            K2x = h * f(ti+h, xi + K1x, yi+K1y)
            K2y = h * g(ti+h, xi + K1x, yi+K1y)
    
            xi = xi + (1/2)*(K1x+K2x)
            yi = yi + (1/2)*(K1y+K2y)
            ti = ti + h
            
            tabla[i] = [ti,xi,yi,K1x,K1y,K2x,K2y]
        tabla = np.array(tabla)
        return(tabla)
    
    # PROGRAMA ------------------
    
    # INGRESO
    # Parámetros de las ecuaciones
    b = 0.02
    d = 0.015
    r = 0.1
    
    # Ecuaciones
    f = lambda t,x,y : (b-d*x)*x
    g = lambda t,x,y : (b-d*y)*y + r*b*(x-y)
    
    # Condiciones iniciales
    t0 = 0
    x0 = 1
    y0 = 0.01
    
    # parámetros del algoritmo
    h = 0.5
    muestras = 401
    
    # PROCEDIMIENTO
    tabla = rungekutta2_fg(f,g,t0,x0,y0,h,muestras)
    ti = tabla[:,0]
    xi = tabla[:,1]
    yi = tabla[:,2]
    
    # SALIDA
    np.set_printoptions(precision=6)
    print(' [ ti, xi, yi, K1x, K1y, K2x, K2y]')
    print(tabla)
    
    # Grafica tiempos vs población
    import matplotlib.pyplot as plt
    
    plt.plot(ti,xi, label='xi poblacion')
    plt.plot(ti,yi, label='yi protestante')
    
    plt.title('población y protestantes')
    plt.xlabel('t años')
    plt.ylabel('población')
    plt.legend()
    plt.grid()
    plt.show()
    
    # gráfica xi vs yi
    plt.plot(xi,yi)
    
    plt.title('población y protestantes [xi,yi]')
    plt.xlabel('x población')
    plt.ylabel('y protestantes')
    plt.grid()
    plt.show()
    
  • s2Eva_2022PAOII_T1 Altura de cohete en 30 segundos

    Ejercicio: 2Eva_2022PAOII_T1 Altura de cohete en 30 segundos

    literal a

    v = u \ln\Big(\frac{m_0}{m_0-qt}\Big) - gt v = 1800 \ln\Big(\frac{160000}{160000-2500t}\Big) - 9.8t

    Seleccionando el método de Simpson de 3/8, se requieren al menos 3 tramos o segmentos para usarlo, que generan 4 muestras. El vector de tiempo se obtiene como:

    v = lambda t: 1800*np.log(160000/(160000-2500*t))-9.8*t
    a = 0
    b = 30
    tramos = 3
    h = (b-a)/tramos
    ti = np.linspace(a,b,tramos+1)
    vi = v(ti)
    

    siendo los vectores:

    ti = [ 0. 10. 20. 30.]
    vi = [ 0. 207.81826623 478.44820899 844.54060574]
    

    la aplicación del método de Simpson de 3/8 es:

    I = \frac{3}{8}(10) \Bigg(1800 \ln\Big(\frac{160000}{160000-2500(0)}\Big) - 9.8(0) +3(1800 \ln\Big(\frac{160000}{160000-2500(10)}\Big) - 9.8(10)) +3(1800 \ln\Big(\frac{160000}{160000-2500(20)}\Big) - 9.8(20)) +1800 \ln\Big(\frac{160000}{160000-2500(30)}\Big) - 9.8(30) \Bigg) = I = \frac{3}{8}(10) \Big(v(0)+3(v(10))+3(v(20))+v(30) \Big) I = \frac{3}{8}(10) \Big(0+3(207.81)+3(478.44)+844.54 \Big) I = 10887.52

    literal b

    para el primer segmento se usa t entre [0,10]

    x_a = \frac{0+10}{2} + \frac{1}{\sqrt{3}}\frac{10-0}{2} = 7.88 x_b = \frac{0+10}{2} - \frac{1}{\sqrt{3}}\frac{10-0}{2} = 2.11 I = \frac{10-0}{2}\Big(v(7.88)+v(2.11)\Big)=995.79

    para el 2do segmento se usa t entre [10,20]

    x_a = \frac{10+20}{2} + \frac{1}{\sqrt{3}}\frac{20-10}{2} = 17.88 x_b = \frac{10+20}{2} - \frac{1}{\sqrt{3}}\frac{20-10}{2} = 12.11 I = \frac{20-10}{2}\Big(v(17.88)+v(12.11)\Big) =3368.42

    para el 3er segmento se usa t entre [20,30]

    x_a = \frac{20+30}{2} + \frac{1}{\sqrt{3}}\frac{30-20}{2} = 27.88 x_b = \frac{20+30}{2} - \frac{1}{\sqrt{3}}\frac{30-20}{2} = 22.11 I = \frac{30-20}{2}\Big(v(27.88)+v(22.11)\Big) = 6515.23 Altura = 995.79+ 3368.42 + 6515.23 = 10879.44

    literal c

    el error es la diferencia entre los métodos
    error_entre = |10887.52-10879.44| = 8.079

    Resultados con algoritmo

    Método de Simpon 3/8
    ti
    [ 0. 10. 20. 30.]
    vi
    [ 0. 207.81826623 478.44820899 844.54060574]
    Altura con Simpson 3/8 : 10887.52511781406
    segmento Cuad_Gauss :    [995.792, 3368.421, 6515.231]
    Altura Cuadratura Gauss: 10879.445437288954
    diferencia s3/8 y Cuad_Gauss: 8.079680525106596
    >>>

    Instrucciones en Python

    # 2Eva_2022PAOII_T1 Altura de cohete en 30 segundos
    import numpy as np
    
    # INGRESO
    v = lambda t: 1800*np.log(160000/(160000-2500*t))-9.8*t
    a = 0
    b = 30
    tramos = 3
    
    # PROCEDIMIENTO literal a
    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)
    
    h = (b-a)/tramos
    ti = np.linspace(a,b,tramos+1)
    vi = v(ti)
    altura = integrasimpson38_fi(ti,vi)
    
    # SALIDA
    print('Método de Simpon 3/8')
    print('ti')
    print(ti)
    print('vi')
    print(vi)
    print('Altura con Simpson 3/8 :',altura)
    
    # PROCEDIMIENTO literal b
    # cuadratura de Gauss de dos puntos
    def integraCuadGauss2p(funcionx,a,b):
        x0 = -1/np.sqrt(3)
        x1 = -x0
        xa = (b+a)/2 + (b-a)/2*(x0)
        xb = (b+a)/2 + (b-a)/2*(x1)
        area = ((b-a)/2)*(funcionx(xa) + funcionx(xb))
        return(area)
    
    area = 0
    area_i =[]
    for i in range(0,tramos,1):
        deltaA = integraCuadGauss2p(v,ti[i],ti[i+1])
        area = area + deltaA
        area_i.append(deltaA)
    # SALIDA
    print('segmento Cuad_Gauss :   ', area_i)
    print('Altura Cuadratura Gauss:', area)
    
    print('diferencia s3/8 y Cuad_Gauss:',altura-area)
    
    import matplotlib.pyplot as plt
    plt.plot(ti,vi)
    plt.plot(ti,vi,'o')
    plt.title('v(t)')
    plt.xlabel('t (s)')
    plt.ylabel('v (m/s)')
    plt.grid()
    plt.show()
    
  • s2Eva_2022PAOI_T3 EDP parabólica barra enfriada en centro

    Ejercicio: 2Eva_2022PAOI_T3 EDP parabólica barra enfriada en centro

    Para la ecuación dada con Δx = 1/3, Δt = 0.02, en una revisíón rápida para cumplir la convergencia dt<dx/10, condición que debe verificarse con la expresión obtenida para λ al desarrollar el ejercicio.

    \frac{\partial U}{\partial t} - \frac{1}{9} \frac{\partial ^2 U}{\partial x^2} = 0 0 \leq x \leq 2, t>0

    literal a. gráfica de malla

    2Eva2022PAOI_T3 EDP parabolica 01

    literal b. Ecuaciones de diferencias divididas a usar

    \frac{\partial U}{\partial t} - \frac{1}{9} \frac{\partial ^2 U}{\partial x^2} = 0 \frac{\partial ^2 U}{\partial x^2} = 9 \frac{\partial U}{\partial t} \frac{u_{i+1,j}-2u_{i,j}+u_{i-1,j}}{(\Delta x)^2} = 9 \frac{u_{i,j+1}-u_{i,j}}{\Delta t}

    se agrupan las constantes,

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

    literal d Determine el valor de λ

    \lambda = \frac{\Delta t}{9(\Delta x)^2} =\frac{0.02}{9(1/3)^2} = 0.02

    valor de λ que es menor que 1/2, por lo que el método converge.

    continuando luego con la ecuación general,

    \lambda \Big(u[i-1,j]-2u[i,j]+u[i+1,j] \Big) = u[i,j+1]-u[i,j] \lambda u[i-1,j]-2 \lambda u[i,j] + \lambda u[i+1,j] \Big) = u[i,j+1]-u[i,j]

    literal c. Encuentre las ecuaciones considerando las condiciones dadas en el problema.

    \lambda u[i-1,j]+(1-2 \lambda ) u[i,j] + \lambda u[i+1,j] = u[i,j+1]

    el punto que no se conoce su valor es u[i,j+1] que es la ecuación buscada.

    u[i,j+1] = \lambda u[i-1,j]+(1-2 \lambda ) u[i,j] + \lambda u[i+1,j]

    literal e iteraciones

    iteración  i=1, j=0

    u[1,1] = \lambda u[0,0]+(1-2 \lambda ) u[1,0] + \lambda u[2,0] u[1,1] =0.02 \cos \Big( \frac{\pi}{2}(0-3)\Big) + (1-2(0.02) ) \cos \Big( \frac{\pi}{2}\big(\frac{1}{3}-3\big)\Big) + 0.02 \cos \Big( \frac{\pi}{2}\big( \frac{2}{3}-3\big) \Big) u[1,1] =0.02(0)+(0.96)(-0.5)+0.02(-0.8660)=-0.4973

    iteración  i=2, j=0

    u[2,1] = \lambda u[1,0]+(1-2 \lambda ) u[2,0] + \lambda u[3,0] u[2,1] = 0.02 \cos \Big( \frac{\pi}{2}(\frac{1}{3}-3)\Big) + (1-2(0.02) ) \cos \Big( \frac{\pi}{2}(\frac{2}{3}-3)\Big)+ + 0.02 \cos \Big( \frac{\pi}{2}\big(\frac{3}{3}-3\big)\Big) u[2,1] = 0.02 (-0.5) + (0.96 ) (-0.866025) + 0.02 (-1) =-0.8614

    iteración  i=3, j=0

    u[3,1] = \lambda u[2,0]+(1-2 \lambda ) u[3,0] + \lambda u[4,0] u[3,1] = 0.02 \cos \Big( \frac{\pi}{2}\big( \frac{2}{3}-3\big)\Big)+(1-2 (0.02) ) \cos \Big( \frac{\pi}{2}(1-3)\Big) + + 0.02 \cos \Big( \frac{\pi}{2}\big(\frac{4}{3}-3\big)\Big) u[3,1] = 0.02 (-0.866025)+(0.96 ) (-1) + 0.02 (-0,866025) = -0,9946

    literal f

    la cotas de errores de truncamiento en la ecuación corresponden a segunda derivada O(hx2) y el de primera derivada O(ht), al reemplazar los valores será la suma}

    O(hx2) + O(ht) = (1/3)2 + 0.02 = 0,1311

    literal g

    Resultados usando el algoritmo en Python

    Tabla de resultados
    [[ 0.      0.      0.      0.      0.      0.      0.      0.      0.       0.    ]
     [-0.5    -0.4973 -0.4947 -0.492  -0.4894 -0.4867 -0.4841 -0.4815 -0.479   -0.4764]
     [-0.866  -0.8614 -0.8568 -0.8522 -0.8476 -0.8431 -0.8385 -0.8341 -0.8296  -0.8251]
     [-1.     -0.9946 -0.9893 -0.984  -0.9787 -0.9735 -0.9683 -0.9631 -0.9579  -0.9528]
     [-0.866  -0.8614 -0.8568 -0.8522 -0.8476 -0.8431 -0.8385 -0.8341 -0.8296  -0.8251]
     [-0.5    -0.4973 -0.4947 -0.492  -0.4894 -0.4867 -0.4841 -0.4815 -0.479   -0.4764]
     [ 0.      0.      0.      0.      0.      0.      0.      0.      0.       0.    ]]
    

    2Eva2022PAOI_T3 EDP parabolica 02

    Instrucciones en Python

    # EDP parabólicas d2u/dx2  = K du/dt
    # método explícito, usando diferencias finitas
    # 2Eva_2022PAOI_T3 EDP parabólica barra enfriada en centro
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    # Valores de frontera
    Ta = 0
    Tb = 0
    T0 = lambda x: np.cos((np.pi/2)*(x-3))
    # longitud en x
    a = 0.0
    b = 2.0
    # Constante K
    K = 9
    # Tamaño de paso
    dx = 1/3
    dt = 0.02
    tramos = int(np.round((b-a)/dx,0))
    muestras = tramos + 1
    # iteraciones en tiempo
    n = 10
    
    # PROCEDIMIENTO
    # iteraciones en longitud
    xi = np.linspace(a,b,muestras)
    m = len(xi)
    ultimox = m-1
    
    # Resultados en tabla u[x,t]
    u = np.zeros(shape=(m,n), dtype=float)
    
    # valores iniciales de u[:,j]
    j=0
    ultimot = n-1
    u[0,j]= Ta
    u[1:ultimox,j] = T0(xi[1:ultimox])
    u[ultimox,j] = Tb
    
    # factores P,Q,R
    lamb = dt/(K*dx**2)
    P = lamb
    Q = 1 - 2*lamb
    R = lamb
    
    # Calcula U para cada tiempo + dt
    j = 0
    while not(j>=ultimot):
        u[0,j+1] = Ta
        for i in range(1,ultimox,1):
            u[i,j+1] = P*u[i-1,j] + Q*u[i,j] + R*u[i+1,j]
        u[m-1,j+1] = Tb
        j=j+1
    
    # SALIDA
    print('Tabla de resultados')
    np.set_printoptions(precision=2)
    print(u)
    
    # Gráfica
    salto = int(n/10)
    if (salto == 0):
        salto = 1
    for j in range(0,n,salto):
        vector = u[:,j]
        plt.plot(xi,vector)
        plt.plot(xi,vector, '.r')
    plt.xlabel('x[i]')
    plt.ylabel('t[j]')
    plt.title('Solución EDP parabólica')
    plt.show()
    
    
  • s2Eva_2022PAOI_T2 EDO de circuito RLC con interruptor intermedio

    Ejercicio: 2Eva_2022PAOI_T2 EDO de circuito RLC con interruptor intermedio

    La corriente del inductor y(t) para t≥0 se deriva para tener la expresión solo derivadas:

    \frac{\delta}{\delta t}y(t) + 2 y(t) + 5 \int_{-\infty}^t y(\tau) \delta \tau = 10 \mu(t)

    Para t>0 que es donde transcurre el experimento, el escalón es una constante, se tiene que:

    \frac{\delta ^2}{\delta t^2}y(t) + 2 \frac{\delta}{\delta t}y(t) + 5 y(t) = 0

    tomando las condiciones iniciales dadas para t=0, y(0)=2, y'(0)=--4

    literal a

    EL resultadoes perado es el planteamiento del problema. Se reescribe la ecuación con la nomenclatura simplificada y se resordena segun el modelo del método:

    y'' = - 2y' - 5 y

    luego se sustituye la variable y se convierte a las ecuaciones:

    z =y' = f_x(t,y,z) z' = - 2z - 5 y = g_z(t,y,z)

    se usa una tabla para llevar el registro de operaciones:

    Se plantea las operaciones:

    K1y = h * f(ti,yi,zi)
    K1z = h * g(ti,yi,zi)
    
    K2y = h * f(ti+h, yi + K1y, zi + K1z)
    K2z = h * g(ti+h, yi + K1y, zi + K1z)
    
    yi = yi + (K1y+K2y)/2
    zi = zi + (K1z+K2z)/2
    ti = ti + h

    literal b

    El resultado esperado es la aplicación correcta de los valores en las expresiones para al menos tres iteraciones usando h=0.01

    itera = 0

    K1y = 0.01 y'(0) = 0.01(-4) = -0.04 K1z = 0.01 (- 2z(0) - 5 y(0)) = 0.01(- 2(-4) - 5 (2)) = -0.02 K2y = 0.01 (-4-0.02) = -0.0402 K2z = 0.01 (-2(-4-0.02)-5(2-0.04)) = -0.0176 yi = yi + \frac{K1y+K2y}{2} = 2+\frac{-0.04-0.0402} {2} = 1.9599 zi = zi + \frac{K1z+K2z}{2} = -4 +\frac{-0.02-0.0176}{2} = -4.0188 ti = ti + h = 0+0.01 = 0.01

    itera = 1

    K1y = 0.01(-4.0188) = -0.040188 K1z = 0.01(- 2(-4.0188) - 5 (1.9599)) = -0.0176 K2y = 0.01 (-4.0188-0.0176) = -0.0403 K2z = 0.01 (-2(-4.0188-0.0176)-5(1.9599-0.040188)) = -0.0152 yi = 1.9599 +\frac{-0.040188-0.0403} {2} = 1.9196 zi = -4.0188 +\frac{-0.0176-0.0152}{2} = -4.0352 ti = ti + h = 0.01+0.01 = 0.02

    itera = 2

    K1y = 0.01(-4.0352) = -0.040352 K1z = 0.01(- 2(-4.0352) - 5 (1.9196)) = -0.0152 K2y = 0.01 (-4.0352-0.0152) = -0.0405 K2z = 0.01 (-2(-4.0352-0.0152)-5(1.9196-0.040352)) = -0.0129 yi = 1.9196 +\frac{-0.040352-0.0405} {2} =1.8792 zi = -4.0352 +\frac{-0.0152-0.0129}{2} = -4.0494 ti = ti + h = 0.02+0.01 = 0.03

    Resultados con el algoritmo en Python

       ti,   yi,    zi,      K1y,    K1z,    K2y,     K2z
    [[ 0.00  2.0000 -4.0000  0.0000  0.0000  0.0000   0.0000]
     [ 0.01  1.9599 -4.0188 -0.0400 -0.0200 -0.0402  -0.0176]
     [ 0.02  1.9196 -4.0352 -0.0401 -0.0176 -0.0403  -0.0152]
     [ 0.03  1.8792 -4.0494 -0.0403 -0.0152 -0.0405  -0.0129]
    ...
    

    Literal c

    Runge-Kutta 2do Orden tiene error de truncamiento O(h3)

    por lo que el error está en el orden de (0.01)3 = 0.000001


    Literal d

    Se requiere presentar el resultado para el intervalo t entre [0,5]. Siendo el tamaño de paso h=0.01 que es pequeño, se requieren realizar (5-0)/0.01=500 iteraciones, que es más práctico realizarlas usando el algoritmo.

    Circuito RLC Interruptor 3a

    Instrucciones en Python

    # Respuesta a entrada cero
    # solucion para (D^2+ D + 1)y = 0
    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]
        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)
    
    # PROGRAMA
    f = lambda t,y,z: z
    g = lambda t,y,z: -2*z -5*y + 0
    
    t0 = 0
    y0 = 2
    z0 = -4
    
    h = 0.01
    tn = 5
    muestras = int((tn-t0)/h)
    
    tabla = rungekutta2_fg(f,g,t0,y0,z0,h,muestras)
    ti = tabla[:,0]
    yi = tabla[:,1]
    zi = tabla[:,2]
    
    # SALIDA
    np.set_printoptions(precision=4)
    print('ti, yi, zi, K1y, K1z, K2y, K2z')
    print(tabla)
    
    # GRAFICA
    plt.plot(ti,yi, color = 'orange', label='y_RK(t)')
    plt.ylabel('y(t)')
    plt.xlabel('t')
    plt.title('y(t) con Runge-Kutta 2do Orden d2y/dx2 ')
    plt.legend()
    plt.grid()
    plt.show()
    

    Nota: En el curso TELG1001 Señales y Sistemas, la solución se realiza con Transformadas de Laplace

  • s2Eva_2022PAOI_T1 Comparar integrales numéricos Simpson y Cuadratura de Gauss

    Ejercicio: 2Eva_2022PAOI_T1 Comparar integrales numéricos Simpson y Cuadratura de Gauss

    Literal a. Integral con Simpson 1/3

    Para la ecuación en el intervalo x entre [0,3] aplicando dos veces la fórmula en el intervalo se requieren al menos dos tramos cada Simpson de 1/3. Por lo que la cantidad de tramos es 4 (dos por cada formula, y dos fórmulas) que corresponden a 5 muestras.

    El tamaño de paso se calcula como:

    h = \frac{b-a}{tramos}=\frac{3-0}{4} = \frac{3}{4} = 0.75

    representados en una gráfica como

    2Eva2022PAOI_T1 Integrar Simpson

    A = \int_0^3 \frac{e^x \sin(x)}{1+x^2} \delta x

    con lo que se define la función del integral f(x)

    f(x) = \frac{e^x \sin(x)}{1+x^2}

    Con lo que aplicando la fórmula se puede obtener los valores de las muestras:

    xi= [0. 0.75   1.5    2.25   3.    ]
    fi= [0. 0.9235 1.3755 1.2176 0.2834]
    

    Nota: realizar las expresiones completas para las fórmulas si no adjunta el algoritmo en Python

    Aplicando Simpson de 1/3 en cada tramo se tiene:

    A_s= \frac{1}{3} \Big( \frac{3}{4} \Big ) \Big( 0 + 4(0.9235) + 1.3755 \Big) + + \frac{1}{3} \Big( \frac{3}{4} \Big ) \Big( 1.3755 + 4(1.2176) +0.2834 \Big) A_s = 2.8998

    Literal b. Integral con Cuadratura de Gauss

    Para usar dos veces el método de Cuadratura de Gauss se usan dos intervalos, con lo que las muestras en x serán:

    xj= [0. 1.5 3. ]

    se calculan los valores para el tramo [0, 1.5]:

    x_{a1} = \frac{0+1.5}{2} - \frac{1}{\sqrt{3}}\frac{1.5-0}{2} = 0.3169 x_{b1} = \frac{0+1.5}{2} + \frac{1}{\sqrt{3}}\frac{1.5-0}{2} = 1.1830 A_{g1} =\frac{1.5-0}{2} \Big( f(0.3169)+f(1.1830)\Big) = 1.2361

    se calculan los valores para el tramo [1.5, 3]:

    x_{a2} = \frac{1.5+3}{2} - \frac{1}{\sqrt{3}}\frac{3-1.5}{2} = 1.8169 x_{b2} = \frac{1.5+3}{2} + \frac{1}{\sqrt{3}}\frac{3-1.5}{2} = 2.6830 A_{g2} =\frac{3-1.5}{2} \Big( f(1.8169)+f(2.6830)\Big) = 1.6329

    El total del integral para el intervalo  [0,3]

    A_g = A_{g1} + A_{g2} = 2.8691

    Al comparar los resultados entre los métodos del literal a y b

    errado = |A_s - A_g| = 2.8998 - 2.8691 = 0.0307

    Instrucciones integradas en Python

    # 2Eva_2022PAOI_T1
    # Comparar integrales numéricos Simpson
    #   y Cuadratura de Gauss
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    fx = lambda x: (np.exp(x)*np.sin(x))/(1+x**2)
    a = 0
    b = 3
    
    # PROCEDIMIENTO
    # Aplicando Simpson 1/3
    tramos = 4
    muestras = tramos+1
    xi = np.linspace(a,b,muestras)
    fi = fx(xi)
    hs = xi[1]-xi[0]
    As = (1/3)*(3/4)*(fi[0]+4*fi[1]+fi[2])
    As = As + (1/3)*(3/4)*(fi[2]+4*fi[3]+fi[4])
    erradoS = 2*(hs**5)
    
    # Aplicando Cuadratura de Gauss
    tramosG = 2
    muestrasG = tramosG+1
    xj = np.linspace(a,b,muestrasG)
    hg = xj[1]-xj[0]
    
    xa1 = (xj[0]+xj[1])/2 - (1/np.sqrt(3))*(xj[1]-xj[0])/2
    xb1 = (xj[0]+xj[1])/2 + (1/np.sqrt(3))*(xj[1]-xj[0])/2
    Ag1 = (hg/2)*(fx(xa1)+fx(xb1))
    
    xa2 = (xj[1]+xj[2])/2 - (1/np.sqrt(3))*(xj[2]-xj[1])/2
    xb2 = (xj[1]+xj[2])/2 + (1/np.sqrt(3))*(xj[2]-xj[1])/2
    Ag2 = (hg/2)*(fx(xa2)+fx(xb2))
    
    Ag = Ag1 + Ag2
    
    # error entre métodos
    errado = np.abs(As-Ag)
    
    # SALIDA
    print('xi=',xi)
    print('fi=',fi)
    print('A Simpson =', As)
    print('error Truncamiento Simpson 2*(h^5):',
          erradoS)
    print('Cuadratura de Gauss xa,xb por tramos:',
          [xa1,xb1,xa2,xb2])
    print('  fx(xa),fx(xb) por tramos:',
          [fx(xa1),fx(xb1),fx(xa2),fx(xb2)])
    print('  integral de cada tramo:', [Ag1,Ag2])
    print('A Gauss =', Ag)
    print('errado entre Simpson y Gauss',errado)
    
    # Grafica con mejor resolucion
    xk = np.linspace(a,b,5*tramos+1)
    fk = fx(xk)
    
    plt.plot(xk,fk)
    plt.plot(xi,fi,'o')
    for unx in xi:
        plt.axvline(unx,color='red',
                    linestyle='dotted')
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.title('(np.exp(x)*np.sin(x))/(1+x**2)')
    plt.grid()
    plt.show()
    
  • s2Eva_2021PAOII_T2 EDO – Embudos cónicos para llenar botellas

    Ejercicio: 2Eva_2021PAOII_T2 EDO – Embudos cónicos para llenar botellas

    literal a

    La expresión dada en el enunciado para EDO, se reordena para definir la funcion a usar con Runge-Kutta:

    \frac{\delta y(t)}{\delta t} + \frac{d^2}{4}\sqrt{2 g \text{ }y(t)}\Bigg[\frac{tan \theta}{y(t)} \Bigg]^2 = 0 \frac{\delta y(t)}{\delta t} = - \frac{d^2}{4}\sqrt{2 g \text{ }y(t)}\Bigg[\frac{tan \theta}{y(t)} \Bigg]^2

    siendo h = 0.5,  con y(0) = 0.15 m y d= 0.01 m ajustando las unidades de medida.

    \frac{\delta y(t)}{\delta t} = - \frac{0.01^2}{4}\sqrt{2 (9.8) \text{ }y(t)}\Bigg[\frac{tan (\pi/4)}{y(t)} \Bigg]^2 \frac{\delta y(t)}{\delta t} = - (1.1068e-4) \sqrt{ y(t)}\Bigg[\frac{1}{y(t)} \Bigg]^2 \frac{\delta y(t)}{\delta t}= - (1.1068e-4) \frac{\sqrt{ y(t)}}{y(t)^2}

    literal b

    se inicia el cálculo del siguiente punto de la tabla

    i t y
    0 0 0.15
    1 0.5 0.1490
    2 1 0.1480
    3 1.5 0.1471

    i = 0

    K_1 = h\Bigg(- (1.1068e-4) \frac{\sqrt{ y(t)}}{y(t)^2} \Bigg) K_1 = 0.5\Bigg(- (1.1068e-4) \frac{\sqrt{0.15}}{0.15^2}\Bigg) = -9.5258e-04 K_2 = h\Bigg(- (1.1068e-4) \frac{\sqrt{ y(t)+K_1}}{(y(t)+K_1)^2} \Bigg) K_2 = 0.5\Bigg(- (1.1068e-4) \frac{\sqrt{ 0.15+-9.5258e-04}}{(0.15-9.5258e-04)^2} \Bigg) K_2 = -9.6173e-04 y_1 = y_0 + \frac{K_1 + K_2}{2} y_1 = 0.15 + \frac{-9.5258e-04 -9.6173e-04}{2} = 0.149

    i = 1

    K_1 = 0.5\Bigg(- (1.1068e-4) \frac{\sqrt{0.149}}{0.149^2}\Bigg) =-9.6177e-04 K_2 = 0.5\Bigg(- (1.1068e-4) \frac{\sqrt{ 0.149-9.7120e-04}}{(0.149-9.7120e-04)^2} \Bigg) K_2 = -9.7116e-04 y_2 = y_1 + \frac{-9.6177e-04 + -9.7116e-04}{2} = 0.1480

    i = 2

    K_1 = 0.5\Bigg(- (1.1068e-4) \frac{\sqrt{0.1480}}{0.1480^2}\Bigg) = -9.7120e-04 K_2 = 0.5\Bigg(- (1.1068e-4) \frac{\sqrt{ 0.1480-9.7120e-04}}{(0.1480-9.7120e-04)^2} \Bigg) K_2= -9.8084e-04 y_3 = y_2 + \frac{-9.7120e-04 + -9.8084e-04}{2} = 0.1471

    literal c

    Resultados usando Algoritmo, se encuentra que el embudo se vacia entre 3.15 y 3.20 segundos

     [ t , y , K1 , K2 ]
    [[ 0.0000e+00  1.5000e-01  0.0000e+00  0.0000e+00]
     [ 5.0000e-01  1.4904e-01 -9.5258e-04 -9.6173e-04]
     [ 1.0000e+00  1.4808e-01 -9.6177e-04 -9.7116e-04]
     [ 1.5000e+00  1.4710e-01 -9.7120e-04 -9.8084e-04]
     [ 2.0000e+00  1.4611e-01 -9.8088e-04 -9.9078e-04]
     [ 2.5000e+00  1.4512e-01 -9.9083e-04 -1.0010e-03]
    ...
    [ 3.1000e+01  2.8617e-02 -7.5631e-03 -1.0583e-02]
     [ 3.1500e+01  1.0620e-02 -1.1431e-02 -2.4563e-02]
     [ 3.2000e+01         nan -5.0566e-02         nan]
     [ 3.2500e+01         nan         nan         nan]
    

    Instrucciones Python

    # 2Eva_2021PAOII_T2 EDO – Embudos cónicos para llenar botellas
    import numpy as np
    
    def rungekutta2(d1y,x0,y0,h,muestras):
        tamano   = muestras + 1
        estimado = np.zeros(shape=(tamano,4),dtype=float)
        # incluye el punto [x0,y0,K1,K2]
        estimado[0] = [x0,y0,0,0]
        xi = x0
        yi = y0
        for i in range(1,tamano,1):
            K1 = h * d1y(xi,yi)
            K2 = h * d1y(xi+h, yi + K1)
    
            yi = yi + (K1+K2)/2
            xi = xi + h
            
            estimado[i] = [xi,yi,K1,K2]
        return(estimado)
    
    # INGRESO
    d = 0.01
    theta = np.pi/4
    g = 9.8
    d1y = lambda t,y: -(d**2)/4*np.sqrt(2*g*y)*(np.tan(theta)/y)**2
    
    t0 = 0
    y0 = 0.15
    h  = 0.5
    muestras = 70
    
    # PROCEDIMIENTO
    tabla = rungekutta2(d1y,t0,y0,h,muestras)
    
    # SALIDA
    np.set_printoptions(precision=4)
    print('[ t , y , K1 , K2 ]')
    print(tabla)
    
  • s2Eva_2021PAOII_T1 Promedio de precipitación de lluvia en área

    Ejercicio: 2Eva_2021PAOII_T1 Promedio de precipitación de lluvia en área

    Los datos de la tabla corresponden a las medidas de precipitación lluviosa en cada cuadrícula. El área observada es de 300x250, los tramos horizontales 6 y los verticales 4.

    Los tamaños de paso son:
    h = 300/6 = 50
    k = 250/4 = 62.5

    f(xi,yj)
    i \ j 1 2 3 4 5 6
    1 0.02 0.36 0.82 0.65 1.7 1.52
    2 3.15 3.57 6.25 5 3.88 1.8
    3 0.98 0.98 2.4 1.83 0.04 0.01
    4 0.4 0.04 0.03 0.03 0.01 0.08

    Para obtener el integral doble, usando la forma compuesta de Simpson, primero desarrolla por filas.

    i=1

    I_1 = \frac{3}{8}(50) ( 0.02+3(0.36)+3(0.82)+0.65) + \frac{1}{3}(50) (0.65+4(1.7)+1.52) = 228.43

    i=2

    I_2 = \frac{3}{8}(50) ( 3.15+3(3.57)+3(6.25)+5) + \frac{1}{3}(50) (5+4(3.88)+1.8) = 1077.18

    i=3

    I_3 = \frac{3}{8}(50) ( 0.98+3(0.98)+3(2.4)+1.83) + \frac{1}{3}(50) (1.83+4(0.04)+0.01) = 276.14

    i=4

    I_4 = \frac{3}{8}(50) ( 0.4+3(0.04)+3(0.03)+0.03) + \frac{1}{3}(50) (0.03+4(0.01)+0.08) = 14.5

    con los resultados, luego se desarrolla por columnas:

    columnas = [ 228.43,  1077.18,  276.14,  14.5 ]

    I_{total} = \frac{3}{8}(62.5) ( 228.43+3(1077.18)+3(276.14)+14.5) I_{total} = 100850.09

    para el promedio se divide el integral total para el área de rectángulo.

    Precipitacion_{promedio} = \frac{100850.09}{(300)(250)} = 1.34

    Solución con algoritmo

    Resultados usando algoritmos con Python:

    integral por fila: [ 228.4375     1077.1875      276.14583333   14.5       ]
    integral total: 100850.09765625
    promedio precipitación:  1.34466796875
    >>>
    

    Instrucciones con Python

    # 2Eva_2021PAOII_T1 Promedio de precipitación de 
    #  lluvia en área
    import numpy as np
    
    def simpson_compuesto(vector,h):
        m = len(vector)
        suma = 0
        j = 0
        while (j+3)<m:  # Simpson 3/8
            f = vector[j:j+4]
            s = (3*h/8)*(f[0]+3*f[1]+3*f[2]+f[3])
            suma = suma + s
            j = j + 3
        while (j+2)<m: # Simpson 1/3
            f = vector[j:j+3]
            s = (h/3)*(f[0]+4*f[1]+f[2])
            suma = suma + s
            j = j + 2
        while (j+1)<m: # Trapecio
            f = vector[j:j+2]
            s = (h/2)*(f[0]+f[1])
            suma = suma + s
            j = j + 1
        return(suma)
        
    
    # INGRESO
    A = [[0.02, 0.36, 0.82, 0.65, 1.7 , 1.52],
         [3.15, 3.57, 6.25, 5.  , 3.88, 1.8 ],
         [0.98, 0.98, 2.4 , 1.83, 0.04, 0.01],
         [0.4 , 0.04, 0.03, 0.03, 0.01, 0.08]]
    base = 300
    altura = 250
    
    h = base/6
    k = altura/4
    
    # PROCEDIMIENTO
    A = np.array(A)
    [n,m] = np.shape(A)
    columna = np.zeros(n,dtype=float)
    for i in range(0,n,1):
        vector = A[i]
        integralfila = simpson_compuesto(vector,h)
        columna[i] = integralfila
    
    total = simpson_compuesto(columna,k)
    promedio = total/(base*altura)
        
    # SALIDA
    print('integral por fila:', columna)
    print('integral total:', total)
    print('promedio precipitación: ', promedio)
    
  • s2Eva_2021PAOII_T3 EDP Línea de transmisión sin pérdidas

    Ejercicio: 2Eva_2021PAOII_T3 EDP – Línea de transmisión sin pérdidas

    Desarrollo para determinar el Voltaje  v(t),

    \frac{\partial ^2 V}{\partial x^2} =LC \frac{\partial ^2 V}{\partial t^2}

    0 < x < 200
    t>0

    Seleccionando diferencias divididas centradas para x y t

    transmision Sin Perdidas 02

    \frac{v_{i,j+1}-2v_{i,j}+v_{i,j-1}}{(\Delta x)^2} =LC \frac{v_{i+1,j}-2v_{i,j}+v_{i-1,j}}{(\Delta t)^2}

    agrupando las constantes como lambda,

    \frac{(\Delta t)^2}{LC}\frac{v_{i,j+1}-2v_{i,j}+v_{i,j-1}}{(\Delta x)^2} =LC \frac{v_{i+1,j}-2v_{i,j}+v_{i-1,j}}{(\Delta t)^2} \frac{(\Delta t)^2}{LC} \frac{(\Delta t)^2}{LC(\Delta x)^2} \Big[ v_{i,j+1} -2v_{i,j}+v_{i,j-1} \Big] =v_{i+1,j}-2v_{i,j}+v_{i-1,j} \lambda = \frac{(\Delta t)^2}{LC(\Delta x)^2} \lambda = \frac{(0.1)^2}{(0.1)(0.3)(10)^2} = 0.003333

    con lo que se comprueba que λ ≤ 1, por lo que el algoritmo es convergente.

    Para reducir la cantidad de muestras, se iguala λ = 1, manteniendo el valor de Δx y calculando Δt

    \Delta t = \Delta x \sqrt{LC} \Delta t = 10 \sqrt{0.1(0.3)} = 1.7320

    continuando con el valor de λ en la ecuacion general,

    \lambda \Big[ v_{i,j+1} -2v_{i,j}+v_{i,j-1} \Big] =v_{i+1,j} -2v_{i,j}+v_{i-1,j} \lambda v_{i,j+1} +(-2\lambda +2) v_{i,j} + \lambda v_{i,j-1} = v_{i+1,j}+v_{i-1,j}

    usando la condición inicial, para j = 0, y diferencias divididas centradas:

    \frac{\partial V}{\partial t}(x,0) = 0 \frac{v_{i,1}-v_{i,-1}}{2\Delta t} = 0 v_{i,1}-v_{i,-1} = 0 v_{i,1} = v_{i,-1}

    y en la ecuacion del problema, con j = 0

    \lambda v_{i,1} +(-2\lambda +2) v_{i,0} + \lambda v_{i,-1} = v_{i+1,0}+v_{i-1,0} 2 \lambda v_{i,1} +(-2\lambda +2) v_{i,0} = v_{i+1,0}+v_{i-1,0} 2 \lambda v_{i,1} = (2\lambda -2) v_{i,0} + v_{i+1,0}+v_{i-1,0} v_{i,1} = \frac{1}{2 \lambda}\Bigg[ (2\lambda -2) v_{i,0} + v_{i+1,0}+v_{i-1,0} \Bigg]

    si λ=1,

    v_{i,1} = \frac{v_{i+1,0}+v_{i-1,0}}{2 }

    con j =0, i =1

    v_{1,1} = \frac{v_{2,0}+v_{0,0}}{2 } =\frac{1}{2}\Big( 110 \sin \frac{\pi(0+2\Delta x) }{200}+0 \Big) =17

    con j =0, i =2

    v_{2,1} = \frac{v_{3,0}+v_{1,0}}{2 } v_{2,1} = \frac{1}{2}\Big( 110 \sin \frac{\pi(30) }{200}+110 \sin \frac{\pi(10) }{200} \Big)=33.57

    con j =0, i =3

    v_{3,1} = \frac{v_{4,0}+v_{2,0}}{2} v_{2,1} = \frac{1}{2}\Big( 110 \sin \frac{\pi(40) }{200}+110 \sin \frac{\pi(20) }{200} \Big)=49.32

    transmision Sin Perdidas 03

    para j>0, se dispone de los valores de los puntos dentro del rombo, excepto v[i,j+1]

    \lambda v_{i,j+1} +(-2\lambda +2) v_{i,j} + \lambda v_{i,j-1} = v_{i+1,j}+v_{i-1,j} \lambda v_{i,j+1} = (2\lambda -2) v_{i,j} - \lambda v_{i,j-1} + v_{i+1,j}+v_{i-1,j} v_{i,j+1} = \frac{1}{\lambda}\Big( (2\lambda -2) v_{i,j} - \lambda v_{i,j-1} + v_{i+1,j}+v_{i-1,j} \Big)

    teniendo como valores de las filas:

    u[:,1] = [  0.  ,  17.  ,  33.57,  49.32,  63.86,  76.82,  87.9 , ...  ])
    u[:,0] = [  0.  ,  17.21,  33.99,  49.94,  64.66,  77.78,  88.99, ...  ])
    

    con j = 1 ; i = 1 ; (λ=1)

    v_{1,2} = \frac{1}{\lambda}\Big( (2\lambda -2) v_{1,1} - \lambda v_{1,0} + v_{2,1}+v_{0,1} \Big) v_{1,2} = \frac{1}{\lambda}\Big( (2\lambda-2) 17-\lambda 17.21+ 33.57+0\Big)=16.37

    con j = 1 ; i = 2 ; (λ=1)

    v_{2,2} = \frac{1}{\lambda}\Big( (2\lambda -2) v_{2,1} - \lambda v_{2,0} + v_{3,1}+v_{1,1} \Big) v_{2,2} = \frac{1}{\lambda}\Big( (2\lambda-2) 33.57-\lambda 33.99+ 49.32+17\Big)=32.33

    con j = 1 ; i = 3 ; (λ=1)

    v_{2,2} = \frac{1}{\lambda}\Big( (2\lambda -2) v_{3,1} - \lambda v_{3,0} + v_{4,1}+v_{2,1} \Big) v_{2,2} = \frac{1}{\lambda}\Big( (2\lambda-2) 49.32-\lambda 49.94 + 63.86+33.57\Big)=47.49

    usando el algoritmo con los valores y ecuaciones encontradas se obtiene:

    EDP Linea Sin Pedidas 01

    21 41
    xi =
    [  0  10  20  30  40  50  60  70  80  90 100 110 120 130 140 150 160 170
     180 190 200]
    tj =
    [ 0.    1.73  3.46  5.2   6.93  8.66 10.39 12.12 13.86 15.59 17.32 19.05
     20.78 22.52 24.25 25.98 27.71 29.44 31.18 32.91 34.64 36.37 38.11 39.84
     41.57 43.3  45.03 46.77 48.5  50.23 51.96 53.69 55.43 57.16 58.89 60.62
     62.35 64.09 65.82 67.55 69.28]
    matriz u =
    ....
    

    Instrucciones en Python

    # 2Eva_2021PAOII_T2 EDP – Línea de transmisión sin pérdidas
    # Ecuaciones Diferenciales Parciales
    # Hiperbólica. Método explicito
    import numpy as np
    
    # INGRESO
    L = 0.1
    C = 0.3
    
    x0 = 0
    xn = 200 # Longitud de cable
    
    vx0 = lambda x: 110*np.sin(np.pi*x/200)
    
    y0 = 0
    yn = 0 # Puntos de amarre
    
    t0 = 0
    tn = 68
    
    # discretiza
    dx = 10
    dt = dx*np.sqrt(L*C)
    
    # PROCEDIMIENTO
    xi = np.arange(x0,xn+dx,dx)
    tj = np.arange(0,tn+dt,dt)
    n = len(xi)
    m = len(tj)
    print(n,m)
    
    u = np.zeros(shape=(n,m),dtype=float)
    u[:,0] = vx0(xi)
    u[0,:] = y0
    u[n-1,:] = yn
    
    # calcula lamb
    lamb = (dt**2)/(L*C*(dx**2))
    
    # Aplicando condición inicial
    j = 0
    for i in range(1,n-1,1):
        u[i,j+1] = ((2*lamb-2)*u[i,j]+u[i+1,j]+u[i-1,j])/(2*lamb)
    # Para los otros puntos
    for j in range(1,m-1,1):
        for i in range(1,n-1,1):
            u[i,j+1] = (1/lamb)*((2*lamb-2)*u[i,j]-lamb*u[i,j-1]+u[i+1,j]+u[i-1,j])
    
    # SALIDA
    np.set_printoptions(precision=2)
    print('xi =')
    print(xi)
    print('tj =')
    print(tj)
    print('matriz u =')
    print(u)
    
    # GRAFICA
    import matplotlib.pyplot as plt
    
    for j in range(0,m,1):
        y = u[:,j]
        plt.plot(xi,y)
    
    plt.title('EDP hiperbólica')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()
    
    # **** GRÁFICO CON ANIMACION ***********
    import matplotlib.animation as animation
    
    # Inicializa parametros de trama/foto
    retardo = 70   # milisegundos entre tramas
    tramas  = m
    maximoy = np.max(np.abs(u))
    figura, ejes = plt.subplots()
    plt.xlim([x0,xn])
    plt.ylim([-maximoy,maximoy])
    
    # lineas de función y polinomio en gráfico
    linea_poli, = ejes.plot(xi,u[:,0], '-')
    plt.axhline(0, color='k')  # Eje en x=0
    
    plt.title('EDP hiperbólica')
    # plt.legend()
    # txt_x = (x0+xn)/2
    txt_y = maximoy*(1-0.1)
    texto = ejes.text(x0,txt_y,'tiempo:',
                      horizontalalignment='left')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.grid()
    
    # Nueva Trama
    def unatrama(i,xi,u):
        # actualiza cada linea
        linea_poli.set_ydata(u[:,i])
        linea_poli.set_xdata(xi)
        linea_poli.set_label('tiempo linea: '+str(i))
        texto.set_text('tiempo['+str(i)+']')
        # color de la línea
        if (i<=9):
            lineacolor = 'C'+str(i)
        else:
            numcolor = i%10
            lineacolor = 'C'+str(numcolor)
        linea_poli.set_color(lineacolor)
        return linea_poli, texto
    
    # Limpia Trama anterior
    def limpiatrama():
        linea_poli.set_ydata(np.ma.array(xi, mask=True))
        linea_poli.set_label('')
        texto.set_text('')
        return linea_poli, texto
    
    # Trama contador
    i = np.arange(0,tramas,1)
    ani = animation.FuncAnimation(figura,
                                  unatrama,
                                  i ,
                                  fargs=(xi,u),
                                  init_func=limpiatrama,
                                  interval=retardo,
                                  blit=True)
    # Graba Archivo video y GIFAnimado :
    # ani.save('EDP_hiperbólica.mp4')
    ani.save('EDP_LineaSinPerdidas.gif', writer='imagemagick')
    plt.draw()
    plt.show()
    
  • s2Eva_2021PAOI_T3 EDP Elíptica con valores en la frontera f(x) g(y)

    Ejercicio: 2Eva_2021PAOI_T3 EDP Elíptica con valores en la frontera f(x) g(y)

    Dada la EDP elíptica

    \frac{\partial ^2 u}{\partial x^2} +\frac{\partial^2 u}{\partial y^2} = 0 0 \lt x \lt \frac{1}{2}, 0 \lt y\lt \frac{1}{2}

    Se convierte a la versión discreta usando diferencias divididas centradas:

    2E2020PAOIT3 EDP Eliptica h13

     


    \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} = 0

    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) = 0

    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
    u[i-1,j]-2u[i,j]+u[i+1,j] + + u[i,j-1]-2u[i,j]+u[i,j+1] = 0
    u[i-1,j]-4u[i,j]+u[i+1,j] + + u[i,j-1]+u[i,j+1] = 0

    que permite plantear las ecuaciones para cada punto en posición [i,j]

    En cada iteración se requiere el uso de los valores en la frontera

    u(x,0)=0, 0 \leq x \leq \frac{1}{2} u(0,y)=0 , 0\leq y \leq \frac{1}{2} u\Big(x,\frac{1}{2} \Big) = 200 x , 0 \leq x \leq \frac{1}{2} u\Big(\frac{1}{2} ,y \Big) = 200 y , 0 \leq y \leq \frac{1}{2}

    Iteraciones

    i=1, j=1

    u[0,1]-4u[1,1]+u[2,1] + + u[1,0]+u[1,2] = 0

    usando los valores en la frontera,

    0-4u[1,1]+u[2,1] + 0+u[1,2] = 0 -4u[1,1]+u[2,1] + u[1,2] = 0

    i=2, j=1

    u[1,1]-4u[2,1]+u[3,1] + + u[2,0]+u[2,2] = 0

    usando los valores en la frontera,

    u[1,1]-4u[2,1]+200(1/6) + 0+u[2,2] = 0 u[1,1]-4u[2,1] + u[2,2] = -200(1/6)

    i=1, j=2

    u[0,2]-4u[1,2]+u[2,2] + + u[1,1]+u[1,3] = 0 0 - 4u[1,2]+u[2,2] + u[1,1]+200\frac{1}{6} = 0 - 4u[1,2] + u[2,2]+u[1,1] = -200\frac{1}{6}

    i=2, j=2

    u[1,2]-4u[2,2]+u[3,2] + + u[2,1]+u[2,3] = 0 u[1,2]-4u[2,2]+200\frac{2}{6} + u[2,1]+200\frac{2}{6} = 0 u[1,2]-4u[2,2]+ u[2,1] = -(2)200\frac{2}{6}

    Sistema de ecuaciones a resolver:

    \begin{bmatrix} -4 & 1 &1&0\\1 &-4&0&1\\1&0&-4&1 \\0&1&1&-4\end{bmatrix} \begin{bmatrix} u[1,1]\\u[2,1] \\u[1,2]\\u[2,2] \end{bmatrix} = \begin{bmatrix} 0\\-200(1/6)\\-200(1/6)\\-200(4/6) \end{bmatrix}

    Resolviendo el sistema se tiene:

    [11.11111111 22.22222222 22.22222222 44.44444444]

    Instrucciones Python

    import numpy as np
    
    A = np.array([[-4, 1, 1, 0],
                  [ 1,-4, 0, 1],
                  [ 1, 0,-4, 1],
                  [ 0, 1, 1,-4]])
    
    B = np.array([0,-200*(1/6),-200*(1/6),-200*(4/6)])
    
    x= np.linalg.solve(A,B)
    
    print(x)