Ahora nos ensuciaremos las manos y escribiremos un solucionador de EDOs.
Haremos Euler hacia adelante y Euler hacia atrás.
Eular hacia adelante también se conoce como Euler explicito
porque es un solucionador explicito.
Despues usaremos el soluciondaor de Euler explicito para generar trayectorias
del oscilador armónico pára distintos conjuntos de parámetros.
Aquí está mi implementación de Euler hacia adelante en MATLAB.
Pide una condición inicial x0, un tamaño de paso h,
un tiempo final finalTime y un parámetro showPlot,
que necesito más tarde como bandera para saber si graficar las trayectorias.
Puedes simplemente ignorar este si lo requieres.
El primer paso es hacer xcurr, una varia- ble de ayuda igual a la condición inicial.
y hacer que x0 sea el primer elemento de la trayectoria.
Note que como MATLAB empieza la indexación desde uno
x0 será el primer elemento de la trayectoria, es decir, será la trayectoria
uno.
x1, será la trayectoria dos, este trslado de uno en la indexación
puede ser un poco confuso.
Después tenemos esté ciclo. Todo lo que hace es tomar
xcurr, que es una variable de ayuda que usamos arriba
empieza desde esa posición y da un paso en la dirección de la ecuación
diferencial.
Así que el siguiente elmento de la trayectoria es simplemente
la posición actual más un pequeño paso en la dirección de la EDO.
Después actualizamos la posición actual (xcurr) y repetimos las veces necesarias
para llegar al tiempo final.
Después podríamos o no graficar la trayectoria dependiendo del
parámetro showPlot.
El oscilador armónico simple viene descrito por estas dos ecuaciones,
y tenemos 3 parámetros k, b y beta.
Después calculamos x prima (xPrime) basándonos en estas dos ecuaciones
evaluada en xCurrent y regresamos xPrime.
Siempre es buena idea, cuando escribes software revisar en papel el programa.
Eso significa hacer la primera iteración a mano y corroborar que el software
arroja lo mismo.
Usamos Euler hacia adelante para resolver el oscilador armónico simple
para un paso usando un tamaño de paso 0.1 empezando en [-1, -2]
y si hacemos eso vemos que obtenemos [-1.2, -1.6].
Que es precisamente lo que obtuvimos a mano.
Así que yo diría que nuestro software funciona bien.
El primer problema es generar una trayectoria por 0.5 segundos
con k = 2, m = 0.6, g = 0 y beta = 0 desde la condición inicial [-1, -2],
y ver que obtenemos.
Así que empezando en [-1,-2], usando un paso de tiempo 0.1 y yendo al tiempo
0.5, sin graficar la trayectoria, obtene- mos que el último punto de la trayectoria
que es la trayectoria en el tiempo 0.5 con este solucionador es [-1.528, 0.6246]
Esa es la respuesta a la pregunta 1 a) .
Para la pregunta 1b) queremos dejar todos los parámetros igual y usar
la misma condición inicial. Queremos generar una trayectoria de 200 puntos
en lugar de una de 5 puntos. Voy a generar esta trayectoria usando
un paso de tiempo de 0.1 y también con uno de 0.11.
Si hacemos esto obtenemos el siguiente gráfico.
En este gráfico la curva azul es generada con un paso de 0.1 y la
roja es generada con un paso de 0.11.
Como se puede ver y como esperábamos de la lectura la roja traza la espiral
hacia afuera más rápido. Es decir, si das un paso de tiempo más grande
llegarás más lejos en la trayectoria, en este caso irás mas lejos en la espiral.
Mira la lectura para una muy buena visualización de esto.
Del gráfico podemos ver que al usar 𐤃t = 0.11 la espiral es mas rápida.
La pregunta 2 indica implementar Euler hafcia atrás, este también se llama
Euler implícito porque es un solucionador implícito.
Mi implementación es una implementación en MATLAB, que toma exactamente
las mismas entradas que Euler hacia adelante: una condición inicial
un tamaño de tiempo, un tiempo final y este parámetro para graficar.
Mi código para el Euler hacia atrás es idéntico al de Euler hacia adelante
excepto por este paso clave. Recuerda en un solucionador implícito aproximas
el siguiente paso, y usas eso como tu actual