Anuncio

Colapsar
No hay ningún anuncio todavía.

mandelbrot

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • mandelbrot

    Aquí os dejo la receta para cocinar un "bonito" (es que en blanco y negro parece una caca de vaca) fractal Mandelbrot. Tan sólo tenéis que compilarlo, importar los datos que se escriben en el fichero con vuestro programa para graficar favorito, representarlo y listo. Esta escrito en fortran 90, pero como la mayoría de los lectores son gente culta y lista, no tendrán problema para implementarlo en el lenguaje que les plazca

    ---------------------------------------------------------------------------------------------------------------------------------
    program Mandelbrot
    implicit none
    integer :: i, j,l
    integer, parameter :: N = 1000
    logical :: pertenece !variable lógica auxiliar para que ejecute el bucle completo
    real :: h, k !en caso de que se satisfaga la condicion de pertenencia.
    real, dimension(1:N) :: a, b
    real, dimension(0:N-1) :: x, y, modul

    h = 0.0020 !tamaño paso eje x
    k = 0.0021 !tamaño paso eje y

    !abrimos el fichero que recogerá los puntos que pertenecen al conjunto mandelbrot

    open (1, file = 'puntos.dat')

    a(1) = -1.5 !punto (a,b) por el que se empieza a comprobar la pertenencia
    b(1) = -1.0

    do j = 1, N
    do l = 1, N
    a(j+1) = a(j) + h
    b(l+1) = b(l) + k
    x(0) = 0.0 !condicion inicial
    y(0) = 0.0
    pertenece = .true. !inicializamos la variable lógica como verdadera
    do i = 0, N-1
    x(i+1) = x(i)**2.0 - y(i)**2.0 + a(j)
    y(i+1) = 2.0 * x(i) * y(i) + b(l)

    !calculamos el módulo de (x,y)
    modul(i+1) = sqrt (x(i+1)**2.0 + y(i+1)**2.0)

    if (modul(i+1) > 2) then
    pertenece = .false.
    exit
    end if
    end do
    if (pertenece .eqv. .false.) then
    cycle !si no pertenece comienza con otro (a,b)
    else
    write(1,*) a(j), b(l) !si pertenece, lo escribimos en el fichero
    end if
    end do
    end do

    close (1)

    end program Mandelbrot
    ------------------------------------------------------------------------------------------------------------------------------

    P.D.1: Con mi mierda de ordenador, un P-III, el programa tarda lo suyo, asiq para aquellos que aun seguís usando ordenadores con procesadores arcaicos xD, no os asusteis si en 20 minutos aun no ha terminado de calcular todos los puntos, y... sí, el paro aburre mucho.

    P.D.2: Vaya, no salen las tabulaciones en el mensaje, estaria bien poder usar verbatim jeje

  • #2
    Re: mandelbrot

    ¡muchas Gracias!

    Comentario


    • #3
      Re: mandelbrot

      Uhm, por cierto, N = 1000 son demasiados pocos puntos, vamos, con eso no vereis nada. Para que ver el fractal bien ponerle N = 100000, y es ahí cuando comprobareis lo de los procesadores arcaicos jeje.

      Comentario


      • #4
        Re: mandelbrot

        Escrito por nicco Ver mensaje
        P.D.2: Vaya, no salen las tabulaciones en el mensaje, estaria bien poder usar verbatim jeje
        prueba con la etiqueta code:

        Código:
        program Mandelbrot
        implicit none
        integer :: i, j,l
        integer, parameter :: N = 1000
        logical :: pertenece		!variable lógica auxiliar para que ejecute el bucle completo
        real :: h, k			    !en caso de que se satisfaga la condicion de pertenencia.
        real, dimension(1:N) :: a, b
        real, dimension(0:N-1) :: x, y, modul
        
        h = 0.0020 !tamaño paso eje x
        k = 0.0021 !tamaño paso eje y
        
        !abrimos el fichero que recogerá los puntos que pertenecen al conjunto mandelbrot
        
        open (1, file = 'puntos.dat')
        
        a(1) = -1.5	 !punto (a,b) por el que se empieza a comprobar la pertenencia  
        b(1) = -1.0
        
        do j = 1, N
        	do l = 1, N
        		a(j+1) = a(j) +  h  
        		b(l+1) = b(l) +  k
        		x(0) = 0.0           !condicion inicial
        		y(0) = 0.0
        		pertenece = .true.   !inicializamos la variable lógica como verdadera
        		do i = 0, N-1
        			x(i+1) = x(i)**2.0 - y(i)**2.0 + a(j)
        			y(i+1) = 2.0 * x(i) * y(i) + b(l)
        
        			!calculamos el módulo de (x,y)
        			modul(i+1) = sqrt (x(i+1)**2.0 + y(i+1)**2.0)
        				
         			if (modul(i+1) > 2) then                   
        				pertenece = .false.		 
        				exit
        			end if
        		end do
        		if (pertenece .eqv. .false.) then
        			cycle			       !si no pertenece comienza con otro (a,b)
        		else
        			write(1,*) a(j), b(l)     !si pertenece, lo escribimos en el fichero
        		end if
        	end do
        end do
        
        close (1)
        
        end program Mandelbrot
        La única alternativo a ser Físico era ser etéreo.
        @lwdFisica

        Comentario


        • #5
          Re: mandelbrot

          eso, así queda mucho mejor, no sabía lo de "code".
          Bueno, aqui os dejo el dibujito, que se me olvidó!

          Por cierto ... alguien sabe como exportar con gnuplot las gráficas a jpg, png o lo que sea? porque he probado de mil maneras y siempre me pasa lo mismo, me crea el archivo en cuestión, pero vacío.

          saludos
          Archivos adjuntos

          Comentario


          • #6
            Re: mandelbrot

            Vaya,
            Mandelbrot ha muerto.
            sigpic
            "Como Deepak Chopra nos enseño, física cuántica significa que cualquier cosa puede pasar en cualquier momento sin ninguna razón." — Prof. Farnsworth
            El Gat de Schrödinger

            Comentario

            Contenido relacionado

            Colapsar

            Trabajando...
            X