Mandelbrot 设置错误的形状
Mandelbrot Set Wrong Shape
我目前正在尝试编写一个生成 mandelbrot 集的程序。但是,即使我对每种方法都进行了大量测试。整套的形状好像不对,正在寻求帮助,如果有人知道如何修复它,我将非常高兴。
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);
}
}
形状看起来(不完全)错误:
从数学上讲,您正在从 500 x 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_a
和z_b
表示复变量z
的实部和虚部,而c_a
和c_b
表示实部和复数参数的虚部 c
。迭代总是从零开始,这就是为什么 z_a
和 z_b
一开始都设置为零的原因。但是,参数 c
发生了变化。
我目前正在尝试编写一个生成 mandelbrot 集的程序。但是,即使我对每种方法都进行了大量测试。整套的形状好像不对,正在寻求帮助,如果有人知道如何修复它,我将非常高兴。
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);
}
}
形状看起来(不完全)错误:
从数学上讲,您正在从 500 x 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_a
和z_b
表示复变量z
的实部和虚部,而c_a
和c_b
表示实部和复数参数的虚部 c
。迭代总是从零开始,这就是为什么 z_a
和 z_b
一开始都设置为零的原因。但是,参数 c
发生了变化。