Foros del Web » Programando para Internet » Python »

Problemas Variables Complejas en Python

Estas en el tema de Problemas Variables Complejas en Python en el foro de Python en Foros del Web. Hola, estoy realizando con Python y OpenGL un programilla para dibujar el fractal de Mandlebrot. Resulta que para el código trabajo con variables complejas, y ...
  #1 (permalink)  
Antiguo 05/12/2008, 07:55
Avatar de tofol  
Fecha de Ingreso: febrero-2008
Mensajes: 30
Antigüedad: 16 años, 2 meses
Puntos: 1
Pregunta Problemas Variables Complejas en Python

Hola, estoy realizando con Python y OpenGL un programilla para dibujar el fractal de Mandlebrot. Resulta que para el código trabajo con variables complejas, y estas me están dando algún que otro problema, creo que se debe a la naturaleza de Python o a que yo me estoy obcecando en algo que no se escribe así.
Pongo el código del programa, no es largo:

Código:
#! /usr/bin/env/python

import sys
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from OpenGL.GLE import *
from Numeric import *

def fractal():
    x1 = 0.0
    x2 = 10.0
    y1 = 0.0
    y2 = 10.0
    p = 0.0
    q = 0.0
    k = 1
    incrementop = (x2-x1)/(300.0-1.0)
    incrementoq = (y2-y1)/(300.0-1.0)
    while p<300.0:
        while q<300.0:
            po = x1 + p*incrementop
            qo = y1 + q*incrementoq
            z = complex(0.0, 0.0)
            z1 = complex(po, qo)
            while k<=40:
                z = z*z + z1
                print z
                print abs(z)
                if abs(z)>2:
                    glColor(1.0, 0.0, 0.0)
                    glVertex(po,qo)
                k = k+1
            q = q+1
        p = p+1
def inicia():
   # seleccionamos el color de fondo de ventana	 como negro
   glClearColor (0.0, 0.0, 0.0, 1.0)

   # Creamos la vista  (proyeccion ortogonal)
   glMatrixMode(GL_PROJECTION)
   glLoadIdentity()
   glOrtho(-170.0, 170.0, -170.0, 170.0, -170.0, 170.0)
   
def ver():
    glClearColor(0.0,0.0,0.0,0.0)
    fractal()
    glutSwapBuffers()
    return


glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(400,400)
glutInitWindowPosition(100, 100)
glutCreateWindow("Fractal Mandlebrot")
inicia()
glutDisplayFunc(ver)
glutMainLoop()
Bien, la duda que tengo es que el valor de la variable compleja z siempre me da 0j, es decir, me da cero; cuando hago correr el programa, lo cual es totalmente absurdo.
Me gustaría que alguien me diese alguna luz de porqué pasa eso.
Aunque el código pueda parecer algo complicado es bastante sencillo, y el problema lo tengo en la línea que pone:

z = z*z+z1

Gracias
  #2 (permalink)  
Antiguo 05/12/2008, 11:44
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problemas Variables Complejas en Python

¿qué tal si hacés un "print z1" antes de esa línea? quizás el problema esté en z1...
Sería mucho más fácil si pudiera seguirte en el razonamiento... ¿alguna página en la que pueda leer una descripción del algoritmo? Por lo pronto voy a buscar en Wikipedia


Saludos.
  #3 (permalink)  
Antiguo 06/12/2008, 05:14
Avatar de tofol  
Fecha de Ingreso: febrero-2008
Mensajes: 30
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Problemas Variables Complejas en Python

Hola alvlin, he hecho un print z1 y resulta que todos los z1 que me da son con parte real nula, lo cual no tiene sentido. El código del programa lo he tomado de un pdf y esta en pseudocódigo, te lo pongo aquí

1. Sea ¢p = (x2 − x1)/(˜x − 1)
2. Sea ¢q = (y2 − y1)/(˜y − 1)
3. Hacer desde p = 0 hasta ˜x
3.1. Hacer desde q = 0 hasta ˜y
3.1.1. Hacer p0 = x1 + p · ¢p
3.1.2. Hacer q0 = y1 + q · ¢q
3.1.3. Hacer z = 0 + 0j
3.1.4. Desde k = 1 hasta iteraciones
3.1.4.1. Hacer z = z2 + (p0 + q0 j)
3.1.4.2. Si |z| > 2, pintar el punto (p, q) y
salir del bucle de la variable k
4. Fin

Muchas gracias por la ayuda
  #4 (permalink)  
Antiguo 07/12/2008, 14:49
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problemas Variables Complejas en Python

Me instalé todo lo necesario (PyOpenGL y Numeric) e hice algunas pruebas.
En un principio me sorprendió ver lo mismo que mencionás, estuve un tiempo dándole algunas vueltas hasta que me di cuenta: lo que te falta es reinicializar q y k antes de comenzar sus respectivos bucles

Es decir, en el primer paso p = 0, q se va desde 0 a 300, y k se va desde cero a 40.
Segundo paso, p = 1, q = 300 así que no entra al bucle
Lo que te falta es poner un q=0 y un k=1 antes de los correspondientes while.


Saludos y suerte
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:16.