コード例 #1
0
#Diagrama de flujo
T = np.linspace(-1, 1, 25)
Y = np.linspace(-1, 3, 25)

F = np.array([[f(t, y) for t in T] for y in Y])
F = np.arctan(F)
U = np.cos(F)
V = np.sin(F)

plt.quiver(T, Y, U, V)
plt.show()

# Ahora apliquemos el metodo de Euler implicito con paso $h=0.5$ a nuestra función
I = (0, 20)
y0 = 0.5
T, W = odesolver.solve(f, y0, I, 40, method="Implicit Euler")
print('y(20) con EI, 40 pasos: ' + str(W[0, 40]))

#EE con 40,80,100 y 120 pasos
T2, W2 = odesolver.solve(f, y0, I, 120, method="Explicit euler")
T3, W3 = odesolver.solve(f, y0, I, 100, method="Explicit Euler")
T4, W4 = odesolver.solve(f, y0, I, 80, method="Explicit Euler")
T5, W5 = odesolver.solve(f, y0, I, 40, method="Explicit Euler")

print('y(20) con EE, 40 pasos: ' + str(W5[0, 40]))
print('y(20) con EE, 80 pasos: ' + str(W4[0, 80]))
print('y(20) con EE, 100 pasos: ' + str(W3[0, 100]))
print('y(20) con EE, 120 pasos: ' + str(W2[0, 120]))

#RK2/3 con tol 0.1 y 0.01
T6, W6 = odesolver.solve(f, y0, I, method="RK23", tol=0.1, initialStep=0.5)
コード例 #2
0
ファイル: ejercicio3.py プロジェクト: ekiMGlz/ODEMethods
# Tomemos el siguiente PVI:
# y_1' = - y_1 + y_2
# y_2' =- y_1 - y_2
# con
# y_1(0)=0
# y_2(0)=1, en [0,1]
# Este tiene solucion exacta:
# y_1(t) = e^{-t}\sin(t)
# y_2(t) = e^{-t}\cos(t)
f = lambda t, y: np.array([-y[0] + y[1], -y[0] - y[1]])
soln = lambda t: np.array([np.exp(-T) * np.sin(T), np.exp(-T) * np.cos(T)])
y0 = np.array([0, 1])

#Ahora calculemos con punto medio implicito y paso h=1/10
T, W = odesolver.solve(f, y0, (0, 1), 10, method='Implicit Midpoint')
globalError1 = linear.norm(W[:, 10] - soln(T)[:, 10])
dif = abs(W[:, 10] - soln(T)[:, 10])  #error global por entrada en t=1
print('Punto Medio Implicito h=1/10')
print('Approximaciones: ' + str(W[:, 10]))
print('Diferencias Absolutas: ' + str(dif))
print('Error Global: ' + str(globalError1))

#Ahora con h = 1/100
T, W = odesolver.solve(f, y0, (0, 1), 100, method='Implicit Midpoint')
globalError2 = linear.norm(W[:, 100] - soln(1)[:, 100])
dif = abs(W[:, 100] - soln(T)[:, 100])  #error global por entrada en t=1
print('Punto Medio Implicito h=1/100')
print('Approximaciones: ' + str(W[:, 10]))
print('Diferencias Absolutas: ' + str(dif))
print('Error Global: ' + str(globalError2))
コード例 #3
0
ファイル: ejercicio2.py プロジェクト: ekiMGlz/ODEMethods
import matplotlib.pyplot as plt
from math import *
from IPython.display import Latex
import odesolver


# # Ejercicio 2

#Tomando el PVI del ejercicio 1
f = lambda t, y : y+2*np.exp(-t)
exact = lambda t, t0, y0 : np.exp(t)*(y0*np.exp(-t0)+np.exp(-2*t0)-np.exp(-2*t))
I = (0, 1)
y0 = 1
y1 = exact(1,0,1)

#Resolvemos con trapecio explicito y pasos h=1/10
T, W = odesolver.solve(f,y0,I,10,method="Explicit Trapezoid")
globalError = abs(W[0,10]-y1)
print("Error Trapecio Explicito h = 1/10: "+str(globalError))


#Veamos lo que sucede cuando usamos el paso h/2=0.05
T, W = odesolver.solve(f,y0,I,20,method="Explicit Trapezoid")
globalError = abs(W[0,20]-y1)
print("Error Trapecio Explicito h = 1/20: "+str(globalError))


