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

Lorenz Attractor 3D

Otro sistema de ecuaciones diferenciales que presenta CAOS es el de Lorenz, el cual es una simplificación de las ecuaciones originales que encontró en la predicción del tiempo.

dx/dt = p(y - x)

dy/dt = -xz + rx - y

dz/dt = xy - bz

con los siguientes parametros p=10, r=28 y b=8/3


Lorenz Attractor en Visual Basic 5.0

Utilizó el Método de Euler para resolver el sistema, las condiciones iniciales del sistema son x(0)=1.0, y(0)=1.0, z(0)=1.0 y utilizo un tamaño de paso h=0.001.

lorenz1.GIF
r1=0.0, r2=0.0, r3=0.0

donde r1, r2, r3 son la rotación con respecto a los ejes x, y, z respectivamente en radianes.

Código Fuente

Código que se encarga de resolver el sistema de ecuaciones y graficarlo en 3D lorenz.zip (2 Kb)

Option Explicit
Const MaxPuntos = 100000
Const FactorDeEscala = 2

Dim r1, r2, r3 As Double
Dim sr1, sr2, sr3, cr1, cr2, cr3 As Double
Dim sx, sy As Double
Dim ScreenX, ScreenY As Long

Function dx(ByVal x As Double, ByVal y As Double, ByVal z As Double) As Double
dx = 10# * (y - x)
End Function

Function dy(ByVal x As Double, ByVal y As Double, ByVal z As Double) As Double
dy = -x * z + 28 * x - y
End Function

Function dz(ByVal x As Double, ByVal y As Double, ByVal z As Double) As Double
dz = x * y - (8 / 3) * z
End Function

Sub SinCos()
sr1 = Sin(r1)
sr2 = Sin(r2)
sr3 = Sin(r3)
cr1 = Cos(r1)
cr2 = Cos(r2)
cr3 = Cos(r3)
End Sub

Sub Calc3D(ByVal x As Double, ByVal y As Double, ByVal z As Double)
Dim xa, ya, za As Double
x = FactorDeEscala * x
y = FactorDeEscala * y
z = FactorDeEscala * z
x = (-1#) * x
xa = cr1 * x - sr1 * z
za = sr1 * x + cr1 * z
x = cr2 * xa + sr2 * y
ya = cr2 * y - sr2 * xa
z = cr3 * za - sr3 * ya
y = sr3 * za + cr3 * ya
z = z - 350
sx = (1200 * x) / z
sy = (1200 * y) / z
End Sub

Sub Lorenz()
Dim x, y, z As Double
Dim h As Double
Dim nPuntos As Long

Picture1.Cls
Call SinCos
x = 1#
y = 1#
z = 1#
nPuntos = 0
h = 0.001
Do While (nPuntos < MaxPuntos)
    x = x + h * dx(x, y, z)
    y = y + h * dy(x, y, z)
    z = z + h * dz(x, y, z)
    Call Calc3D(x, y, z)
    sx = sx + ScreenX / 2#
    sy = sy + ScreenY / 2#
    Picture1.PSet (sx, ScreenY - sy), RGB(255, 0, 0)
    nPuntos = nPuntos + 1
Loop
End Sub

Private Sub cmdEjecutar_Click()
r1 = 0#
r2 = 0#
r3 = 0#
Call Lorenz
End Sub

Private Sub cmdSalir_Click()
Unload Me
End Sub

Private Sub Form_Load()
Picture1.ScaleMode = 3
ScreenX = Picture1.ScaleWidth
ScreenY = Picture1.ScaleHeight
End Sub


Lorenz Attractor en Visual C++ 5.0 usando OpenGL

Las condiciones iniciales son las mismas x(0)=1.0, y(0)=1.0, z(0)=1.0 y el tamañao de paso h=0.05, con 12.000 esferas.


lorenz2.jpg
gluLookAt (15.0, -25.0, 0.0, 0.0, 0.0, 25.0, 0.0, 1.0, 0.0)

Código Fuente

Los archivos necesarios para la compilacion del código se encuentan en lorenz_c.zip (3 Kb)

La libreria GLUT 3.6 se la puede enconotrar en http://reality.sgi.com/opengl/glut3/glut3.html

Acerca de la instalción de GLUT, se debe decomprimir el archivo glutdlls36.zip y copiar el archivo GLUT32.DLL en el directorio WINDOWS/SYSTEM, copiar el archivo GLUT32.LIB en el subdirectorio del compilador destinado a las librerias, y el archivo GLUT.H junto con el resto de los includes de OpenGL.

#include <GL/glut.h>
#include <stdlib.h>

GLfloat diffuseMaterial[4] = {0.75, 0.75, 0.75, 1.0};

void init(void) 
{
   GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
   GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};

   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_SMOOTH);
   glEnable(GL_DEPTH_TEST);
   glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial);
   glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
   glMaterialf(GL_FRONT, GL_SHININESS, 25.0);

   glLightfv(GL_LIGHT0, GL_POSITION, light_position);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);

   glColorMaterial(GL_FRONT, GL_DIFFUSE);
   glEnable(GL_COLOR_MATERIAL);
}

void display(void)
{
   GLfloat x0, y0, z0, x1, y1, z1;
   GLfloat h;
   int Puntos, MaxPuntos=12000;

   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();            
   gluLookAt (15.0, -25.0, 0.0, 0.0, 0.0, 25.0, 0.0, 1.0, 0.0);

   glColor3f(1.0f, 0.4f, 0.4f);
   x0=1.0f;
   y0=1.0f;
   z0=1.0f;
   Puntos=0;
   h=0.005f;
   while  (Puntos<MaxPuntos)
        {
         x1=x0+h*(10.0f*(y0-x0));
         y1=y0+h*(x0*(28.0f-z0)-y0);
         z1=z0+h*(x0*y0-(8.0f/3.0f)*z0);
         x0=x1;
         y0=y1;
         z0=z1;
         glPushMatrix();
         glTranslatef(x0, y0, z0);
         glutSolidSphere(0.5, 12.0, 12.0);
         glPopMatrix();
         Puntos=Puntos+1;
        }
   glFlush ();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 200.0);
   glMatrixMode (GL_MODELVIEW);
}

/* ARGSUSED1 */
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 (600, 600); 
   glutInitWindowPosition (0, 0);
   glutCreateWindow (argv[0]);
   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