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.
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
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.
defrungekutta4(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 inrange(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.
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.
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:
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 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?
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
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:
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
defrungekutta2(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 inrange(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 inrange(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)# GRAFICAimport 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()
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.
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)
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.
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.
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
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:
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.
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.
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,y0import numpy as np
defedo_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 inrange(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]
# SALIDAprint(' EDO con Taylor 3 términos')
print('[xi, yi, d1yi, d2yi]')
print(tabla)
# Gráficaimport 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]
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))
# SALIDAprint('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()
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
Por eso estás aprendiendo ecuaciones diferenciales. Zach Star. 9-junio-2020.
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)
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
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 Sympyimport 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
# SALIDAprint('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
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.
Se observa en la animación la reducción del error en cada diferencia dividida.