Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
Las ecuaciones diferenciales aparecen naturalmente al modelar situaciones físicas en las ciencias naturales, ingeniería, y otras disciplinas, donde hay envueltas razones de cambio de una ó varias funciones desconocidas con respecto a una ó varias variables independientes. Estos modelos varían entre los más sencillos que envuelven una sola ecuación diferencial para una función desconocida, hasta otros más complejos que envuelven sistemas de ecuaciones diferenciales acopladas para varias funciones desconocidas. Por ejemplo, la ley de enfriamiento de Newton y las leyes mecánicas que rigen el movimiento de los cuerpos, al ponerse en terminos matemáticos dan lugar a ecuaciones diferenciales. Usualmente estas ecuaciones estan acompañadas de una condición adicional que especifica el estado del sistema en un tiempo o posición inicial. Esto se conoce como la condición inicial y junto con la ecuación diferencial forman lo que se conoce como el problema de valor inicial. Por lo general, la solucón exacta de un problema de valor inicial es imposible ó dificil de obtener en forma analítica. Por tal razón los métodos numéricos se utilizan para aproximar dichas soluciones. Comenzaremos discutiendo los métodos para ecuaciones escalares y luego generalizamos los mismos a sistemas de ecuaciones.
Primeramente consideraremos la ecuación diferencial de primer orden y su condición inicial :
y la formula de Euler (Método de Euler) :
Usando el Método de Euler vamos a resolver la siguiente ecuación diferencial :
para comparar la solucion exacta es :
La implementación en VisualC++ del Método de Euler es relativamente simple. Hacemos esto mediante una funcion llamada Metodo_Euler que recibe to (tinicial), tf (tfinal), yo (yinicial), n. Esta funcion devuelve dos vectores t[i] y y[i] con la solución aproximada.
void Metodo_Euler(double tinicial, double tfinal, double yinicial, int n) { double h; int i; h=(tfinal-tinicial)/n; t[0]=tinicial; y[0]=yinicial; for (i=0; i<n; i++) { y[i+1]=y[i] + h*f(t[i], y[i]); t[i+1]=t[i] + h; } } |
El siguiente ejemplo grafica la solucion exacta en color verde y la obtenida por el Metodo de Euler en blanco, click aqui para descargar el codigo fuente.
/* dy/dt = 1.0 - t + 4.0*y y(0.0) = 1.0 */ #include <GL/glut.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #define MAXPUNTOS 20 double y[MAXPUNTOS+1]; double t[MAXPUNTOS+1]; double f(double t, double y) { return (1.0 - t + 4.0*y); } double exacta(double t) { return (t/4.0 - 3.0/16.0 + (19.0/16.0)*exp(4.0*t)); } void Metodo_Euler(double tinicial, double tfinal, double yinicial, int n) { double h; int i; h=(tfinal-tinicial)/n; t[0]=tinicial; y[0]=yinicial; for (i=0; i<n; i++) { y[i+1]=y[i] + h*f(t[i], y[i]); t[i+1]=t[i] + h; } } void init(void) { Metodo_Euler(0.0, 1.0, 1.0, MAXPUNTOS); } void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT); glMatrixMode( GL_MODELVIEW_MATRIX ); glLoadIdentity(); //grafica de la solucion exacta en color Verde glColor3f(0.0,1.0,0.0); glBegin(GL_LINE_STRIP); for (i=0; i<MAXPUNTOS; i++) glVertex2f(t[i], exacta(t[i])); glEnd(); //grafica de la solucion numerica en color Blanco glColor3f(1.0,1.0,1.0); glBegin(GL_LINE_STRIP); for (i=0; i<MAXPUNTOS; i++) glVertex2f(t[i], y[i]); glEnd(); glFlush (); } void reshape (int w, int h) { if (!h) return; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 1.0, 0.0, 40.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (350, 350); glutInitWindowPosition (0, 0); glutCreateWindow ("Metodo de Euler"); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } |
valcoey@hotmail.com
Ramiro Alcocer, 2001
Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links