1 /* vim: set et ts=4 sw=4 fdm=indent tw=80 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)
21 También puede ver <a href="../latex/refman.pdf">este documento en formato
26 También puede ver este documento en formato HTML en html/index.html.
29 \section objetivo Objetivo.
30 Desarrollar un \ref main "programa" que resuelva, utilizando un
31 \ref metodo "método iterativo", una \ref funcion "función diferencial"
32 en un intervalo de tiempo dado.
33 \note Utilizar sólo funciones ANSI C.
35 \section desarrollo Desarrollo.
36 \subsection parte1 Parte 1.
37 Dada una \ref funcion "función diferencial" \f$df_{(t)}\f$,
38 desarrolle un \ref main "programa" que calcule la integral de la
39 misma utilizando el método iterativo (\ref metodo "Euler explícito"),
40 tal como se explica a continuación. Almacene estos resultados en un
41 \ref Resultados "vector".
43 \subsubsection funcion Función diferencial.
45 df_{(t)} = \frac{500 - f_{(t)}}{30}
48 \subsubsection variables Variables.
49 - \f$t_i\f$: Tiempo inicial de la iteración = 0.
51 Solicitar al usuario el ingreso de las restantes variables por
53 - \f$f_{(t)}\f$: Estado inicial del sistema.
54 - \f$t_f\f$: Tiempo final de la iteración (segundos).
55 - \f$step\f$: Paso (en segundos).
57 \subsubsection metodo Método de iteración (Euler explícito).
59 f_{(t + step)} = f_{(t)} + df_{(t)} \cdot step
62 \subsection parte2 Parte 2.
63 Grafique los primeros 70 pasos (si los hay) de la
64 \ref funcion "función" en formato texto, entre los valores máximos y
65 mínimos que tome en este intervalo, utilizando 20 líneas horizontales.
80 \section resolucion Resolución.
81 El \ref main "programa principal" se divide en 3 tareas principales,
82 cada una realizada por una función particular.
84 \subsection obtencion Obtención y validación de parámetros del usuario.
85 Antes de comenzar a hacer cálculos es necesario obtener los valores de
86 las \ref variables "variables" de la entrada del usuario (en este caso
87 a través de parámetros de línea de comandos). Esta tarea es realizada
88 por la función cargar_datos(). En el archivo carga.c y carga.h puede
89 encontrarse esta función y otras funciones relacionadas a esta tarea.
91 \subsection integracion Integración de la ecuación diferencial.
92 Reemplazando la \ref funcion "ecuación diferencial" \f$ df_{(t)} \f$
93 en la solución por el \ref metodo "método de Euler", obtenemos
96 f_{(t + step)} = f_{(t)} + \frac{500 - f_{(t)}}{30} \cdot step
98 Resultando, en realidad, una función númerica de dos variables
99 (\f$ step \f$ y \f$ f_t \f$):
101 f_{t + step} = f_{(step, f_t)} = f_t + \frac{500 - f_t}{30} \cdot step
103 Este paso es realizado por el macro FUNCION() para que sea más
106 Todo lo que resta es iterar, paso a paso, calculando los valores de la
107 función y almacenándolos en el \ref Resultados "vector de resultados",
108 tarea realizada por la función resultados_calcular(). En el archivo
109 calculo.c y calculo.h puede encontrarse esta función y otras funciones
110 relacionadas a esta tarea.
112 \subsection impresion Impresión del gráfico por pantalla.
113 Finalmente todo lo que queda es graficar por pantalla el resultado de la
114 función. Para esto se va imprimiendo línea por línea, chequeando qué
115 punto de la función cae en cada rango de valores representados por una
116 línea. Esta tarea es realizada por la función resultados_graficar().
117 En el archivo grafico.c y grafico.h puede encontrarse esta función y
118 otras funciones relacionadas a esta tarea.
120 \subsection plataforma Plataforma y compilador.
121 Este trabajo práctico fue realizado y probado bajo la plataforma Debian
122 GNU/Linux sid. El compilador utilizado fue GNU GCC versión 3.3.1.
124 De todas formas, al estar programado sólo utilizando funciones ANSI C,
125 debería poder compilarse bajo cualquier plataforma y compilador que
126 soporte este estándar.
128 \section conclusiones Conclusiones.
129 Realmente no se me presentaron muchos problemas para resolver el TP. El
130 único problema que tuve fue realizando el \ref impresion "gráfico", en
131 ciertas circunstancias (por problemas de redondeo) el valor máximo de la
132 función no era graficado. Esto se solucionó incluyendo una línea más al
133 gráfico, con el rango que va desde el máximo de la función (en realidad
134 desde el mínimo más 20 pasos verticales) hasta el máximo más un paso
135 vertical. Es por esto que en realidad se grafican 21 pasos. Podría haber
136 graficado 20 pasos pero el código quedaría menos claro (o tendría que
137 poner la constante \ref ALTO en 19 en vez de 20).
139 El programa también fue pensado para aceptar como parámetros el caracter
140 utilizado para dibujar un \ref DEFAULT_PUNTO "punto" de la función y un
141 espacio en \ref DEFAULT_BLANCO "blanco", así como el
142 \ref DEFAULT_T0 "tiempo inicial". Por problemas de tiempo, no pude
143 terminar de implementar estas características extra.
145 Otro detalle que cabe ser mencionado es que para valores altos del
146 \ref variables "step" (mayores a 30), la solución se vuelve inestable.