Вероятно, нельзя привести пример такого компьютерного эксперимента, который впечатлением от результатов превосходил бы то чувство удивления, и восхищения, которое вызывает графическое построение множеств Мандельброта и множества Жюлиа на плоскости. Эти множества относятся к хаотической динамике на комплексной плоскости.
Начнём с самого понятия. Множество Мальденброта – это множество комплексных чисел, которые удовлетворяют следующим условиям:
где: Z0=c
Zn+1=Z2n+c
Ниже я хочу вам продемонстрировать как будет выглядеть Множество Мальденброта в программном виде:
double MinRe = -2.5; double MaxRe = 1.0; double MinIm = -1; double MaxIm = 1; double Re_factor = (MaxRe - MinRe); double Im_factor = (MaxIm - MinIm); int MaxIterations = 100; for (double y = 0; y < _ymax; y+=0.001) { double c_im = MaxIm - y * Im_factor; for (double x = 0; x < _xmax; x+=0.001) { double c_re = MinRe + x * Re_factor; double Z_re = c_re, Z_im = c_im; bool isInside = true; for (int n = 0; n < MaxIterations; ++n) { double Z_re2 = Z_re * Z_re, Z_im2 = Z_im * Z_im; if (Z_re2 + Z_im2 > 4) { isInside = false; break; } Z_im = 2 * Z_re * Z_im + c_im; Z_re = Z_re2 - Z_im2 + c_re; } if (isInside) { _graph.SetPixel(Xs(x), Ys(y), Color.Black); } } }
Множество Жюлиа – это множество комплексных чисел, которые удовлетворяют следующим условиям:
где: Z0 = K
Zn+1=Z2n+K
Множество Жюлиа в програмном виде:
double MinRe = -2.5; double MaxRe = 1.0; double MinIm = -1; double MaxIm = 1; double Re_factor = (MaxRe - MinRe); double Im_factor = (MaxIm - MinIm); //double c_re = -0.1; double c_re = 0; double c_im = -0.156; double _zp = 0.3; int MaxIterations = 100; for (_zp = 0; _zp <= 6; _zp += 0.5) { c_re = -0.8; for (double y = _ymin; y < _ymax; y += 0.001) { for (double x = _xmin; x < _xmax; x += 0.001) { double Z_re = x, Z_im = y; bool isInside = true; for (int n = 0; n < MaxIterations; ++n) { double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im; if (Z_re2 + Z_im2 > 16) { isInside = false; break; } Z_im = 2*Z_re*Z_im + c_im; Z_re = Z_re2 - Z_im2 + c_re; } if (isInside) { if (((Graph3dX(x, _zp) > _xmin) && (Graph3dX(x, _zp) < _xmax) && (Graph3dY(y, _zp) < _ymax) && Graph3dY(y, _zp) > _ymin)) { _graph.SetPixel(Xs(Graph3dX(x, _zp)), Ys(Graph3dY(y, _zp)), Color.Black); } //_graph.SetPixel(Xs(x), Ys(y), Color.Black); } } } }
Отличие множества Жюлиа от множества Мальденброта состоит в том, что в данном случае мы изначально фиксируем некоторое комплексное число K и начинаем наши вычисления с постоянным K. При построении множества Мальденброта мы должны были просчитывать каждый раз новое c.