Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
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, 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