Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links

Sistema de Ecuaciones Diferenciales de Primer Orden

A modo de ejemplo voy a resolver la siguiente ecuacion diferencial de orden 2:

las condiciones iniciales son y(0)=2, y'(0)=0 en el intervalo [0, 5]

hacemos el siguiente cambio de variables

convertimos la ecuación original en un sistema de ecuaciones de orden 1

este sistema lo resuelvo utilizando una ampliacion del Metodo de Runge-Kutta de orden 4 para una ecuación de orden 1.

La siguiente imagen es la representación grafica de la solución y(t) esta en color verde, y en rojo esta la derivada de y(t).

El Código Fuente

El código fuente, es muy simple ya que utilizo OpenGL, para graficar la solución.

/*
Sistema de Primer Orden

Resolver la siguiente ecuacion diferencial de segundo orden:
  y''=-2y'-4y
con las condiciones iniciales y(0)=2, y'(0)=0 en el intervalo [0,5].

nuevas variables
u1=y  u2=y'
convertimos la ecuacion original en un sistema de primer orden
u1'=u2=f(t,u1,u2)
u2'=-2*u2-4*u1=g(t,u1,u2)
*/
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define	MAXPUNTOS	100

double t[MAXPUNTOS+1], u1[MAXPUNTOS+1], u2[MAXPUNTOS+1];

double f(double t, double u1, double u2)
{
 return (u2);
}

double g(double t, double u1, double u2)
{
 return (-2.0*u2 - 4.0*u1);
}

void RK4(double tinicial, double tfinal, 
		 double u1_inicial, double u2_inicial,
		 int n)
{
 double k1, k2, k3, k4;
 double l1, l2, l3, l4;
 double h;
 int i;

 h=(tfinal-tinicial)/n;
 t[0]=tinicial;
 u1[0]=u1_inicial;
 u2[0]=u2_inicial;
 for (i=0; i<n; i++)
	{
	k1=h*f(t[i], u1[i], u2[i]);
	l1=h*g(t[i], u1[i], u2[i]);
	k2=h*f(t[i]+h/2.0, u1[i]+k1/2.0, u2[i]+l1/2.0);
	l2=h*g(t[i]+h/2.0, u1[i]+k1/2.0, u2[i]+l1/2.0);
	k3=h*f(t[i]+h/2.0, u1[i]+k2/2.0, u2[i]+l2/2.0);
	l3=h*g(t[i]+h/2.0, u1[i]+k2/2.0, u2[i]+l2/2.0);
	k4=h*f(t[i]+h, u1[i]+k3, u2[i]+l3);
	l4=h*g(t[i]+h, u1[i]+k3, u2[i]+l3);
	u1[i+1]=u1[i]+(1.0/6.0)*(k1 + 2.0*k2 + 2.0*k3+ k4);
	u2[i+1]=u2[i]+(1.0/6.0)*(l1 + 2.0*l2 + 2.0*l3+ l4);
	t[i+1]=t[i] + h;
	}
}

void init(void)
{
 RK4(0.0, 5.0, 2.0, 0.0, MAXPUNTOS);
}

void display(void)
{
 int i;

 glClear(GL_COLOR_BUFFER_BIT);
 glMatrixMode( GL_MODELVIEW_MATRIX );
 glLoadIdentity();

 //ejes
 glColor3f(0.0, 0.5, 0.8);  
 glBegin(GL_LINES);
  glVertex2f(0.0, 0.0);
  glVertex2f(5.0, 0.0);
  glVertex2f(0.0, -2.5);
  glVertex2f(0.0, 2.5);
 glEnd();

 //grafica de u1 en color Verde ( y(t) )
 glColor3f(0.0, 1.0, 0.0);  
 glBegin(GL_LINE_STRIP);
 for (i=0; i<MAXPUNTOS; i++)
 	 glVertex2f(t[i], u1[i]);
 glEnd();

 //grafica de u2 en color Rojo ( y'(t) )
 glColor3f(1.0, 0.0, 0.0);
 glBegin(GL_LINE_STRIP);
 for (i=0; i<MAXPUNTOS; i++)
 	 glVertex2f(t[i], u2[i]);
 glEnd();

 
 glFlush ();
}

void reshape (int w, int h)
{
 if (!h)
	return;
 glViewport(0, 0, w, h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(-1.0, 6.0, -3.0, 3.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 ("Ecuación de Segundo Orden");
 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