2017-03-17 56 views
0

我目前正试图编写一个程序来生成mandelbrot集。然而,即使我做了大量的测试,每一种方法。整套的形状似乎是错误的。我正在寻求帮助,如果有人知道如何解决这个问题,我会很高兴。Mandelbrot Set错误的形状

import java.awt.*; 
import javax.swing.*; 

public class MandelbrotMenge extends JComponent { 

    int WIDTH = 600; 
    int HEIGHT = 600; 
    static int n = 1; // anzahl iterationen 

    static double a; // reeller Anteil von komplexer Zahl 
    static double b; // imaginärer Anteil 

    public MandelbrotMenge(int p_n) { 
     setSize(WIDTH, HEIGHT); 
     n = p_n; 
    } 

    public static boolean isMandelbrot(double a_n, double b_n, int n) { // prüft 
     // ob 
     // komplexe 
     // zahl 
     // divergiert 
     a = a_n; 
     b = b_n; 
     double a2 ; 
     for (int i = 0; i < n; i++) { 
      a2 = a * a - b * b + a;  
      b = 2 * a * b + b; 
      a=a2; 
      if (a * a + b * b >= 4) 
       return false; 
     } 
     return true;  
    } 

    public static void zeichneMandelbrot(Graphics g,int n) {  
     for (int i = 100; i <= 600; i++) { 
      for (int j = 0; j <= 600; j++) {  
       // i ist pixel und j auch 

       // komplexe zahl: 
       a = -3 + 0.01 * i; // x min = -3 x max = 6 pixel =600 --> 0.01*i 
       b = 3 - 0.01 * j; 

       if (isMandelbrot(a, b, n)) { 
        g.setColor(Color.white); 
       } else { 
        g.setColor(Color.black); 
       } 
       g.drawLine(i, j, i, j);  
      }  
     }  
    } 

    protected void paintComponent(Graphics g) { 
     zeichneMandelbrot(g, n); 
    } 
} 

外形看起来(不完全)错误:

enter image description here

+0

你使用了什么样的'n'值? –

回答

3

从数学上讲,你是从初始值的500通过500像素网格迭代的具体功能f(z)=z^2+z和你产生了什么恰恰是该函数的Julia集合。要生成Mandelbrot集,您需要迭代f(z)=z^2+c,但现在,您始终使用相同的初始点0,而让参数c在整个网格范围内。

这样,不是

a = a_n; 
    b = b_n; 
    double a2 ; 
    for (int i = 0; i < n; i++) { 
     a2 = a * a - b * b + a;  
     b = 2 * a * b + b; 
     a=a2; 
     ... 
    } 

你会需要像

z_a = 0; 
    z_b = 0; 
    a = c_a 
    b = c_b 
    double z_a2 ; 
    for (int i = 0; i < n; i++) { 
     a2 = z_a * z_a - z_b * z_b + a;  
     b = 2 * z_a * z_b + b; 
     a=a2; 
     ... 
    } 

在这段代码,z_az_b代表的复变z的实部和虚部同时c_ac_b代表复杂参数c的实部和虚部。迭代总是从零开始,这就是为什么z_az_b在一开始都被设置为零的原因。虽然参数c发生了变化。