Autor: Edison Del Rosario

  • Descargas - Instrucciones paso a paso

    Instalar: [ WinPython ] [ Python ] [ PIP librerías ] [ Numpy ] [ Matplotlib ]

    WinPython

    WinPython descargar instalar para fundamentos de programación WinPython (portable) Instrucciones de Instalación paso a paso para Windows, todas las librerías científicas incluidas. No se requiere usuario administrador, solo un directorio con permisos de escritura.

    Instalar: [ WinPython ] [ Python ] [ PIP librerías ] [ Numpy ] [ Matplotlib ]


    Python

    Python descargar e instalar para fundamentos de programación

    Python - Descargar e instalar paso a paso

    PIP - instalar librerías en Python paso a paso

    Numpy - Arreglos. Instalación con pip paso a paso

    Matplotlib - Gráficas. Instalación con pip paso a paso

    Scipy - cálculo científico. Instalación con pip paso a paso

    Instalar: [ WinPython ] [ Python ] [ PIP librerías ] [ Numpy ] [ Matplotlib ]


    Pydroid 3

    Pydroid 3 - Python para Android, para uso en tablets y móvil celular con Android

    Python para android descargar e instalar para fundamentos de programación

    Instalar: [ WinPython ] [ Python ] [ PIP librerías ] [ Numpy ] [ Matplotlib ]


    Pythonista 3 para IOS

    Python para IOS en el iPad o iPhone.

    https://omz-software.com/pythonista/index.html

    Instalar: [ WinPython ] [ Python ] [ PIP librerías ] [ Numpy ] [ Matplotlib ]


    Octave/Matlab  Octave o matlab descargar e instalar para fundamentos de programación

    Programa Open Source que interpreta archivos .m Descarga.

    notepad++ : Editor Open Source para archivos .m Descarga.

    Octave Android: https://play.google.com/store/apps/details?id=com.octave&hl=es-419

    Octave - Instalación paso a paso

    1.1 Descomprimir el zip en c:\octave
    1.2 Crear un acceso directo para c:\octave\bin\octave.exe
    1.3 Añadir -i --line-editing
    en propiedades del acceso directo creado para octave.exe.
    (Ejemplo: c:\octave\bin\octave.exe -i --line-editing)
    1.4. editar el archivo de inicio del programa en y y añadir al final las siguientes líneas:

    c:\octave\share\octave\site\m\startup\octavevrc
    cd Documents
    cd Matlab

    Instalar: [ WinPython ] [ Python ] [ PIP librerías ] [ Numpy ] [ Matplotlib ]

  • 6.2.1 EDO dy/dx, Runge-Kutta 4to Orden con Python

    [ Runge Kutta 4to Orden ] [ Función ] [ Ejercicio en video ]

    ..


    EDO  \frac{\delta y}{\delta x} Runge-Kutta 4to Orden

    Referencia: Chapra 25.3.3 p746, Rodríguez 9.1.8 p358

    Para una ecuación diferencial de primera derivada (primer orden) con una condición de inicio:
    Runge Kutta 4to Orden

    \frac{\delta y}{\delta x} + etc =0 y'(x) = f(x_i,y_i) y(x_0) = y_0

    La fórmula de Runge-Kutta de 4to orden realiza una corrección con 4 valores de K:

    y_{i+1} = y_i + \frac{K_1 + 2K_2 + 2K_3 + K_4}{6}

    debe ser equivalente a la serie de Taylor de 5 términos:

    y_{i+1} = y_i + h f(x_i,y_i) + + \frac{h^2}{2!} f'(x_i,y_i) + \frac{h^3}{3!} f''(x_i,y_i) + +\frac{h^4}{4!} f'''(x_i,y_i) + O(h^5) x_{i+1} = x_i + h

    Runge-Kutta 4do Orden tiene error de truncamiento O(h5)

    Ejercicio

    Para el desarrollo analítico se tienen las siguientes expresiones para el ejercicio usado en Runge-Kutta de orden 2, que ahora será con orden 4:

    f(x,y) = y' = y -x^2 +x +1

    Se usa las expresiones de Runge-Kutta en orden, K1 corresponde a una corrección de EDO con Taylor de dos términos (método de Euler). K2 considera el cálculo a medio tamaño de paso más adelante.

    iteración:

    K_1 = h f(x_i,y_i) = 0.1 (y_i -x_i^2 +x_i +1) K_2 = h f\Big(x_i+\frac{h}{2}, y_i + \frac{K_1}{2} \Big) K_2 = 0.1 \Big(\big(y_i+\frac{K_1}{2}\big) -\big(x_i+\frac{h}{2}\big)^2 +\big(x_i+\frac{h}{2}\big) +1 \Big) K_3 = h f\Big(x_i+\frac{h}{2}, y_i + \frac{K_2}{2} \Big) K_3 = 0.1 \Big(\big(y_i+\frac{K_2}{2}\big) -\big(x_i+\frac{h}{2}\big)^2 +\big(x_i+\frac{h}{2}\big) +1 \Big) K_4 = h f(x_i+h, y_i + K_3 ) K_4 = 0.1 \Big((y_i+K_3) -(x_i+h)^2 +(x_i+h) +1 \Big) y_{i+1} = y_i + \frac{K_1+2K_2+2K_3+K_4}{6} x_{i+1} = x_i + h

    Las iteraciones se dejan como tarea

    [ Runge Kutta 4to Orden ] [ Función ] [ Ejercicio en video ]

    ..


    Algoritmo en Python como Función

    def rungekutta4(d1y,x0,y0,h,muestras, vertabla=False, precision=6):
        ''' solucion a EDO con Runge-Kutta 4do Orden primera derivada,
            x0,y0 son valores iniciales, tamaño de paso h.
            muestras es la cantidad de puntos a calcular.
        '''
        # Runge Kutta de 4do orden
        tamano = muestras + 1
        tabla = np.zeros(shape=(tamano,2+4),dtype=float)
        
        # incluye el punto [x0,y0,K1,K2,K3,K4]
        tabla[0] = [x0,y0,0,0,0,0]
        xi = x0
        yi = y0
        for i in range(1,tamano,1):
            K1 = h * d1y(xi,yi)
            K2 = h * d1y(xi+h/2, yi + K1/2)
            K3 = h * d1y(xi+h/2, yi + K2/2)
            K4 = h * d1y(xi+h, yi + K3)
    
            yi = yi + (1/6)*(K1+2*K2+2*K3 +K4)
            xi = xi + h
            
            tabla[i] = [xi,yi,K1,K2,K3,K4]
            
        if vertabla==True:
            np.set_printoptions(precision)
            titulo = ' [xi,     yi,     K1,    K2,     K3,     K4 ]'
            print(' EDO con Runge-Kutta 4do Orden primera derivada')
            print(titulo)
            print(tabla)
        return(tabla)
    

    Note que el método de Runge-Kutta de 4to orden es similar a la regla de Simpson 1/3. La ecuación representa un promedio ponderado para establecer la mejor pendiente.

    [ Runge Kutta 4to Orden ] [ Función ] [ Ejercicio en video ]

    ..


    Ejercicio

    2Eva_IT2018_T1 Paracaidista wingsuit

    Solución Propuesta: s2Eva_IT2018_T1 Paracaidista wingsuit

     

    La segunda parte corresponde a Runge-Kutta de 4to Orden

    [ Runge Kutta 4to Orden ] [ Función ] [ Ejercicio en video ]

  • 6.2 EDO dy/dx, Runge-Kutta con Python

    [ Runge Kutta  dy/dx ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]
    ..


    1. EDO \frac{\delta y}{\delta x} con Runge-Kutta de 2do Orden

    Referencia: Burden 5.4 p209, Chapra 25.3 p740, Rodríguez 9.1.7 p354, Boyce DiPrima 4Ed 8.4 p450

    Para una ecuación diferencial ordinaria de primera derivada, el método Runge-Kutta de 2do Orden usa una corrección sobre la derivada a partir de los puntos xi y xi+h,  es decir un tamaño de paso h hacia adelante, calculados como términos K1 y K2.

    EDO Runge-Kutta 2do orden primera derivada _animado
    Considere una ecuación diferencial de primera derivada con una condición de inicio se reordena y se escribe como f(x,y) siguiendo los pasos:

    \frac{\delta y}{\delta x} + etc =0 y'(x) = f(x_i,y_i) y(x_0) = y_0

    Los términos K1 y K2 se calculan para predecir el próximo valor en y[i+1], observe que el término K1 es el mismo que el método de Edo con Taylor de dos términos.

    K_1 = h f(x_i,y_i) K_2 = h f(x_i+h, y_i + K_1) y_{i+1} = y_i + \frac{K_1+K_2}{2} x_{i+1} = x_i + h

    Runge-Kutta 2do Orden 02

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

    Las iteraciones se repiten para encontrar el siguiente punto en x[i+1] como se muestra en el gráfico animado.

    Los métodos de Runge-Kutta  mejoran la aproximación a la respuesta de la ecuación diferencial ordinaria sin requerir determinar las expresiones de las derivadas de orden superior, como fue necesario en EDO con Taylor.

    Para observar al idea básica, considere observar un combate aéreo simulado en la década de 1940, donde las armas se encuentras fijas en las alas del avión. Observe dos minutos del video sugerido a partir de donde se encuentra marcado el enlace.

    Video Revisar:

    Luego de observar el video de introducción conteste las siguientes preguntas:
    ¿ Que trayectoria siguen los proyectiles al salir del cañón?
    ¿ Que trayectoria siguen los aviones, el perseguido y el que caza?
    ¿ Cuál es la relación entre las trayectorias de los dos aviones?

    Runge-Kutta 2do Orden primera derivada

    [ Runge Kutta  dy/dx ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]
    ..


    2. Ejercicio

    Referencia: Rodríguez 9.1.1 ejemplo p335. Chapra 25.1.3 p731

    Se pide encontrar puntos de la solución en la ecuación diferencial usando los tres primeros términos de la serie de Taylor con h=0.1 y punto inicial x0=0, y0=1

    \frac{dy}{dx}-y -x +x^2 -1 = 0 y'-y -x +x^2 -1 = 0

    [ Runge Kutta  dy/dx] [ Ejercicio ] [ Analítico ] [ Algoritmo ]
    ..


    3. Desarrollo Analítico

    Se reordena la expresión haciendo que la derivada se encuentre en el lado izquierdo:

    f(x,y) = y' = y -x^2 +x +1

    Se usa las expresiones de Runge-Kutta en orden, K1 corresponde a una corrección de EDO con Taylor de dos términos (método de Euler). K2 considera el cálculo a un tamaño de paso más adelante. iteración:

    K_1 = h f(x_i,y_i) = 0.1 (y_i -x_i^2 +x_i +1) K_2 = h f(x_i+h, y_i + K_1) K_2 = 0.1 \Big((y_i+K_1) -(x_i+h)^2 +(x_i+h) +1 \Big) y_{i+1} = y_i + \frac{K_1+K_2}{2} x_{i+1} = x_i + h

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

    EDO Runge-Kutta 2do orden primera derivada _animado

    para el ejercicio, el tamaño de paso h=0.1, se realizan tres iteraciones en las actividades del curso con lápiz y papel,

    itera = 0 , x0 = 0, y0 = 1

    K_1 = 0.1 f(0,1) = 0.1 \Big( 1 -0^2 +0 +1 \Big) = 0.2 K_2 = 0.1 f(0+0.1, 1+ 0.2) K_2 = 0.1 \Big( (1+ 0.2) - (0+0.1) ^2 +(0+0.1) +1\Big) = 0.229 y_1 = 1 + \frac{0.2+0.229}{2} = 1.2145 x_1 = 0 + 0.1 = 0.1

    itera = 1 , x1 = 0.1, y1 = 1.2145

    K_1 = 0.1 f(0.1,1.2145) = 0.1( 1.2145 -0.1^2 +0.1 +1) K_1 = 0.2304 K_2 = 0.1 f(0.1+0.1, 1.2145 + 0.2304) =0.1 \Big((1.2145 + 0.2304) -(0.1+0.1)^2 +(0.1+0.1) +1\Big) K_2 = 0.2604 y_2 = 1.2145 + \frac{0.2304+0.2604}{2} = 1.4599 x_2 = 0.1 +0.1 = 0.2

    itera = 2 , x2 = 0.2, y2 = 1.4599

    K_1 = 0.1 f(0.2,1.4599) = 0.1( 1.4599 -0.2^2 +0.2 +1) K_1 = 0.2619 K_2 = 0.1 f(0.2+0.1, 1.4599 + 0.2619) =0.1 \Big((1.4599 + 0.2619) -(0.2+0.1)^2 +(0.2+0.1) +1\Big) K_2 = 0.2931 y_2 = 1.4599 + \frac{0.2619+0.2931}{2} = 1.7375 x_2 = 0.2 +0.1 = 0.3

    luego de las 3 iteraciones en papel, se completan los demás puntos con el algoritmo obteniendo la gráfica resultante para y(x) correspondiente.

    EDO dy/dx con Runge-Kutta 2 Orden
    i, [xi,     yi,     K1,    K2]
    0 [0. 1. 0. 0.]
    1 [0.1    1.2145 0.2    0.229 ]
    2 [0.2      1.459973 0.23045  0.260495]
    3 [0.3      1.73757  0.261997 0.293197]
    4 [0.4      2.048564 0.294757 0.327233]
    5 [0.5      2.394364 0.328856 0.362742]
    >>> 
    

    ecuación diferencial ordinaria con Runge-Kutta de 2do orden

    Compare los resultados con Taylor de 2 y 3 términos.

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

    [ Runge Kutta  dy/dx ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]
    ..


    4. Algoritmo en Python

    Para el ejercicio anterior, se adjunta el programa de prueba que usa la función rungekutta2(d1y,x0,y0,h,muestras) .

    Las iteraciones y sus valores se pueden observar usando vertabla=true

    # EDO dy/dx. M todo de RungeKutta 2do Orden 
    # estima la solucion para muestras espaciadas h en eje x
    # valores iniciales x0,y0, entrega tabla[xi,yi,K1,K2]
    import numpy as np
    
    def rungekutta2(d1y,x0,y0,h,muestras,
                    vertabla=False,precision=6):
        '''solucion a EDO dy/dx, con Runge Kutta de 2do orden
        d1y es la expresi n dy/dx, tambien planteada como f(x,y),
        valores iniciales: x0,y0, tama o de paso h.
        muestras es la cantidad de puntos a calcular. 
        '''
        tamano = muestras + 1
        tabla = np.zeros(shape=(tamano,2+2),dtype=float)
        tabla[0] = [x0,y0,0,0] # incluye el punto [x0,y0]
        
        xi = x0 # valores iniciales
        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
            
            tabla[i] = [xi,yi,K1,K2]
           
        if vertabla==True:
            np.set_printoptions(precision)
            print( 'EDO dy/dx con Runge-Kutta 2 Orden')
            print('i, [xi,     yi,     K1,    K2]')
            for i in range(0,tamano,1):
                print(i,tabla[i])
    
        return(tabla)
    
    # PROGRAMA PRUEBA -------------------
    
    # INGRESO
    # d1y = y' = f
    d1y = lambda x,y: y -x**2 + x + 1
    x0 = 0
    y0 = 1
    h  = 0.1
    muestras = 5
    
    # PROCEDIMIENTO
    tabla = rungekutta2(d1y,x0,y0,h,muestras,
                        vertabla=True)
    xi = tabla[:,0]
    yiRK2 = tabla[:,1]
    
    # SALIDA
    #print(' [xi, yi, K1, K2]')
    #print(tabla)
    
    # GRAFICA
    import matplotlib.pyplot as plt
    plt.plot(xi,yiRK2)
    plt.plot(xi[0],yiRK2[0],
             'o',color='r', label ='[x0,y0]')
    plt.plot(xi[1:],yiRK2[1:],
             'o',color='m',
             label ='[xi,yi] Runge-Kutta')
    plt.title('EDO dy/dx: Runge-Kutta 2do Orden')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid()
    plt.show()
    

    [ Runge Kutta  dy/dx ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]


    5. Cálculo de Error con la solución conocida

    La ecuación diferencial ordinaria del ejercicio tiene una solución conocida, lo que permite encontrar el error real en cada punto respecto a la aproximación estimada.

    y = e^x + x + x^2

    EDO RungeKutta 2Orden 01

    Note que el error crece al distanciarse del punto inicial.

    Error máximo estimado:  0.004357584597315167
    entre puntos: 
    [0.         0.00067092 0.00143026 
     0.0022892  0.00326028 0.00435758]
    >>>
    

    Para las siguientes instrucciones, comente la última línea #plt.show() antes de continuar con:

    # ERROR vs solución conocida -----------------
    y_sol = lambda x: ((np.e)**x) + x + x**2
    
    yi_psol  = y_sol(xi)
    errores  = yi_psol - yiRK2
    errormax = np.max(np.abs(errores))
    
    # SALIDA
    print('Error máximo estimado: ',errormax)
    print('entre puntos: ')
    print(errores)
    
    # GRAFICA [a,b+2*h]
    a = x0
    b = h*muestras+2*h
    muestreo = 10*muestras+2
    xis = np.linspace(a,b,muestreo)
    yis = y_sol(xis)
    
    plt.plot(xis,yis, label='y solución conocida',
             linestyle='dashed')
    plt.legend()
    plt.show()
    

    [ Runge Kutta  dy/dx ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]


    6. Ejercicio de Evaluación

    2Eva_IT2018_T1 EDO Paracaidista wingsuit

    Solución Propuesta: s2Eva_IT2018_T1 EDO Paracaidista wingsuit , Runge-Rutta para primera derivada.

  • 6.1 EDO con Taylor de 3 términos con Python

    [ EDO Taylor ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]
    ..


    1. Ecuaciones diferenciales ordinarias aproximadas con Taylor

    Referencia: Rodríguez 9.1.1 ejemplo p335. Chapra 25.1.3 p731

    En los métodos con Taylor para Ecuaciones Diferenciales Ordinarias (EDO) se aproxima el resultado a n términos de la serie, para lo cual se ajusta la expresión del problema a cada derivada correspondiente.

    La solución empieza usando la Serie de Taylor para tres términos ajustada a la variable del ejercicio:

    y_{i+1} = y_{i} + h y'_i + \frac{h^2}{2!} y''_i x_{i+1} = x_{i} + h E = \frac{h^3}{3!} y'''(z) = O(h^3)

    Edo Taylor 3 términos GIF animado
    A partir de la expresión de y'(x) y el punto inicial conocido en x[i],se busca obtener el próximo valor en x[i+1] al avanzar un tamaño de paso h. Se repite el proceso en el siguiente punto encontrado y se continua hasta alcanzar el intervalo objetivo.

    EDO Taylor 3 terminos

    En éstos métodos la solución siempre es una tabla de puntos xi,yi que se pueden usar para interpolar y obtener una función polinómica.

    [ EDO Taylor ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]

    ..


    2. Ejercicio

    Referencia: Rodríguez 9.1.1 ejemplo p335. Chapra 25.1.3 p731

    Se requiere encontrar puntos de la solución en la ecuación diferencial usando los tres primeros términos de la serie de Taylor con h=0.1 y punto inicial x0=0, y0=1

    \frac{dy}{dx}-y -x +x^2 -1 = 0

    que con nomenclatura simplificada:

    y'-y -x +x^2 -1 = 0

    [ EDO Taylor ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]
    ..


    3. Desarrollo Analítico

    Al despejar el valor de  y' de expresión del ejercicio,

    y' = y -x^2 +x +1

    se puede obtener y" al derivar una vez,

    y'' = y' -2x + 1

    para luego combinar las expresiones en

    y'' = (y -x^2 +x +1) -2x + 1

    simplificando:

    y'' = y -x^2 -x +2

    Ecuaciones que permiten estimar nuevos valores yi+1 para nuevos puntos  muestra distanciados en i*h desde el punto inicial siguiendo las siguientes expresiones de iteración:

    y'_i = y_i -x_i^2 + x_i +1 y''_i = y_i -x_i^2 - x_i +2 y_{i+1} = y_{i} + h y'_i + \frac{h^2}{2!} y''_i x_{i+1} = x_{i} + h

    Edo Taylor 3 términos GIF animado

    Se empieza evaluando el nuevo punto a una distancia x1= x0+h del punto de origen con lo que se obtiene y1 , repitiendo el proceso para el siguiente punto en forma sucesiva.

    itera = 0 , x0 = 0, y0 = 1

    y'_0 = 1 -0^2 +0 +1 = 2 y''_0 = 1 -0^2 -0 +2 = 3 y_1 = y_{0} + h y'_0 + \frac{h^2}{2!} y''_0 y_1 = 1 + 0.1 (2) + \frac{0.1^2}{2!} 3 = 1.215 x_1 = 0 + 0.1

    itera = 1 , x = 0.1, y = 1.215

    y'_1 = 1.215 - 0.1^2 + 0.1 +1 = 2.305 y''_1 = 1.215 - 0.1^2 - 0.1 +2 = 3.105 y_2 = 1.215 + 0.1 (2.305) + \frac{0.1^2}{2!} 3.105 = 1.461 x_2 = 0.1 + 0.1 = 0.2

    itera = 2 , x = 0.2, y = 1.461

    y'_2 = 1.461 - 0.2^2 + 0.2 +1 = 2.621 y''_2 = 1.461 - 0.2^2 - 0.2 +2 = 3.221 y_3 = 1.461 + 0.1 (2.621) + \frac{0.1^2}{2!} 3.221 = 1.7392 x_3 = 0.2 + 0.1 = 0.3

    completando los puntos con el algoritmo y realizando la gráfica se obtiene

     EDO con Taylor 3 términos
    [xi, yi, d1yi, d2yi]
    [[0.         1.         0.         0.        ]
     [0.1        1.215      2.         3.        ]
     [0.2        1.461025   2.305      3.105     ]
     [0.3        1.73923262 2.621025   3.221025  ]
     [0.4        2.05090205 2.94923262 3.34923262]
     [0.5        2.39744677 3.29090205 3.49090205]]
    >>>

    Observación, note que los resultados de las derivadas, se encuentran desplazados una fila para cada iteración. Asunto a ser considerado en la gráfica de las derivadas en caso de incluirlas.

    EDO_Taylor_3terminos01

    Nota: Compare luego los pasos del algoritmo con el método de Runge-Kutta de 2do orden.

    [ EDO Taylor ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]
    ..


    4. Algoritmo en Python

    Para simplificar los cálculos se crea una función edo_taylor3t() para encontrar  los valores para una cantidad de muestras distanciadas entre si h veces del punto inicial [x0,y0]

    # EDO. Método de Taylor con3 términos 
    # estima solucion para muestras separadas h en eje x
    # valores iniciales x0,y0
    import numpy as np
    
    def edo_taylor3t(d1y,d2y,x0,y0,h,muestras):
        ''' solucion a EDO usando tres términos de Taylor, x0,y0 son valores iniciales
            muestras es la cantidad de puntos a calcular con tamaño de paso h.
        '''
        tamano = muestras + 1
        tabla = np.zeros(shape=(tamano,4),dtype=float)
        # incluye el punto [x0,y0]
        tabla[0] = [x0,y0,0,0]
        x = x0
        y = y0
        for i in range(1,tamano,1):
            d1yi = d1y(x,y)
            d2yi = d2y(x,y)
            y = y + h*d1yi + ((h**2)/2)*d2yi
            x = x + h
            tabla[i] = [x,y,d1yi,d2yi]
        return(tabla)
    
    # PROGRAMA PRUEBA -----------------
    # Ref Rodriguez 9.1.1 p335 ejemplo.
    # prueba y'-y-x+(x**2)-1 =0, y(0)=1
    
    # INGRESO.
    # d1y = y', d2y = y''
    d1y = lambda x,y: y - x**2 + x + 1
    d2y = lambda x,y: y - x**2 - x + 2
    x0 = 0
    y0 = 1
    h = 0.1
    muestras = 5
    
    # PROCEDIMIENTO
    tabla = edo_taylor3t(d1y,d2y,x0,y0,h,muestras)
    xi = tabla[:,0]
    yi = tabla[:,1]
    
    # SALIDA
    print(' EDO con Taylor 3 términos')
    print('[xi, yi, d1yi, d2yi]')
    print(tabla)
    
    # Gráfica
    import matplotlib.pyplot as plt
    plt.plot(xi,yi)
    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.title('EDO: Solución con Taylor 3 términos')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid()
    plt.show() # plt.show() #comentar para la siguiente gráfica
    

    Tarea: Realizar el ejercicio con más puntos muestra, donde se visualice que el error aumenta al aumentar la distancia del punto inicial [x0,y0]

    [ EDO Taylor ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]


    5. Cálculo de Error con la solución conocida

    La ecuación diferencial ordinaria del ejercicio tiene una solución conocida, lo que permite encontrar el error real en cada punto respecto a la aproximación estimada.

    y = e^x + x + x^2

    Note que el error crece al distanciarse del punto inicial

    Para las siguientes instrucciones, comente la última línea #plt.show() antes de continuar con:

    # ERROR vs solución conocida
    y_sol = lambda x: ((np.e)**x) + x + x**2
    
    yi_psol = y_sol(xi)
    errores = yi_psol - yi
    errormax = np.max(np.abs(errores))
    
    # SALIDA
    print('Error máximo estimado: ',errormax)
    print('entre puntos: ')
    print(errores)
    
    # GRAFICA [a,b+2*h]
    a = x0
    b = h*muestras+2*h
    muestreo = 10*muestras+2
    xis = np.linspace(a,b,muestreo)
    yis = y_sol(xis)
    
    plt.plot(xis,yis,linestyle='dashed', label='y solución conocida')
    plt.legend()
    plt.show()
    

    Se puede observar los siguientes resultados:

    Error máximo estimado:  0.0012745047595
    entre puntos: 
    [ 0.  0.000170  0.000377  0.000626  0.000922  0.00127 ]
    

    [ EDO Taylor ] [ Ejercicio ] [ Analítico ] [ Algoritmo ]


    Differential equations, a tourist's guide | DE1. 3Blue1Brown. 31-mayo-2019
    Los Fundamentos de Ecuaciones Diferenciales que Nadie te Explica. 3Blue1Brown Español. 19-Junio-2024

     

  • Unidad 6 EDO Ecuaciones Diferenciales Ordinarias

    EDO con polinomio de Taylor de 3 términos

    EDO \frac{\delta y}{\delta x} con Runge-Kutta

    EDO  \frac{\delta^2 y}{\delta x^2} con Runge-Kutta

    Sistemas EDO (f y g) con Runge-Kutta

    Runge-Kutta 4to Orden

    Edo Presa Predador GIF animado

    \frac{dx}{dt} = ax - bxy

    \frac{dy}{dt} = -cy + dxy

    Edo Taylor 3 términos GIF animado

  • 5.8 Integral y Derivada de f(x), expresiones con Sympy

    [ Derivadas f(x) ] [ Derivadas Sin Evaluar ] [ Integral definido [a,b] ] [ Integral Indefinida ]


    1. Funciones de prueba

    Para los ejemplos se usan f(x) de variable independiente 'x', y constantes 'a' y 'b'

    f(x) = a \cos(x)

    f(x) =a e^{-3x}

    [ Derivadas f(x) ] [ Derivadas Sin Evaluar ] [ Integral definido [a,b] ] [ Integral Indefinida ]
    ..


    2. Derivadas de f(x) con Sympy

    Las expresiones de la derivada se obtienen con la expresión fx.diff(x,k), indicando la k-ésima  derivada de la expresión.

    f(x): a*exp(-3*x)
    f(x) con sym.pprint:
       -3⋅x
    a⋅ℯ    
    
     df/dx: -3*a*exp(-3*x)
    df/dx con sym.pprint:
          -3⋅x
    -3⋅a⋅ℯ    
    
     d2f/dx2: 9*a*exp(-3*x)
    d2f/dx2 con sym.pprint:
         -3⋅x
    9⋅a⋅ℯ    
    

    Instrucciones en Python

    # derivadas de f(x) expresiones Sympy
    import sympy as sym
    # INGRESO
    a = sym.Symbol('a') # constantes sin valor
    b = sym.Symbol('b')
    x = sym.Symbol('x',real=True) # variable independente
    
    #fx = a*sym.cos(x)
    fx = a*sym.exp(-3*x)
    
    #PROCEDIMIENTO
    dfx = fx.diff(x,1)
    d2fx = fx.diff(x,2)
    
    # SALIDA
    print('f(x):',fx)
    print('f(x) con sym.pprint:')
    sym.pprint(fx)
    
    print('\n df/dx:',dfx)
    print('df/dx con sym.pprint:')
    sym.pprint(dfx)
    
    print('\n d2f/dx2:',d2fx)
    print('d2f/dx2 con sym.pprint:')
    sym.pprint(d2fx)
    

    Referencia: https://docs.sympy.org/latest/tutorials/intro-tutorial/calculus.html#derivatives

    Ejemplos:

    Polinomio de Taylor – Ejemplos con Sympy-Python

    Sistemas LTI CT – Respuesta a entrada cero con Sympy-Python

    [ Derivadas f(x) ] [ Derivadas Sin Evaluar ] [ Integral definido [a,b] ] [ Integral Indefinida ]
    ..


    2. Derivadas sin evaluar df(x)/dx con Sympy

    Cuando se requiere expresar tan solo la operación de derivadas, que será luego usada o reemplazada con otra expresión, se usa la derivada sin evaluar. Ejemplo:

    y = \frac{d}{dx}f(x)

    Para más adelante definir f(x).

    En Sympy, la expresión de y se realiza indicando que f será una variable

    x = sym.Symbol('x', real=True)
    f = sym.Symbol('f', real=True)
    y = sym.diff(f,x, evaluate=False) # derivada sin evaluar
    g = sym.cos(x) + x**2
    yg = y.subs(f,g).doit() # sustituye f con g y evalua .doit()
    
    >>> y
    Derivative(f, x)
    >>> g
    x**2 + cos(x)
    >>> yg
    2*x - sin(x)

    Ejemplos:

    EDP Parabólica – analítico con Sympy-Python

    EDP Elípticas – analítico con Sympy-Python

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

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

    [ Derivadas f(x) ] [ Derivadas Sin Evaluar ] [ Integral definido [a,b] ] [ Integral Indefinida ]
    ..


    3. Integrales definida de f(x) con Sympy

    Sympy incorpora la operación del integral en sus expresiones, que pueden ser integrales definidas en un intervalo o expresiones sin evaluar.

    >>> import sympy as sym
    >>> t = sym.Symbol('t',real=True)
    >>> fx = 10*sym.exp(-3*t)
    >>> fx
    10*exp(-3*t)
    >>> y = sym.integrate(fx,(t,0,10))
    >>> y
    10/3 - 10*exp(-30)/3
    >>> y = sym.integrate(fx,(t,0,sym.oo))
    >>> y
    10/3
    

    [ Derivadas f(x) ] [ Derivadas Sin Evaluar ] [ Integral definido [a,b] ] [ Integral Indefinida ]
    ..


    4. Integrales Indefinida de f(x) con Sympy

    La operación se puede realizar con sym.integrate(fx,x), la expresión obtenida no añade la constante.

    # integral f(x) eindefinido xpresiones Sympy
    import sympy as sym
    # INGRESO
    a = sym.Symbol('a') # constantes sin valor
    b = sym.Symbol('b')
    c = sym.Symbol('c')
    x = sym.Symbol('x',real=True) # variable independente
    
    #fx = a*sym.cos(x)
    fx = a*sym.exp(-3*x)
    
    #PROCEDIMIENTO
    y = sym.integrate(fx,x) + c
    
    # SALIDA
    print('f(x):',fx)
    print('f(x) con sym.pprint:')
    sym.pprint(fx)
    
    print('\n y:',y)
    print('y con sym.pprint:')
    sym.pprint(y)
    

    con el siguiente resultado:

    f(x): a*exp(-3*x)
    f(x) con sym.pprint:
       -3⋅x
    a⋅ℯ    
    
     y: -a*exp(-3*x)/3 + c
    y con sym.pprint:
         -3⋅x    
      a⋅ℯ        
    - ─────── + c
         3       
    
    

    Referencia: https://docs.sympy.org/latest/modules/integrals/integrals.html


    [ Derivadas f(x) ] [ Derivadas Sin Evaluar ] [ Integral definido [a,b] ] [ Integral Indefinida ]

  • 5.7.2 Diferenciación numérica - Tablas con diferencias divididas

    Diferencias Divididas [ hacia adelante ] [ centradas ] [hacia atrás] ..


    Referencia: Chapra Fig.23.1 p669, Burden 4.1 p167, Rodríguez 8.2,3,4,6 p324

    Diferencias divididas hacia adelante

    Primera derivada

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

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

    Segunda derivada

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

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

    + O(h^2)

    Tercera derivada

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

    + O(h)

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

    + O(h^2)

    Cuarta derivada

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

    + O(h)

    Diferencias Divididas [ hacia adelante ] [ centradas ] [hacia atrás]

    ..


    Diferencias divididas centradas

    Primera derivada

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

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

    + O(h^4)

    Segunda derivada

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

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

    + O(h^4)

    Tercera derivada

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

    + O(h^2)

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

    + O(h^4)

    Diferencias Divididas [ hacia adelante ] [ centradas ] [hacia atrás]

    ..


    Diferencias divididas hacia atrás

    Primera derivada

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

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

    + O(h^2)

    Segunda derivada

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

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

    + O(h^2)

    Tercera derivada

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

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

    + O(h^2)

    Diferencias Divididas [ hacia adelante ] [ centradas ] [hacia atrás]

  • 5.7.1 Diferenciación numérica - Error con df/dx en intervalo

    [ compara ] [ resultados ] [ algoritmo ]
    ..


    1. Compara derivadas numéricas con analíticas

    Para observar el efecto de disminuir h al aumentar los tramos, se realiza la gráfica de la derivada df/dx analítica versus las derivadas numéricas hacia atrás, hacia centrada y hacia adelante.

    Diferenciacion numérica en un intervalo compara con df/dxSe observa en la animación la reducción del error en cada diferencia dividida.

    [ compara ] [ resultados ] [ algoritmo ]
    ..


    2. Resultados del algoritmo

       tramos: 4 	, h: 0.5
    |errado_atras|:    0.3981193548993356
    |errado_centro|:   0.04939087954655119
    |errado_adelante|: 0.41231110309099034
    |errado_max|:      0.41231110309099034
    [  dfx,        df1_atras, df1_centro, df1_adelante]
    [[ 0.9610378          nan         nan  0.76041177]
     [ 0.49386065  0.76041177  0.44446977  0.12852777]
     [-0.26703531  0.12852777 -0.27540932 -0.67934641]
     [-1.07746577 -0.67934641 -1.04151373 -1.40368104]
     [-1.67397947 -1.40368104         nan         nan]]
       tramos: 8 	, h: 0.25
    |errado_atras|:    0.20757887012431775
    |errado_centro|:   0.016528173718511008
    |errado_adelante|: 0.20828851979214785
    |errado_max|:      0.20828851979214785
       tramos: 32 	, h: 0.0625
    |errado_atras|:    0.05218398011852454
    |errado_centro|:   0.0011877802167017393
    |errado_adelante|: 0.052183627077393824
    |errado_max|:      0.05218398011852454
       tramos: 64 	, h: 0.03125
    |errado_atras|:    0.026094601614190305
    |errado_centro|:   0.000302562296112141
    |errado_adelante|: 0.026094780174240162
    |errado_max|:      094780174240162

    [ compara ] [ resultados ] [ algoritmo ]
    ..


    3. Algoritmo con Python

    Las instrucciones en Python usadas para la gráfica son:

    # Diferenciacion Numerica - 1ra Derivada
    # Compara resultados en un intervalo
    import numpy as np
    
    # INGRESO
    fx = lambda x: np.sqrt(x)*np.sin(x)
    dfx = lambda x: np.sin(x)/(2*np.sqrt(x))+ np.sqrt(x)*np.cos(x)
    a = 1  # intervalo de integracion
    b = 3
    tramos = 64 # >=2, al menos 2 tramos
    
    # PROCEDIMIENTO
    muestras = tramos + 1
    h = (b-a)/tramos
    # puntos de muestras
    xi = np.linspace(a,b,muestras)
    fi = fx(xi)
    
    # tabla para comparar derivada y diferencias divididas
    tabla = np.zeros(shape=(muestras,4),dtype=float)
    for i in range(0,muestras,1): # muestras en intervalo
        df1_atras = np.nan ; df1_centro = np.nan; df1_adelante = np.nan
        
        dfxi = dfx(xi[i]) # derivada analitica, como referencia
        if i>0 and i<muestras: # hacia Atras, diferencias divididas
            df1_atras = (fi[i]-fi[i-1])/h
        if i>0 and i<(muestras-1): # Centro, diferencias divididas
            df1_centro = (fi[i+1]-fi[i-1])/(2*h)
        if i>=0 and i<(muestras -1): # hacia Adelante, diferencias divididas
            df1_adelante = (fi[i+1]-fi[i])/h
        tabla[i]=[dfxi,df1_atras,df1_centro,df1_adelante]
    
    # errado desde dfxi
    errado_atras = np.max(np.abs(tabla[1:,0]-tabla[1:,1]))
    errado_centro = np.max(np.abs(tabla[1:muestras-1,0]-tabla[1:muestras-1,2]))
    errado_adelante = np.max(np.abs(tabla[:muestras-1,0]-tabla[:muestras-1,3]))
    errado_max = np.max([errado_atras,errado_centro,errado_adelante])
    
    # SALIDA
    print('   tramos:', tramos,'\t, h:',h,)
    print('|errado_atras|:   ',errado_atras)
    print('|errado_centro|:  ',errado_centro)
    print('|errado_adelante|:',errado_adelante)
    print('|errado_max|:     ',errado_max)
    print('[  dfx,        df1_atras, df1_centro, df1_adelante]')
    print(tabla)
    
    # GRAFICA
    import matplotlib.pyplot as plt
    
    # fx suave aumentando muestras
    muestrasfxSuave = tramos*10 + 1
    xk = np.linspace(a,b,muestrasfxSuave)
    dfk = dfx(xk)
    
    # Graficar f(x), puntos
    plt.plot(xk,dfk, label ='df(x)',linestyle='dotted')
    if tramos<64:
        plt.plot(xi,tabla[:,0], 'o') # muestras
    
    plt.plot(xi,tabla[:,1],label='df1_atras')
    plt.plot(xi,tabla[:,2],label='df1_centrada')
    plt.plot(xi,tabla[:,3],label='df1_adelante')
    
    plt.xlabel('xi')
    plt.ylabel('df(xi)')
    txt = 'Diferenciaci n Num rica'
    txt = txt + ', tramos:'+str(tramos)
    txt = txt + ', h:'+str(h)
    txt = txt + ', |errado_max|'+str(round(errado_max,4))
    plt.title(txt)
    plt.legend()
    plt.tight_layout()
    
    plt.show()
    

    [ compara ] [ resultados ] [ algoritmo ]