Categoría: Solución 2da Eva

  • s2Eva_IIT2017_T2 Volumen de isla

    Ejercicio: 2Eva_IIT2017_T2 Volumen de isla

    isla = np.array([[0,1,0,0,0],
                     [1,3,1,1,0],
                     [5,4,3,2,0],
                     [0,0,1,1,0]])
    
    xi = np.array([0,100,200,300,400])
    yi = np.array([0, 50,100,150])
    

    Tamaño de la matriz: n=4, m=5

    cantidad de elementos por fila impar, aplica Simpson 1/3
    hx = (200-0)/2 =100
    fila=0
        vector = [0,1,0,0,0]
        deltaA = (100/3)(0+4(1)+0) = 4(100/3)
        deltaA = (100/3)(0+4(0)+0) = 0
        area0 = 4(100/3) + 0 = 4(100/3)
    fila=1
        vector = [1,3,1,1,0]
        deltaA = (100/3)(1+4(3)+1) = 14(100/3)
        deltaA = (100/3)(1+4(1)+0) = 5(100/3)
        area1 = 14(100/3) + 5(100/3) = 19(100/3)
    fila=2
        vector = [5,4,3,2,0]
        deltaA = (100/3)(5+4(4)+3) = 24(100/3)
        deltaA = (100/3)(3+4(2)+0) = 11(100/3)
        area2 = 24(100/3) + 11(100/3) = 35(100/3)
    fila=3
        vector = [0,0,1,1,0]
        deltaA = (100/3)(0+4(0)+1) = (100/3)
        deltaA = (100/3)(1+4(1)+0) = 5(100/3)
        area3 = (100/3) + 5(100/3) = 6(100/3)
    
    areas = [ 4(100/3), 19(100/3), 35(100/3), 6(100/3)]
    areas = (100/3)[ 4, 19, 35, 6 ]
    
    areas tiene cantidad de elementos par, aplica Simpson 3/8
        hy = (150-0)/3 = 50
        deltaV = (3/8)(50)(100/3)(4+3(19) + 3(35)+ 6)
               = (25*25)(168)
        Volumen = 107500
    

    2evaiit2017t2 Vol 01

    tramos:  4 5
    areas:  [  133.33333333   633.33333333  1166.66666667    66.66666667]
    Volumen:  107500.0
    

    las instrucciones en python para encontrar el valor son:

    # 2da Eval II T 2017. Tema 2
    # Formula de simpson
    # Integración: Regla Simpson 1/3 y 3/8
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import axes3d
    
    def simpson13(xi,yi):
        '''
        las muestras deben ser impares
        '''
        area = 0
        muestras = len(xi)
        impar = muestras%2
        if impar == 1:
            for i in range(0,muestras-2,2):
                h = (xi[i+2] - xi[i])/2
                deltaA = (h/3)*(yi[i]+4*yi[i+1]+yi[i+2])
                area = area + deltaA
        return(area)
    
    def simpson38(xi,yi):
        '''
        las muestras deben ser pares
        '''
        area = 0
        muestras = len(xi)
        impar = muestras%2
        if impar == 0:
            for i in range(0,muestras-3,3):
                h = (xi[i+3] - xi[i])/3
                deltaA = (3*h/8)*(yi[i]+3*yi[i+1]+3*yi[i+2]+yi[i+3])
                area = area + deltaA
        return(area)
    
    def simpson(xi,yi):
        '''
        Selecciona el tipo de algoritmo Simpson
        '''
        muestras = len(xi)
        impar = muestras%2
        if impar == 1:
            area = simpson13(xi,yi)
        else:
            area = simpson38(xi,yi)
        return(area)
        
    
    # INGRESO
    isla = np.array([[0,1,0,0,0],
                     [1,3,1,1,0],
                     [5,4,3,2,0],
                     [0,0,1,1,0]])
    
    xi = np.array([0,100,200,300,400])
    yi = np.array([0, 50,100,150])
    
    # PROCEDIMIENTO
    tamano = np.shape(isla)
    n = tamano[0]
    m = tamano[1]
    
    areas = np.zeros(n,dtype = float)
    for fila in range(0,n,1):
        unafranja = isla[fila,:]
        areas[fila] = simpson(xi,unafranja)
    volumen = simpson(yi,areas)
    
    # SALIDA
    print('tramos: ', n,m)
    print('areas: ', areas)
    print('Volumen: ', volumen)
    
    # Gráfica
    X, Y = np.meshgrid(xi, yi)
    fig = plt.figure()
    ax = fig.add_subplot(111, projection = '3d')
    ax.plot_wireframe(X,Y,isla)
    plt.show()
    
  • s2Eva_IIT2016_T3_MN EDO Taylor 2, Tanque de agua

    Ejercicio: 2Eva_IIT2016_T3_MN EDO Taylor 2, Tanque de agua

    La solución obtenida se realiza con h=0.5 y usando dos métodos para comparar resultados.

    \frac{dy}{dt} = -k \sqrt{y}

    1. EDO con Taylor

    Usando una aproximación con dos términos de Taylor:

    y_{i+1}=y_{i}+ y'_{i} h+\frac{y"_{i}}{2}h^{2}

    Por lo que se obtienen las derivadas necesarias:

    y'_i= -k (y_i)^{1/2} y"_i= \frac{-k}{2}(y_i)^{-1/2}

    1.1 iteraciones

    i=0, y0=3, t0=0

    y'_0= -k(y_0)^{1/2} =-0.06(3)^{1/2} = -0.1039 y"_0= \frac{-0.06}{2}(3)^{-1/2} = -0.0173 y_{1}=y_{0}+ y'_{0} (1)+\frac{y"_{0}}{2}(1)^{2} y_{1}=3+ (-0.1039) (0.5)+\frac{-0.0173}{2}(0.5)^{2}= 2.9458

    t1=t0+h = 0+0.5= 0.5

    i=1, y1=2.9458, t1=0.5

    y'_1= -k(y_1)^{1/2} =-0.06(2.887)^{1/2} =-0.1029 y"_1= \frac{-0.06}{2}(2.887)^{-1/2} = -0.0174 y_{2}=y_{1}+ y'_{1} (1)+\frac{y"_{1}}{2}(1)^{2} y_{1}=2.9458+ (-0.1029) (1)+\frac{-0.0174}{2}(1)^{2}= 2.8921

    t2=t1+h = 0.5+0.5 = 1.0

    i=2, y2=2.8921, t2=1.0

    Resolver como Tarea

    1.2 Resultados con Python

    Realizando una tabla de valores usando Python y una gráfica, encuentra que el valor buscado del tanque a la mitad se obtiene en 16 minutos.

    estimado[xi,yi]
    [[ 0.          3.        ]
     [ 0.5         2.94587341]
     [ 1.          2.89219791]
     [ 1.5         2.83897347]
     [ 2.          2.7862001 ]
     ...
     [14.          1.65488507]
     [14.5         1.61337731]
     [15.          1.57231935]
     [15.5         1.53171109]
     [16.          1.49155239]
     [16.5         1.45184313]
     [17.          1.41258317]
     [17.5         1.37377234]
     [18.          1.33541049]
     [18.5         1.29749744]
     [19.          1.26003297]
     [19.5         1.22301689]
     [20.          1.18644897]]

    Algoritmo en Python para Solución EDO con tres términos:

    # EDO. Método de Taylor 3 términos 
    # estima la solucion para muestras espaciadas h en eje x
    # valores iniciales x0,y0
    # entrega arreglo [[x,y]]
    import numpy as np
    
    def edo_taylor3t(d1y,d2y,x0,y0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,2),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0]
        x = x0
        y = y0
        for i in range(1,tamano,1):
            y = y + h*d1y(x,y) + ((h**2)/2)*d2y(x,y)
            x = x+h
            estimado[i] = [x,y]
        return(estimado)
    
    # PROGRAMA PRUEBA
    # 2Eva_IIT2016_T3_MN EDO Taylor 2, Tanque de agua
    
    # INGRESO.
    k=0.06
    # d1y = y' = f, d2y = y'' = f'
    d1y = lambda x,y: -k*(y**0.5)
    d2y = lambda x,y: -(k/2)*(y**(-0.5))
    x0 = 0
    y0 = 3
    h = 1/2
    muestras = 40
    
    # PROCEDIMIENTO
    puntos = edo_taylor3t(d1y,d2y,x0,y0,h,muestras)
    xi = puntos[:,0]
    yi = puntos[:,1]
    
    # SALIDA
    print('estimado[xi,yi]')
    print(puntos)
    # Gráfica
    import matplotlib.pyplot as plt
    plt.plot(xi[0],yi[0],'o', color='r', label ='[x0,y0]')
    plt.plot(xi[1:],yi[1:],'o', color='g', label ='y estimada')
    plt.axhline(y0/2)
    plt.title('EDO: Solución con Taylor 3 términos')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid()
    plt.show()
    

    2. EDO con Runge-Kutta de 2do Orden dy/dx

    Para éste método no se requiere desarrollar la segunda derivada, se usa el mismo h =0.5 con fines de comparación de resultados

    2.1 ITeraciones

    i = 1, y0=3, t0=0

    K_1 = h y'(x_0,y_0) = (0.5)*(-0.06)(3)^{1/2} =-0.05196 K_2 = h y'(x_0+h,y_0+K_1) = (0.5)* y'(0.5,3-0.05196) = -0.05150 y_1 = y_0+\frac{K1+K2}{2} = 3+\frac{-0.05196-0.05150}{2} = 2.9482

    i = 2, y1=2.9482, t1=0.5

    K_1 = h y'(x_1,y_1) = (0.5)*(-0.06)(2.9482)^{1/2} =-0.05149 K_2 = h y'(x_1+h,y_1+K_1) = (0.5)* y'(0.5,2.9482-0.05149) = -0.05103 y_1 = y_0+\frac{K1+K2}{2} = 3+\frac{-0.05149-0.05103}{2} = -2.8946

    i = 3,  y1=2.8946, t1=1.0

    Resolver como Tarea

    2.2 Resultados con Python

    Si comparamos con los resultados anteriores en una tabla, y obteniendo las diferencias entre cada iteración se tiene que:

    estimado[xi,yi Taylor, yi Runge-Kutta, diferencias]
    [[ 0.0  3.00000000  3.00000000  0.00000000e+00]
     [ 0.5  2.94587341  2.94826446 -2.39104632e-03]
     [ 1.0  2.89219791  2.89697892 -4.78100868e-03]
     [ 1.5  2.83897347  2.84614338 -7.16990106e-03]
     [ 2.0  2.78620010  2.79575783 -9.55773860e-03]
    ...
     [ 14.0  1.65488507  1.72150488 -6.66198112e-02]
     [ 14.5  1.61337731  1.68236934 -6.89920328e-02]
     [ 15.0  1.57231935  1.64368380 -7.13644510e-02]
     [ 15.5  1.53171109  1.60544826 -7.37371784e-02]
     [ 16.0  1.49155239  1.56766273 -7.61103370e-02]
     [ 16.5  1.45184313  1.53032719 -7.84840585e-02]
     [ 17.0  1.41258317  1.49344165 -8.08584854e-02]
     [ 17.5  1.37377234  1.45700611 -8.32337718e-02]
     [ 18.0  1.33541049  1.42102058 -8.56100848e-02]
     [ 18.5  1.29749744  1.38548504 -8.79876055e-02]
     [ 19.0  1.26003297  1.35039950 -9.03665304e-02]
     [ 19.5  1.22301689  1.31576397 -9.27470733e-02]
     [ 20.0  1.18644897  1.28157843 -9.51294661e-02]]
    error en rango:  0.09512946613018003

    # EDO. Método de Taylor 3 términos 
    # estima la solucion para muestras espaciadas h en eje x
    # valores iniciales x0,y0
    # entrega arreglo [[x,y]]
    import numpy as np
    
    def edo_taylor3t(d1y,d2y,x0,y0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,2),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0]
        x = x0
        y = y0
        for i in range(1,tamano,1):
            y = y + h*d1y(x,y) + ((h**2)/2)*d2y(x,y)
            x = x+h
            estimado[i] = [x,y]
        return(estimado)
    
    def rungekutta2(d1y,x0,y0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,2),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0]
        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]
        return(estimado)
    
    # PROGRAMA PRUEBA
    # 2Eva_IIT2016_T3_MN EDO Taylor 2, Tanque de agua
    
    # INGRESO.
    k=0.06
    # d1y = y' = f, d2y = y'' = f'
    d1y = lambda x,y: -k*(y**0.5)
    d2y = lambda x,y: -(k/2)*(y**(-0.5))
    x0 = 0
    y0 = 3
    h = 1/2
    muestras = 40
    
    # PROCEDIMIENTO
    puntos = edo_taylor3t(d1y,d2y,x0,y0,h,muestras)
    xi = puntos[:,0]
    yi = puntos[:,1]
    
    # Con Runge Kutta
    puntosRK2 = rungekutta2(d1y,x0,y0,h,muestras)
    xiRK2 = puntosRK2[:,0]
    yiRK2 = puntosRK2[:,1]
    
    # diferencias
    diferencias = yi-yiRK2
    error = np.max(np.abs(diferencias))
    tabla = np.copy(puntos)
    tabla = np.concatenate((puntos,np.transpose([yiRK2]),
                            np.transpose([diferencias])),
                           axis = 1)
    
    # SALIDA
    print('estimado[xi,yi Taylor,yi Runge-Kutta,diferencias]')
    print(tabla)
    print('error en rango: ', error)
    
    # Gráfica
    import matplotlib.pyplot as plt
    plt.plot(xi[0],yi[0],'o',
             color='r', label ='[x0,y0]')
    plt.plot(xi[1:],yi[1:],'o',
             color='g',
             label ='y Taylor 3 terminos')
    plt.plot(xiRK2[1:],yiRK2[1:],'o',
             color='blue',
             label ='y Runge-Kutta 2Orden')
    plt.axhline(y0/2)
    plt.title('EDO: Taylor 3T vs Runge=Kutta 2Orden')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid()
    plt.show()
    
  • s2Eva_IT2012_T1_MN Longitud de teleférico

    Ejercicio: 2Eva_IT2012_T1_MN Longitud de teleférico

    Los datos tomados para el problema son:

    x    = [0.00, 0.25, 0.50, 0.75, 1.00]
    f(x) = [25.0, 22.0, 32.0, 51.0, 75.0]

    Se debe considerar que los datos tienen tamaño de paso (h) del mismo valor.

    Literal a)

    Fórmulas de orden 2, a partir de:

    https://blog.espol.edu.ec/analisisnumerico/formulas-de-diferenciacion-por-diferencias-divididas/

    considere que el término del Error O(h2), perdió una unidad del exponente en el proceso, por lo que las fórmulas de orden 2 tienen un error del mismo orden.

    Se puede usar por ejemplo:

    Para los términos x en el intervalo [0,0.50] hacia adelante

    f'(x_i) = \frac{-f(x_{i+2})+4f(x_{i+1})-3f(x_i)}{2h} + O(h^2)

    Para el término x con 0.75, centradas:

    f'(x_i) = \frac{f(x_{i+1})-f(x_{i-1})}{2h} + O(h^2)

    y para el término x con 1.0, hacia atras:

    f'(x_i) = \frac{3f(x_{i})-4f(x_{i-1})+f(x_{i-2})}{2h} + O(h^2)

    Luego se aplica el resultado en la fórmula:

    g(x) = \sqrt{1+[f'(x)]^2}

    L = \int_a^b g(x) \delta x .

    Literal b)

    Use las fórmulas de integración numérica acorde a los intervalos. Evite repetir intervalos, que es el error más común.

    Por ejemplo, se puede calcular el integral de g(x) aplicando dos veces Simpson de 1/3, que sería la más fácil de aplicar dado los h iguales.

    Otra opción es Simpson de 3/8 añadido un trapecio, otra forma es solo con trapecios en todo el intervalo.

    Como ejemplo de cálculo usando un algoritmo en Python se muestra que:

    f'(x): [-38.  22.  66.  86. 106.]
     g(x): [ 38.0131  22.0227  66.0075  86.0058 106.0047]
    L con S13:  59.01226169578733
    L con trapecios:  61.511260218050175
    

    los cálculos fueron realizados a partir de la funciones desarrolladas durante la clase. Por lo que se muestran 3 de ellas en el algoritmo.

    import numpy as np
    import matplotlib.pyplot as plt
    
    # Funciones para integrar realizadas en clase
    def itrapecio (datos,dt):
        n=len(datos)
        integral=0
        for i in range(0,n-1,1):
            area=dt*(datos[i]+datos[i+1])/2
            integral=integral + area 
        return(integral)
    
    def isimpson13(f,h):
        n = len(f)
        integral = 0
        for i in range(0,n-2,2):
            area = (h/3)*(f[i]+4*f[i+1]+f[i+2])
            integral = integral + area
        return(integral)
    
    def isimpson38 (f,h):
        n=len(f)
        integral=0
        for i in range(0,n-3,3):
            area=(3*h/8)*(f[i]+3*f[i+1]+3*f[i+2] +f[i+3] )
            integral=integral + area
        return(integral)
    
    # INGRESO
    x = np.array( [0.0,0.25,0.50,0.75,1.00])
    fx= np.array([ 25.0, 22.0, 32.0, 51.0, 75.0])
    
    # PROCEDIMIENTO
    n = len(fx)
    dx = x[1]-x[0]
    
    # Diferenciales
    dy = np.zeros(n)
    
    for i in range(0,n-2,1):
        dy[i] = (-fx[i+2]+4*fx[i+1]-3*fx[i])/(2*dx)
    # Diferenciales penúltimo
    i = n-2
    dy[i] = (fx[i+1]-fx[i-1])/(2*dx)
    # Diferenciales último
    i = n-1
    dy[i] = (3*fx[i]-4*fx[i-1]+fx[i-2])/(2*dx)
    
    # Función gx
    gx = np.sqrt(1+(dy**2))
    
    # Integral
    integral = isimpson13(gx,dx)
    integrartr = itrapecio(gx,dx)
    
    # SALIDA 
    print('f\'(x):', dy)
    print(' g(x):', gx)
    print("L con S13: ", integral )
    print("L con trapecios: ", integrartr )
    
    plt.plot(x,fx)
    plt.show()
    

    La gráfica del cable es:
    s2Eva_IT2012_T1 MN Longitud

  • s2Eva_IT2012_T2 EDO Modelo de clima x,y,z

    Ejercicio: 2Eva_IT2012_T2 EDO Modelo de clima x,y,z

    Se deja de tarea realizar las tres primeras iteraciones en papel.

    Se presenta el resultado usando el algoritmo de segundo grado como una variante a la respuesta usada como ejemplo.

     [ ti, xi, yi, zi]
    [[ 0.0000e+00  1.0000e+01  7.0000e+00  7.0000e+00]
     [ 2.5000e-03  9.9323e+00  7.5033e+00  7.1335e+00]
     [ 5.0000e-03  9.8786e+00  7.9988e+00  7.2774e+00]
     ...
     [ 2.4995e+01 -8.4276e+00 -2.7491e+00  3.3021e+01]
     [ 2.4998e+01 -8.2860e+00 -2.6392e+00  3.2858e+01]
     [ 2.5000e+01 -8.1453e+00 -2.5346e+00  3.2692e+01]]
    

    Algoritmo en Python

    # 2Eva_IT2012_T2 Modelo de clima
    # MATG1013 Análisis Numérico
    import numpy as np
    import matplotlib.pyplot as plt
    
    def rungekutta2_fg(f,g,j,t0,x0,y0,z0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,4),dtype=float)
        # incluye el punto [t0,x0,y0,z0]
        estimado[0] = [t0,x0,y0,z0]
        ti = t0
        xi = x0
        yi = y0
        zi = z0
        for i in range(1,tamano,1):
            K1x = h * f(ti,xi,yi,zi)
            K1y = h * g(ti,xi,yi,zi)
            K1z = h * j(ti,xi,yi,zi)
            
            K2x = h * f(ti+h,xi + K1x, yi + K1y, zi + K1z)
            K2y = h * g(ti+h,xi + K1x, yi + K1y, zi + K1z)
            K2z = h * j(ti+h,xi + K1x, yi + K1y, zi + K1z)
            
            xi = xi + (K1x+K2x)/2
            yi = yi + (K1y+K2y)/2
            zi = zi + (K1z+K2z)/2
            ti = ti + h
            
            estimado[i] = [ti,xi,yi,zi]
        return(estimado)
    
    
    #INGRESO
    to = 0
    xo = 10
    yo = 7
    zo = 7
    f = lambda t,x,y,z: 10*(y-x)
    g = lambda t,x,y,z: x*(28-z) - y
    j = lambda t,x,y,z: -(8/3)*z + (x*y)
    h = 0.0025
    muestras = 10000
    
    #PROCEDIMIENTO
    #Rugen-Kutta 2_orden
    tabla = rungekutta2_fg(f,g,j,to,xo,yo,zo,h,muestras)
    
    #SALIDA
    np.set_printoptions(precision=4)
    print(' [ ti, xi, yi, zi]')
    print(tabla)
    
    # Gráfica
    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.plot(tabla[:,1], tabla[:,2], tabla[:,3])
    plt.show()
    
  • s2Eva_IIT2011_T3 EDP Parabólica, explícito

    Ejercicio: 2Eva_IIT2011_T3 EDP Parabólica, explícito

    La ecuación a resolver es:

    \frac{\delta u}{\delta t} - \frac{\delta^2 u}{\delta x^2} =2

    Como el método requerido es explícito se usan las diferencias divididas:

    \frac{d^2 u}{dx^2} = \frac{u_{i+1,j} - 2 u_{i,j} + u_{i-1,j}}{(\Delta x)^2} \frac{du}{dt} = \frac{u_{i,j+1} - u_{i,j} }{\Delta t}

    edp Parabolica Explicito 02

    Reordenando la ecuación al modelo realizado en clase:

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

    multiplicando cada lado por Δt

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

    Se establece el valor de

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

    obteniendo la ecuación general, ordenada por índices de izquierda a derecha:

    \lambda u_{i-1,j} +(1- 2 \lambda)u_{i,j} + \lambda u_{i+1,j} + 2\Delta t = u_{i,j+1}

    con valores de:

    λ = Δt/(Δx)2 = (0.04)/(0.25)2 = 0.64
    P = λ = 0.64
    Q = (1-2λ) = -0.28
    R = λ = 0.64
    
    0.64 u_{i-1,j} - 0.28 u_{i,j} + 0.64 u_{i+1,j} + 0.08 = u_{i,j+1}

    Se realizan 3 iteraciones:

    i= 1, j=0

    u_{1,1} = 0.64 u_{0,0} -0.28u_{1,0}+0.64 u_{2,0}+0.08 u_{1,1} = 0.64 [\sin(\pi*0)+0*(1-0)]- 0.28[\sin(\pi*0.25)+0.25*(1-0.25)] +0.64[\sin(\pi*0.5)+ 0.5*(1-0.5)]+0.08

    u[1,1] =0.89

    i = 2, j=0

    0.64 u_{1,0} - 0.28 u_{2,0} + 0.64 u_{3,0} + 0.08 = u_{2,1}

    u[1,0] = 1.25

    i = 3, j=0

    0.64 u_{2,0} - 0.28 u_{3,0} + 0.64 u_{4,0} + 0.08 = u_{3,1}

    u[3,1] = 0.89

    edp Parabolica Exp 2eT2011T3 01

    edp Parabolica Exp 2eT2011T3 01


    Algoritmo en Python

    con los valores y ecuación del problema

    # EDP parabólicas d2u/dx2  = K du/dt
    # método explícito, usando diferencias finitas
    # Referencia: Chapra 30.2 p.888 pdf.912
    #       Rodriguez 10.2 p.406
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    # Valores de frontera
    Ta = 0
    Tb = 0
    T0 = lambda x: np.sin(np.pi*x)+x*(1-x)
    # longitud en x
    a = 0
    b = 1
    # Constante K
    K = 1
    # Tamaño de paso
    dx = 0.1
    dt = dx/10/2
    # iteraciones en tiempo
    n = 50
    
    # PROCEDIMIENTO
    # iteraciones en longitud
    xi = np.arange(a,b+dx,dx)
    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]+2*dt
        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_IT2010_T3 EDP elíptica, Placa no rectangular

    Ejercicio: 2Eva_IT2010_T3 EDP elíptica, Placa no rectangular

    la fórmula a resolver, siendo f(x,y)=20

    \frac{\delta^2 u}{\delta x^2} + \frac{\delta^2 u}{\delta y^2} = f \frac{\delta^2 u}{\delta x^2} + \frac{\delta^2 u}{\delta y^2} = 20

    Siendo las condiciones de frontera en los bordes marcados:

    Placa Temp 02

    Se convierte a forma discreta la ecuación

    \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} = 20 u_{i+1,j}-2u_{i,j}+u_{i-1,j} + \frac{\Delta x^2}{\Delta y^2} \Big( u_{i,j+1} -2u_{i,j}+u_{i,j-1} \Big) = 20 \Delta x^2

    siendo λ = 1, al tener la malla en cuadrícula Δx=Δy

    u_{i+1,j}-4u_{i,j}+u_{i-1,j} + u_{i,j+1}+u_{i,j-1} = 20 \Delta x^2

    despejando u[i,j]

    u_{i,j} =\frac{1}{4}\Big(u_{i+1,j}+u_{i-1,j} + u_{i,j+1}+u_{i,j-1} - 20 \Delta x^2 \Big)

    Para el ejercicio, se debe usar las fronteras para los valores de cálculo que se puede hacer de dos formas:
    1. Por posición del valor en la malla [i,j]
    2. Por valor xi,yj que es la forma usada cuando la función es contínua.

    1. Por posición del valor en la malla

    Se busca la posición de la esquina derecha ubicada en xi = 0 y yj=1.5 y se la ubica como variable 'desde' como referencia para ubicar los valores de las fronteras usando los índices i, j.

    # valores en fronteras
    # busca poscición de esquina izquierda
    desde = -1 
    for j in range(0,m,1):
        if ((yj[j]-1.5)<tolera):
            desde = j
    # llena los datos de bordes de placa
    for j  in range(0,m,1):
        if (yj[j]>=1):
            u[j-desde,j] = Ta
        u[n-1,j] = Tb(xi[n-1],yj[j])
    for i in range(0,n,1):
        if (xi[i]>=1):
            u[i,m-1]=Td
        u[i,desde-i] = Tc(xi[i],yj[i])
    # valor inicial de iteración
    

    2. Por valor xi, yj

    Se establecen las ecuaciones que forman la frontera:

    ymin = lambda x,y: 1.5-(1.5/1.5)*x
    ymax = lambda x,y: 1.5+(1/1)*x
    

    que se usan como condición para hacer el cálculo en cada nodo

    if ((yj[j]-yjmin)>tolera and (yj[j]-yjmax)<-tolera):
                    u[i,j] = (u[i-1,j]+u[i+1,j]+u[i,j-1]+u[i,j+1]-20*(dx**2))/4
    

    Para minimizar errores por redondeo o truncamiento al seleccionar los puntos, la referencia hacia cero se toma como "tolerancia"; en lugar de más que cero o menos que cero.

    Con lo que se obtiene el resultado mostrado en la gráfica aumentando la resolución con Δx=Δy=0.05:

    Placa No Rectangular 01

    converge =  1
    xi=
    [0.   0.05 0.1  0.15 0.2  0.25 0.3  0.35 0.4  0.45 0.5  0.55 0.6  0.65
     0.7  0.75 0.8  0.85 0.9  0.95 1.   1.05 1.1  1.15 1.2  1.25 1.3  1.35
     1.4  1.45 1.5 ]
    yj=
    [0.   0.05 0.1  0.15 0.2  0.25 0.3  0.35 0.4  0.45 0.5  0.55 0.6  0.65
     0.7  0.75 0.8  0.85 0.9  0.95 1.   1.05 1.1  1.15 1.2  1.25 1.3  1.35
     1.4  1.45 1.5  1.55 1.6  1.65 1.7  1.75 1.8  1.85 1.9  1.95 2.   2.05
     2.1  2.15 2.2  2.25 2.3  2.35 2.4  2.45 2.5 ]
    matriz u
    [[  0.     0.     0.   ...   0.     0.     0.  ]
     [  0.     0.     0.   ...   0.     0.     0.  ]
     [  0.     0.     0.   ...   0.     0.     0.  ]
     ...
     [  0.     0.     6.67 ...  96.1   98.03 100.  ]
     [  0.     3.33   5.31 ...  96.03  98.   100.  ]
     [  0.     2.     4.   ...  96.    98.   100.  ]]
    >>>

    Algoritmo en Python

    # Ecuaciones Diferenciales Parciales
    # Elipticas. Método iterativo para placa NO rectangular
    import numpy as np
    
    # INGRESO
    # Condiciones iniciales en los bordes
    Ta = 100
    Tb = lambda x,y:(100/2.5)*y
    Tc = lambda x,y: 100-(100/1.5)*x
    Td = 100
    # dimensiones de la placa no rectangular
    x0 = 0
    xn = 1.5
    y0 = 0
    yn = 2.5
    ymin = lambda x,y: 1.5-(1.5/1.5)*x
    ymax = lambda x,y: 1.5+(1/1)*x
    # discretiza, supone dx=dy
    dx = 0.05 
    dy = 0.05 
    maxitera = 100
    tolera = 0.0001
    
    # PROCEDIMIENTO
    xi = np.arange(x0,xn+dx,dx)
    yj = np.arange(y0,yn+dy,dy)
    n = len(xi)
    m = len(yj)
    # Matriz u
    u = np.zeros(shape=(n,m),dtype = float)
    
    # valores en fronteras
    # busca posición de esquina izquierda
    desde = -1 
    for j in range(0,m,1):
        if ((yj[j]-1.5)<tolera): desde = j 
    
    # llena los datos de bordes de placa 
    
    for j in range(0,m,1): if (yj[j]>=1):
            u[j-desde,j] = Ta
        u[n-1,j] = Tb(xi[n-1],yj[j])
    for i in range(0,n,1):
        if (xi[i]>=1):
            u[i,m-1]=Td
        u[i,desde-i] = Tc(xi[i],yj[i])
    # valor inicial de iteración
    # se usan los valores cero
    
    # iterar puntos interiores
    itera = 0
    converge = 0
    while not(itera>=maxitera and converge==1):
        itera = itera + 10000
        nueva = np.copy(u)
        for i in range(1,n-1):
            for j in range(1,m-1):
                yjmin = ymin(xi[i],yj[j])
                yjmax = ymax(xi[i],yj[j])
                if ((yj[j]-yjmin)>tolera and (yj[j]-yjmax)<-tolera):
                    u[i,j] = (u[i-1,j]+u[i+1,j]+u[i,j-1]+u[i,j+1]-20*(dx**2))/4
        diferencia = nueva-u
        erroru = np.linalg.norm(np.abs(diferencia))
    
        if (erroru<tolera):
            converge=1
    
    # SALIDA
    np.set_printoptions(precision=2)
    print('converge = ', converge)
    print('xi=')
    print(xi)
    print('yj=')
    print(yj)
    print('matriz u')
    print(u)
    

    Para incorporar la gráfica en forma de superficie.

    # Gráfica
    import matplotlib.pyplot as plt
    from matplotlib import cm
    from mpl_toolkits.mplot3d import Axes3D
    
    X, Y = np.meshgrid(xi, yj)
    U = np.transpose(u) # ajuste de índices fila es x
    figura = plt.figure()
    ax = Axes3D(figura)
    ax.plot_surface(X, Y, U, rstride=1, cstride=1, cmap=cm.Reds)
    plt.title('EDP elíptica')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()
    
  • s2Eva_IT2008_T1_MN Producción petroleo

    Ejercicio: 2Eva_IT2008_T1_MN Producción petroleo

    Literal a

    Para el cálculo de las derivadas se hace uso de las fórmulas de diferenciación presentadas en la unidad 6, y basadas en el polinomio de Taylor:

    f'(x_i) = \frac{f(x_{i+1})-f(x_i)}{h} + O(h) f''(x_i) = \frac{f(x_{i+2})-2f(x_{i+1})+f(x_i)}{h^2} + O(h)
    [ dia, prod, dprod, d2prod]
    [[ 1.000e+00  3.345e+03 -1.000e+02  6.600e+01]
     [ 2.000e+00  3.245e+03 -3.400e+01  1.320e+02]
     [ 3.000e+00  3.211e+03  9.800e+01 -5.600e+01]
     [ 4.000e+00  3.309e+03  4.200e+01  1.900e+01]
     [ 5.000e+00  3.351e+03  6.100e+01 -2.430e+02]
     [ 6.000e+00  3.412e+03 -1.820e+02  8.700e+01]
     [ 7.000e+00  3.230e+03 -9.500e+01  9.200e+01]
     [ 8.000e+00  3.135e+03 -3.000e+00  0.000e+00]
     [ 9.000e+00  3.132e+03 -3.000e+00  0.000e+00]
     [ 1.000e+01  3.129e+03  0.000e+00  0.000e+00]]
    

    representados en las siguientes gráfica:

    literal b

    Dado que las fórmlas de error usadas tienen error del orden h: O(h), el error de las fórmulas es del orden de:

    h= dia[1]-dia[0] = 2-1 = 1
    

    literal c

    Para el día dos se observa un decrecimiento en la producción, tal como lo refleja el valor negativo de la primera derivada.
    Sin embargo para el día siguiente, la producción no mantiene la tasa de decrecimiento, se observa la segunda derivada positiva, Empieza a "acelerar".


    Las instrucciones en Python para la tabla presentada son:

    # 2Eva_IT2008_T1_MN Producción petroleo
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    dia = np.array( [1., 2, 3, 4, 5, 6, 7, 8, 9, 10])
    produccion = [3345., 3245, 3211, 3309, 3351, 3412, 3230, 3135, 3132, 3129]
    produccion = np.array(produccion, dtype = float)
    
    # PROCEDIMIENTO
    n = len(dia)
    
    # primera derivada
    dp = np.zeros(n,dtype=float)
    for i in range(0,n-1,1):
        dp[i] = (produccion[i+1]-produccion[i])/(dia[i+1]-dia[i])
    
    # segunda derivada
    d2p = np.zeros(n,dtype=float)
    h = dia[1]-dia[0]
    for i in range(0,n-2,1):
        d2p[i] = (produccion[i]-2*produccion[i+1]+ produccion[i+2])/(h**2)
    
    tabla = np.concatenate(([dia],[produccion],[dp],[d2p]),axis=0)
    tabla = np.transpose(tabla)
    
    # SALIDA
    print(" [ dia, prod, dprod, d2prod]")
    print(tabla)
    
    # gráfica
    plt.subplot(121)
    plt.plot(dia,produccion)
    plt.xlabel('dia')
    plt.ylabel('producción')
    plt.grid()
    plt.subplot(122)
    plt.plot(dia,dp,color='green',label='dp')
    plt.xlabel('dia')
    plt.plot(dia,d2p,color='orange',label='d2p')
    plt.axhline(0)
    plt.legend()
    plt.grid()
    plt.show()
    
  • s2Eva_IIT2007_T2_AN EDO Lanzamiento vertical proyectil

    Ejercicio: 2Eva_IIT2007_T2_AN EDO Lanzamiento vertical proyectil

    la ecuación del problema:

    m \frac{\delta v}{\delta t} = -mg - kv|v|

    se despeja:

    \frac{\delta v}{\delta t} = -g - \frac{k}{m}v|v|

    y usando los valores indicados en el enunciado:

    \frac{\delta v}{\delta t} = -9,8 - \frac{0.002}{0.11}v|v|

    con valores iniciales de:

    t0 = 0 , v0 = 8 , h=0.2

    Como muestra inicial, se usa Runge-Kutta de 2do Orden

    iteración 1

    K_1 = h\frac{\delta v}{\delta t}(0, 8) = 0.2[-9,8 - \frac{0.002}{0.11}8|8|] = -2.1927 K_2 = h\frac{\delta v}{\delta t}(0+0.2, 8 -2.1927 ) = 0.2[-9,8 - \frac{0.002}{0.11}(8 -2.1927)|8 -2.1927|] =-2.0826 v_1 = -9,8 +\frac{-2.1927-2.0826 }{2} = 5.8623 t_1 = t_0 + h = 0 + 0.2 = 0.2 error = O(h^3) = O(0.2^3) = O(0.008)

    iteración 2

    K_1 = h\frac{\delta v}{\delta t}(0.2, 5.8623) = 0.2[-9,8 - \frac{0.002}{0.11}(5.8623)|5.8623|] = -2.085 K_2 = h\frac{\delta v}{\delta t}(0+0.2, 5.8623 -2.085) = 0.2[-9,8 - \frac{0.002}{0.11}(5.8623 -2.085)|5.8623 -2.085|] =-2.0119 v_2 = -9,8 +\frac{-2.085-2.0119}{2} = 3.8139 t_2 = t_1 + h = 0.2 + 0.2 = 0.4

    iteración 3

    K_1 = h\frac{\delta v}{\delta t}(0.4, 3.8139) = 0.2[-9,8 - \frac{0.002}{0.11}( 3.8139)| 3.8139|] = -2.0129 K_2 = h\frac{\delta v}{\delta t}(0+0.2, 3.8139 -2.0129) = 0.2[-9,8 - \frac{0.002}{0.11}(3.8139 -2.0129)|3.8139 -2.0129|] =-1.9718 v_3 = -9,8 +\frac{-2.0129-1.9718}{2} = 1.8215 t_3 = t_2 + h = 0.4 + 0.2 = 0.6

    Tabla y gráfica del ejercicio para todo el intervalo:

     [xi,      yi,     K1,     K2    ]
    [[ 0.      8.      0.      0.    ]
     [ 0.2     5.8623 -2.1927 -2.0826]
     [ 0.4     3.8139 -2.085  -2.0119]
     [ 0.6     1.8215 -2.0129 -1.9718]
     [ 0.8    -0.1444 -1.9721 -1.9599]
     [ 1.     -2.0964 -1.9599 -1.9439]]

    2EIIT2007T2 Lanza Vertical

    Algoritmo en Python

    # 3Eva_IT2009_T2 EDO Taylor Seno(x)
    import numpy as np
    import matplotlib.pyplot as plt
    
    # INGRESO
    d1y = lambda t,v: -9.8-(0.002/0.11)*v*np.abs(v)
    x0 = 0
    y0 = 8
    h = 0.2
    a = 0
    b = 1
    
    # PROCEDIMIENTO
    muestras = int((b -a)/h)+1
    tabla = np.zeros(shape=(muestras,4),dtype=float)
    
    i = 0
    xi = x0
    yi = y0
    tabla[i,:] = [xi,yi,0,0]
    
    i = i+1
    while not(i>=muestras):
        K1 = h*d1y(xi,yi)
        K2 = h*d1y(xi+h,yi+K1)
        yi = yi + (K1+K2)/2
        xi = xi +h
        tabla[i,:] = [xi,yi,K1,K2]
        i = i+1
    # vector para gráfica
    xg = tabla[:,0]
    yg = tabla[:,1]
    
    # SALIDA
    # muestra 4 decimales
    np.set_printoptions(precision=4)
    print(' [xi, yi, K1, K2]')
    print(tabla)
    # Gráfica
    plt.plot(xg,yg)
    plt.xlabel('ti')
    plt.ylabel('yi')
    plt.grid()
    plt.show()
    

    Tarea: Realizar iteraciones para Runge-Kutta de 4to Orden

  • s2Eva_IT2015_T2 EDO Deflexión de mástil

    Ejercicio: 2Eva_IT2015_T2 EDO Deflexión de mástil

    \frac{\delta ^2 y}{\delta x^2} = \frac{f}{2EI} (L-x)^2 x= 0, y = 0, \frac{\delta y}{\delta x} = 0

    Ecuación en forma estandarizada:

    y'' = \frac{f}{2EI} (L-x)^2

    Sistema de ecuaciones

    y' = z = f(x,y,z) z' = \frac{f}{2EI} (L-x)^2 = g(x,y,z)

    siendo:

    \frac{f}{2EI} =\frac{60}{2(1.25 \times 10 ^{-8}) (0.05)} = 4.8 \times 10^{-6}

    El mástil mide L=30 m y se requieren 30 intervalos, entonces h = 30/30 = 1.

    Usando muestras = tramos +1 = 31

    Se plantea una solución usando Runge Kutta de 2do Orden

    f(x,y,z) = z g(x,y,z) = (4.8 \times 10^{-6})(30-x)^2

    Desarrollo analítico

    Las iteraciones se realizan para llenar los datos de la tabla,

    tabla de resultados
    i xi yi zi
    0 0 0 0
    1 1 0.00216 0.00417
    2 2 0.00835 0.00807
    3 3 tarea ...

    iteración 1

    i = 0 ; x0= 0; y0 = 0; z0 = 0

    K_{1y} = h f(x_0,y_0, z_0)= 1(0) = 0

     

    K_{1z} = h g(x_0,y_0, z_0) = = 1(4.8 \times 10^{-6})(30-0)^2 = 0.00432 K_{2y} = h f(x_0+h,y_0+K_{1y}, z_0+K_{1z}) = = 1(0+0.00432) = 0.00432 K_{2z} = h g(x_0+h,y_0+K_{1y}, z_0+K_{1z}) = = 1(4.8 \times 10^{-6})(30-(0+1))^2 = 0.00403 y_1 = y_0 + \frac{K_{1y}+K_{2y}}{2} = = 0 + \frac{0+0.00432}{2} = 0.00216 z_1 = z_0 + \frac{K_{1z}+K_{2z}}{2} = = 0 + \frac{0.00432+0.00403}{2} = 0.00417

    iteración 2

    i = 2 ; x1= 1; y1 = 0.00216; z1 = 0.00417

    K_{1y} = h f(x_1,y_1, z_1)= 1(0.00417) = 0.00417 K_{1z} = h g(x_1,y_1, z_1) = = 1(4.8 \times 10^{-6})(30-1)^2 = 0.00403 K_{2y} = h f(x_1+h,y_1+K_{1y}, z_1+K_{1z}) = = 1(0.00417+0.00403) = 0.00821 K_{2z} = h g(x_1+h,y_1+K_{1y}, z_1+K_{1z}) = = 1(4.8 \times 10^{-6})(30-(1+1))^2 = 0.00376 y_2 = y_1 + \frac{K_{1y}+K_{2y}}{2} = = 0.00216 + \frac{0.00417+0.00821}{2} = 0.00835 z_2 = z_2 + \frac{K_{1z}+K_{2z}}{2} = = 0.00417 + \frac{0.00403+0.00376}{2} = 0.00807

    iteración 3
    i = 2; x2= 2; y2 = 0.00835; z2 = 0.00807
    tarea ...

    Para facilitar los cálculos se propone usa el algoritmo en Python, como se describe en la siguiente sección.


    Algoritmo en Python

    Al usar el algoritmo se puede comparar los resultados entre Runge-Kutta de 2do orden y de 4to Orden.

    De los resultados se presenta la siguiente gráfica

    EDO2EIT2015T2 Deflexion Mastil 01

    Observe en la gráfica la diferencia de escalas entre los ejes.

    Runge Kutta 2do Orden
     [x, y, z]
    [[  0.00000000e+00   0.00000000e+00   0.00000000e+00]
     [  1.00000000e+00   2.16000000e-03   4.17840000e-03]
     [  2.00000000e+00   8.35680000e-03   8.07840000e-03]
     [  3.00000000e+00   1.83168000e-02   1.17096000e-02]
     [  4.00000000e+00   3.17760000e-02   1.50816000e-02]
     [  5.00000000e+00   4.84800000e-02   1.82040000e-02]
     ...
     [  2.90000000e+01   9.29856000e-01   4.32216000e-02]
     [  3.00000000e+01   9.73080000e-01   4.32240000e-02]
     [  3.10000000e+01   1.01630400e+00   4.32264000e-02]]
    
    Runge Kutta 4do Orden
     [x, y, z]
    [[  0.00000000e+00   0.00000000e+00   0.00000000e+00]
     [  1.00000000e+00   2.11240000e-03   4.17760000e-03]
     [  2.00000000e+00   8.26240000e-03   8.07680000e-03]
     [  3.00000000e+00   1.81764000e-02   1.17072000e-02]
     [  4.00000000e+00   3.15904000e-02   1.50784000e-02]
     [  5.00000000e+00   4.82500000e-02   1.82000000e-02]
     ...
     [  2.90000000e+01   9.28800400e-01   4.31984000e-02]
     [  3.00000000e+01   9.72000000e-01   4.32000000e-02]
     [  3.10000000e+01   1.01520040e+00   4.32016000e-02]]
    >>> 
    

    Las instrucciones en Python obtener los resultados:

    # 2Eva_IT2015_T2 Deflexión de mástil
    # solución propuesta: edelros@espol.edu.ec
    import numpy as np
    
    def rungekutta2fg(fx,gx,x0,y0,z0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,3),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0,z0]
        xi = x0
        yi = y0
        zi = z0
        for i in range(1,tamano,1):
            K1y = h * fx(xi,yi,zi)
            K1z = h * gx(xi,yi,zi)
            
            K2y = h * fx(xi+h, yi + K1y, zi + K1z)
            K2z = h * gx(xi+h, yi + K1y, zi + K1z)
    
            yi = yi + (K1y+K2y)/2
            zi = zi + (K1z+K2z)/2
            xi = xi + h
            
            estimado[i] = [xi,yi,zi]
        return(estimado)
    
    def rungekutta4fg(fx,gx,x0,y0,z0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,3),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0,z0]
        xi = x0
        yi = y0
        zi = z0
        for i in range(1,tamano,1):
            K1y = h * fx(xi,yi,zi)
            K1z = h * gx(xi,yi,zi)
            
            K2y = h * fx(xi+h/2, yi + K1y/2, zi + K1z/2)
            K2z = h * gx(xi+h/2, yi + K1y/2, zi + K1z/2)
            
            K3y = h * fx(xi+h/2, yi + K2y/2, zi + K2z/2)
            K3z = h * gx(xi+h/2, yi + K2y/2, zi + K2z/2)
    
            K4y = h * fx(xi+h, yi + K3y, zi + K3z)
            K4z = h * gx(xi+h, yi + K3y, zi + K3z)
    
            yi = yi + (K1y+2*K2y+2*K3y+K4y)/6
            zi = zi + (K1z+2*K2z+2*K3z+K4z)/6
            xi = xi + h
            
            estimado[i] = [xi,yi,zi]
        return(estimado)
    
    # INGRESO
    f = 60
    L = 30
    E = 1.25e8
    I = 0.05
    x0 = 0
    y0 = 0
    z0 = 0
    tramos = 30
    
    fx = lambda x,y,z: z
    gx = lambda x,y,z: (f/(2*E*I))*(L-x)**2
    
    # PROCEDIMIENTO
    muestras = tramos + 1
    h = L/tramos
    tabla2 = rungekutta2fg(fx,gx,x0,y0,z0,h,muestras)
    xi2 = tabla2[:,0]
    yi2 = tabla2[:,1]
    zi2 = tabla2[:,2]
    
    tabla4 = rungekutta4fg(fx,gx,x0,y0,z0,h,muestras)
    xi4 = tabla4[:,0]
    yi4 = tabla4[:,1]
    zi4 = tabla4[:,2]
    
    # SALIDA
    print('Runge Kutta 2do Orden')
    print(' [x, y, z]')
    print(tabla2)
    print('Runge Kutta 4do Orden')
    print(' [x, y, z]')
    print(tabla4)
    
    # GRAFICA
    import matplotlib.pyplot as plt
    plt.plot(xi2,yi2, label='Runge-Kutta 2do Orden')
    plt.plot(xi4,yi4, label='Runge-Kutta 4do Orden')
    plt.title('Deflexión de mástil')
    plt.xlabel('x')
    plt.ylabel('y: deflexión')
    plt.legend()
    plt.grid()
    plt.show()
    
  • s2Eva_IT2012_T3_MN EDO Taylor 2 Contaminación de estanque

    Ejercicio: 2Eva_IT2012_T3_MN EDO Taylor 2 Contaminación de estanque

    La ecuación a resolver con Taylor es:

    s'- \frac{26s}{200-t} - \frac{5}{2} = 0

    Para lo que se plantea usar la primera derivada:

    s'= \frac{26s}{200-t}+\frac{5}{2}

    con valores iniciales de s(0) = 0, h=0.1

    La fórmula de Taylor para tres términos es:

    s_{i+1}= s_{i}+s'_{i}h + \frac{s''_{i}}{2}h^2 + error

    Para el desarrollo se compara la solución con dos términos, tres términos y Runge Kutta.

    1. Solución con dos términos de Taylor

    Iteraciones

    i = 0, t0 = 0, s(0)=0

    s'_{0}= \frac{26s_{0}}{200-t_{0}}+\frac{5}{2} = \frac{26(0)}{200-0}+\frac{5}{2} = \frac{5}{2} s_{1}= s_{0}+s'_{0}h = 0+ \frac{5}{2}*0.1= 0.25

    t1 =  t0+h = 0+0.1 = 0.1

    i=1


    s'_{1}= \frac{26s_{1}}{200-t_{1}}+\frac{5}{2} = \frac{26(0.25)}{200-0.1}+\frac{5}{2} = 2.5325 s_{2}= s_{1}+s'_{1}h = 0.25 + (2.5325)*0.1 = 0.5032

    t2 =  t1+h = 0.1+0.1 = 0.2

    i=2,

    resolver como tarea


    2. Resolviendo con Python

    estimado
     [xi,yi Taylor,yi Runge-Kutta, diferencias]
    [[ 0.0  0.0000e+00  0.0000e+00  0.0000e+00]
     [ 0.1  2.5000e-01  2.5163e-01 -1.6258e-03]
     [ 0.2  5.0325e-01  5.0655e-01 -3.2957e-03]
     [ 0.3  7.5980e-01  7.6481e-01 -5.0106e-03]
     [ 0.4  1.0197e+00  1.0265e+00 -6.7714e-03]
     [ 0.5  1.2830e+00  1.2916e+00 -8.5792e-03]
     [ 0.6  1.5497e+00  1.5601e+00 -1.0435e-02]
     [ 0.7  1.8199e+00  1.8322e+00 -1.2339e-02]
     [ 0.8  2.0936e+00  2.1079e+00 -1.4294e-02]
     [ 0.9  2.3710e+00  2.3873e+00 -1.6299e-02]
     [ 1.0  2.6519e+00  2.6703e+00 -1.8357e-02]
     [ 1.1  2.9366e+00  2.9570e+00 -2.0467e-02]
     [ 1.2  3.2250e+00  3.2476e+00 -2.2632e-02]
     [ 1.3  3.5171e+00  3.5420e+00 -2.4853e-02]
     [ 1.4  3.8132e+00  3.8403e+00 -2.7129e-02]
     [ 1.5  4.1131e+00  4.1426e+00 -2.9464e-02]
     [ 1.6  4.4170e+00  4.4488e+00 -3.1857e-02]
     [ 1.7  4.7248e+00  4.7592e+00 -3.4310e-02]
     [ 1.8  5.0368e+00  5.0736e+00 -3.6825e-02]
     [ 1.9  5.3529e+00  5.3923e+00 -3.9402e-02]
     [ 2.0  5.6731e+00  5.7152e+00 -4.2043e-02]]
    error en rango:  0.04204310894163932

    contamina Estanque 02


    2. Algoritmo en Python

    # EDO. Método de Taylor 3 términos 
    # estima la solucion para muestras espaciadas h en eje x
    # valores iniciales x0,y0
    # entrega arreglo [[x,y]]
    import numpy as np
    
    def edo_taylor2t(d1y,x0,y0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,2),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0]
        x = x0
        y = y0
        for i in range(1,tamano,1):
            y = y + h*d1y(x,y) # + ((h**2)/2)*d2y(x,y)
            x = x+h
            estimado[i] = [x,y]
        return(estimado)
    
    def rungekutta2(d1y,x0,y0,h,muestras):
        tamano = muestras + 1
        estimado = np.zeros(shape=(tamano,2),dtype=float)
        # incluye el punto [x0,y0]
        estimado[0] = [x0,y0]
        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]
        return(estimado)
    
    # PROGRAMA PRUEBA
    # 2Eva_IIT2016_T3_MN EDO Taylor 2, Tanque de agua
    
    # INGRESO.
    # d1y = y' = f, d2y = y'' = f'
    d1y = lambda x,y: 26*y/(200-x)+5/2
    x0 = 0
    y0 = 0
    h = 0.1
    muestras = 20
    
    # PROCEDIMIENTO
    puntos = edo_taylor2t(d1y,x0,y0,h,muestras)
    xi = puntos[:,0]
    yi = puntos[:,1]
    
    # Con Runge Kutta
    puntosRK2 = rungekutta2(d1y,x0,y0,h,muestras)
    xiRK2 = puntosRK2[:,0]
    yiRK2 = puntosRK2[:,1]
    
    # diferencias
    diferencias = yi-yiRK2
    error = np.max(np.abs(diferencias))
    tabla = np.copy(puntos)
    tabla = np.concatenate((puntos,np.transpose([yiRK2]),
                            np.transpose([diferencias])),
                           axis = 1)
    
    # SALIDA
    np.set_printoptions(precision=4)
    print('estimado[xi,yi Taylor,yi Runge-Kutta, diferencias]')
    print(tabla)
    print('error en rango: ', error)
    
    # Gráfica
    import matplotlib.pyplot as plt
    plt.plot(xi[0],yi[0],'o',
             color='r', label ='[x0,y0]')
    plt.plot(xi[0:],yi[0:],'-',
             color='g',
             label ='y Taylor 2 términos')
    plt.plot(xiRK2[0:],yiRK2[0:],'-',
             color='blue',
             label ='y Runge-Kutta 2Orden')
    plt.axhline(y0/2)
    plt.title('EDO: Taylor 2T vs Runge=Kutta 2Orden')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid()
    plt.show()
    

    Usando Taylor con 3 términos

    estimado
     [xi,        yi,        d1yi,      d2yi      ]
    [[0.         0.         2.5        0.325     ]
     [0.1        0.251625   2.53272761 0.32958302]
     [0.2        0.50654568 2.56591685 0.33423301]
     [0.3        0.76480853 2.59957447 0.33895098]
     [0.4        1.02646073 2.63370731 0.34373796]
     [0.5        1.29155015 2.66832233 0.348595  ]
     [0.6        1.56012536 2.70342658 0.35352316]
     [0.7        1.83223563 2.73902723 0.35852351]
     [0.8        2.10793097 2.77513155 0.36359715]
     [0.9        2.38726211 2.81174694 0.36874519]
     [1.         2.67028053 2.84888087 0.37396876]
     [1.1        2.95703846 2.88654098 0.37926901]
     [1.2        3.24758891 2.92473497 0.3846471 ]
     [1.3        3.54198564 2.96347069 0.39010422]
     [1.4        3.84028323 3.00275611 0.39564157]
     [1.5        4.14253705 3.04259931 0.40126036]
     [1.6        4.44880328 3.08300849 0.40696184]
     [1.7        4.75913894 3.12399199 0.41274727]
     [1.8        5.07360187 3.16555827 0.41861793]
     [1.9        5.39225079 3.2077159  0.42457511]
     [2.         5.71514526 0.         0.        ]]