#Ahora calcuemos el error global en t=1 usando el método Runge-Kutta 4 usando h1: 
T, W = odesolver.solve(f,y0,I,10,method="RK4")
globalError = abs(W[0,10]-y1)
print("Error RK4 h = 1/10: "+str(globalError))
コード例 #4
0
ファイル: ejercicio6.py プロジェクト: ekiMGlz/ODEMethods
print('exact(1) == 1-pi/20: ' + str(exact(1) == 1 - pi / 20))

print(
    '\n\nPara aplicar Shooting Method, tomamos una aproximación inicial de y_2 = 0'
)

print('y_1(t) = 1')
print('y_2(t) = 0')

print(
    "\ny utilizaremos el método de Runge Kutta 4 con 1000 pasos para aproximar la función en y_1(1)"
)

y0 = [1, 0]

_, W = odesolver.solve(f, y0, (0, 1), 1000, method='rk4')

# In[7]:

ans = W[0][-1]
print('W(1) = ' + str(ans))

print('\nVeamos que tan acertada fue nuestra elección')

print('abs(W(1) - (1 - pi/20)) = ' + str(abs(ans - (1 - pi / 20))))

print(
    '\nParece ser que nuestra aproximación inicial sobreestimó la solución. Usaremos el método de Newton para seguir generando aproximaciones.'
)

print(
コード例 #5
0
# Ejercicio 1

#Definimos nuestra funcion f, el lado derecho del PVI y la solucion exacta
f = lambda t, y: y + 2 * np.exp(-t)
exact = lambda t, t0, y0: np.exp(t) * (y0 * np.exp(-t0) + np.exp(-2 * t0) - np.
                                       exp(-2 * t))

#Guardamos y0 asi como los extremos de nuestro intervalo I
I = (0, 1)
y0 = 1

#Calculamos el valor exacto al tiempo 1
y1 = exact(1, 0, 1)

#Hacemos Euler Explicito con 10 pasos
T, W = odesolver.solve(f, y0, I, 10, method="Explicit Euler")

#Calculamos errores globales y locales e imprimimos resultados
globalError = abs(W[0, 10] - y1)
localErrors = [
    abs(W[0, i + 1] - exact(T[i + 1], T[i], W[0, i])) for i in range(10)
]
maxLocalError = max(localErrors)

print("Aproximaciones: ")
print(W[0])
print("Error Global: " + str(globalError))
print("Maximo Error Local: " + str(maxLocalError))

#Grafica de la solucion
plt.plot(T, exact(T, 0, 1))
コード例 #6
0
ファイル: ejercicio5.py プロジェクト: ekiMGlz/ODEMethods
# Consideremos el PVI (\ref{eq:1}), cuya solucion (\ref{eq:2}) ha sido justificada previamente. Utilizemos los métodos:
# \begin{itemize}
#     \item Euler Explícito
#     \item Trapecio Explícito
#     \item Punto Medio Explícito 
#     \item RK4 
# \end{itemize}
# Con pasos $h\in\{1/50,1/100,1/200\}$ para calcular y comparar el error global en t=1
EG=[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
f = lambda t, y : y+2*np.exp(-t)
exact = lambda t, t0, y0 : np.exp(t)*(y0*np.exp(-t0)+np.exp(-2*t0)-np.exp(-2*t))
I = (0, 1)
y0 = 1
y1 = exact(1,0,1)
TEE, WEE = odesolver.solve(f,y0,I,50,method="Explicit Euler")
EG[0][0] = abs(WEE[0,50]-y1)
TEE1, WEE1 = odesolver.solve(f,y0,I,100,method="Explicit Euler")
EG[0][1] = abs(WEE1[0,100]-y1)
TEE2, WEE2 = odesolver.solve(f,y0,I,200,method="Explicit Euler")
EG[0][2] = abs(WEE2[0,200]-y1)

TTE, WTE = odesolver.solve(f,y0,I,50,method="Explicit Trapezoid")
EG[1][0]= abs(WTE[0,50]-y1)
TTE1, WTE1 = odesolver.solve(f,y0,I,100,method="Explicit Trapezoid")
EG[1][1] = abs(WTE1[0,100]-y1)
TTE2, WTE2 = odesolver.solve(f,y0,I,200,method="Explicit Trapezoid")
EG[1][2] = abs(WTE2[0,200]-y1)

TPE, WPE = odesolver.solve(f,y0,I,50,method="Explicit Midpoint")
EG[2][0]= abs(WPE[0,50]-y1)