1 /* vim: set et ts=4 sw=4 fdm=indent fdl=1 fdn=1 fo+=t:
3 * Taller de Programación (75.42).
6 * Graficador de la solución de una ecuación diferencial por el método
7 * de Euler (explícito).
9 * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
10 * Puede copiar, modificar y distribuir este programa bajo los términos de
11 * la licencia GPL (http://www.gnu.org/).
13 * Creado: dom ago 24 03:12:43 ART 2003
18 /** \mainpage Taller de Programación I (75.42)
20 \section objetivo Objetivo.
21 Desarrollar un \ref main "programa" que resuelva, utilizando un
22 \ref metodo "método iterativo", una \ref funcion "función diferencial"
23 en un intervalo de tiempo dado.
24 \note Utilizar sólo funciones ANSI C.
26 \section desarrollo Desarrollo.
27 \subsection parte1 Parte 1.
28 Dada una \ref funcion "función diferencial" \f$df_{(t)}\f$,
29 desarrolle un \ref main "programa" que calcule la integral de la
30 misma utilizando el método iterativo (\ref metodo "Euler explícito"),
31 tal como se explica a continuación. Almacene estos resultados en un
32 \ref Resultados "vector".
34 \subsubsection funcion Función diferencial.
36 df_{(t)} = \frac{500 - f_{(t)}}{30}
39 \subsubsection variables Variables.
40 - \f$t_i\f$: \ref T0 "Tiempo inicial de la iteración" = 0.
42 Solicitar al usuario el ingreso de las restantes variables por
44 - \f$f_{(t)}\f$: Estado inicial del sistema.
45 - \f$t_f\f$: Tiempo final de la iteración (segundos).
46 - \f$step\f$: Paso (en segundos).
48 \subsubsection metodo Método de iteración (Euler explícito).
50 f_{(t + step)} = f_{(t)} + df_{(t)} \cdot step
53 \subsection parte2 Parte 2.
54 Grafique los primeros 70 pasos (si los hay) de la
55 \ref funcion "función" en formato texto, entre los valores máximos y
56 mínimos que tome en este intervalo, utilizando 20 líneas horizontales.
71 \section resolucion Resolución.
72 El \ref main "programa principal" se divide en 3 tareas principales,
73 cada una realizada por una función particular.
75 \subsection obtencion Obtención y validación de parámetros del usuario.
76 Antes de comenzar a hacer cálculos es necesario obtener los valores de
77 las \ref variables "variables" de la entrada del usuario (en este caso
78 a través de parámetros de línea de comandos). Esta tarea es realizada
79 por la función cargar_datos().
81 \subsection integracion Integración de la ecuación diferencial.
82 Reemplazando la \ref funcion "ecuación diferencial" \f$ df_{(t)} \f$
83 en la solución por el \ref metodo "método de Euler", obtenemos
86 f_{(t + step)} = f_{(t)} + \frac{500 - f_{(t)}}{30} \cdot step
88 Resultando, en realidad, una función númerica de dos variables
89 (\f$ step \f$ y \f$ f_t \f$):
91 f_{t + step} = f_{(step, f_t)} = f_t + \frac{500 - f_t}{30} \cdot step
93 Este paso es realizado por el macro FUNCION() para que sea más
96 Todo lo que resta es iterar, paso a paso, calculando los valores de la
97 función y almacenándolos en el \ref Resultados "vector de resultados",
98 tarea realizada por la función calcular().
100 \subsection impresion Impresión del gráfico por pantalla.
101 Finalmente todo lo que queda es graficar por pantalla el resultado de la
102 función. Para esto se va imprimiendo línea por línea, chequeando qué
103 punto de la función cae en cada rango de valores representados por una
104 línea. Esta tarea es realizada por la función resultados_graficar().
106 \section conclusiones Conclusiones.
107 Realmente no se me presentaron muchos problemas para resolver el TP. El
108 único problema que tuve fue realizando el \ref impresion "gráfico", en
109 ciertas circunstancias (por problemas de redondeo) el valor máximo de la
110 función no era graficado. Esto se solucionó incluyendo una línea más al
111 gráico, con el rango que va desde el máximo de la función (en realidad desde
112 el mínimo más 20 pasos verticales) hasta el máximo más un paso vertical.
113 Es por esto que en realidad se grafican 21 pasos. Podría haber graficado 20
114 pasos pero el código quedaría menos claro (o tendría que poner la constante
115 \ref ALTO en 19 en vez de 20).
117 Otro detalle que cabe ser mencionado es que para valores altos del
118 \ref variables "step" (mayores a 30), la solución se vuelve inestable.