Домашняя работа. Фракталы и множества Мандельброта и Жюлиа в MATLAB.
Работы ЛЮБОЙ сложности в MATLAB, для заказа -- контакты в шапке сайта.
Возможно выполнение ТОЛЬКО практической части работы как тут, а возможно написание работы полностью ПОД ключ, с теорией и нужной оригинальностью.
% Множества Мандельброта и Жюлиа
clear all; close all; clc;
% Запускаем цикл выбора пунктов меню:
m=0;D=0;
while m<6
m=menu('SeLect FractaL:','1. Koh Curve','2. Minkovsky FractaL','3. Levi FractaL','4. JuLia','5. ManDeLbrot','EXIT');
if m==6 % Если нажата 6-ая кнопка
break; % Выходим из выбора пунктов меню
end;
figure(1);
switch m
case 1
% Задаём координаты Конца и начала прямой
mn=0;
while mn<5 % цикл выбора числа итераций:
mn=menu('SeLect Max. Number of iteRation:','N=2','N=4','N=6','N=8','EXIT');
if mn==5 % Если нажата 5-ая кнопка
break; % Выходим из выбора пунктов меню
end;
% Рисуем коорд. оси:
plot([-1 1],[0 0],'k-','LineWidth',3);
hold on; % Вкл. Режим наложения изображений
plot([0 0],[-1 1],'k-','LineWidth',3);
text(0,1,'+j');
text(1,0,'+1');
if not(D==0)
clear x
clear y
end;
N=2*mn;
%[X,Y]=ginput(2);
X(1)=-1;X(2)=1;
Y(1)=0;Y(2)=0;
% Длина прямой
%L=sqrt((X(2)-X(1))^2-(Y(2)-Y(1))^2);
x(1,1)=X(1); y(1,1)=Y(1);
x(1,2)=(X(2)-X(1))/3+X(1); y(1,2)=(Y(2)-Y(1))/3+Y(1);
x(1,3)=(X(2)-X(1))*2/3+X(1); y(1,3)=(Y(2)-Y(1))*2/3+Y(1);
x(1,4)=X(2); y(1,4)=Y(2);
plot(x(1,:),y(1,:),'ob-','LineWidt',3);
pause(0.1);
title(strcat('Koh Curve, itRations k=',num2str(1)));
hold off;
for k=2:2:N % цикл итераций
n=(length(x(k-1,:))-1)/3;
% Сдвигаем точки дальнего конца отрезка в предыдущей итерации
for kk=0:n-1
x(k,kk*4+1)=x(k-1,kk*3+1); y(k,kk*4+1)=y(k-1,kk*3+1);
x(k,kk*4+2)=x(k-1,kk*3+2); y(k,kk*4+2)=y(k-1,kk*3+2);
x(k,kk*4+4)=x(k-1,kk*3+3); y(k,kk*4+4)=y(k-1,kk*3+3);
x(k,kk*4+5)=x(k-1,kk*3+4); y(k,kk*4+5)=y(k-1,kk*3+4);
% рассчитываем координаты новой средней точки:
xp2=x(k-1,kk*3+3)-x(k-1,kk*3+2);
yp2=y(k-1,kk*3+3)-y(k-1,kk*3+2);
R2=xp2^2+yp2^2;
cc=R2/2;
aa=R2;
bb=-2*yp2*cc;
ee=cc^2-R2*xp2^2;
D=bb^2-4*aa*ee;
% Получаем координаты веришины вставленного треугольника
y1=(-bb+sqrt(D))/2/aa;
x1=(cc-y1*yp2)/xp2+x(k-1,kk*3+2);
y1=y1+y(k-1,kk*3+2);
y2=(-bb-sqrt(D))/2/aa;
x2=(cc-y2*yp2)/xp2+x(k-1,kk*3+2);
y2=y2+y(k-1,kk*3+2);
% Выбираем корень,
% который рисует треугольник наружу
if abs(x2)>abs(x1)
y(k,kk*4+3)=y2;
x(k,kk*4+3)=x2;
elseif abs(x2)<=abs(x1)
y(k,kk*4+3)=y1;
x(k,kk*4+3)=x1;
end;
if abs(y2)<=abs(y1)
y(k,kk*4+3)=y1;
x(k,kk*4+3)=x1;
elseif abs(y2)>abs(y1)
y(k,kk*4+3)=y2;
x(k,kk*4+3)=x2;
end;
end;
% Рисуем кривую со вставленным новым треугольником
plot(x(k,:),y(k,:),'.b-','LineWidt',1);
axis([-1 1 -1 1]);
axis('square');
title(strcat('Koh Curve, itRations k=',num2str(k)));
pause(0.5);
% Производим новое разбиение отрезков на три:
% и записываем новую итерацию:
n=length(x(k,:))-1;
for kk=0:n-1
x(k+1,kk*3+1)=x(k,kk+1);
y(k+1,kk*3+1)=y(k,kk+1);
x(k+1,kk*3+2)=(x(k,kk+2)-x(k,kk+1))/3+x(k,kk+1);
y(k+1,kk*3+2)=(y(k,kk+2)-y(k,kk+1))/3+y(k,kk+1);
x(k+1,kk*3+3)=(x(k,kk+2)-x(k,kk+1))*2/3+x(k,kk+1);
y(k+1,kk*3+3)=(y(k,kk+2)-y(k,kk+1))*2/3+y(k,kk+1);
x(k+1,kk*3+4)=x(k,kk+2);
y(k+1,kk*3+4)=y(k,kk+2);
end;
% рисуем новое разбиение отрезков следующей итерации
plot(x(k+1,:),y(k+1,:),'.b-','LineWidt',1);
axis([-1 1 -1 1]);
axis('square');
title(strcat('Koh Curve, itRations k=',num2str(k+1)));
pause(0.5);
end; % Конец цикла итераций
end; % Конец цикла выбора числа итераций
case 4
% Поиск точек множества Жюлиа методом обратных итераций (МОИ):
mn=0;
while mn<5 % цикл выбора порядка Z^n:
mn=menu('SeLect Z^n:','n=2','n=3','n=4','n=5','EXIT');
if mn==5 % Если нажата 5-ая кнопка
break; % Выходим из выбора пунктов меню
end;
n=mn+1; M=[100 225 625 1600];
mn=menu('SeLect Total Points Number:','m=100','m=225','m=625','m=1600','EXIT');
if mn==5 % Если нажата 5-ая кнопка
break; % Выходим из выбора пунктов меню
end;
plot([-1 1],[0 0],'k-','LineWidth',3);
hold on; % Вкл. Режим наложения изображений
plot([0 0],[-1 1],'k-','LineWidth',3);
text(0,1,'+j');
text(1,0,'+1');
% Задаём координаты вершин области поиска
[X,Y]=ginput(2);
Y=sort(Y);X=sort(X);
% число точек по координатам
nx=sqrt(M(mn))*(X(2)-X(1))/(Y(2)-Y(1));
ny=sqrt(M(mn))*(Y(2)-Y(1))/(X(2)-X(1)); ;
% шаги по координатам
hx=(X(2)-X(1))/nx; hy=(Y(2)-Y(1))/ny;
% Задаём циклы перебора координат начальной точки c=a+i*b
kk=0; % Инициируем счётчик точек множества Жюлиа
for a=X(1):hx:X(2)
for b=Y(1):hy:Y(2)
z(1)=a+i*b;
plot([a],[b],'k-','LineWidth',1);
N=5; % максимальное число точек в цикле итераций
for k=1:N % цикл счёта итераций
z(k+1)=z(k)^n+z(1);
% Вычисляем расстояние между точками в итерациях
r(k)=abs(z(k+1)-z(k));
end; % конец цикла счёта точек итераций
% цикл проверки расстояний между точками итераций
for k=1:N-1
% Если расстояния между точками итераций
if r(k)<r(k+1)
% то данную точку С не защитываем,
% цикл проверки заканчивается
plot([a],[b],'*k-','LineWidth',1);
break;
end; % Конец условия проверки расстояний между точками итераций
end;
if k>=N-1
kk=kk+1; % Увеличиваем счётчик точек на 1
c(kk)=a+i*b; % Запоминаем точку
plot([a],[b],'ob-','LineWidth',1);
title(strcat('f(z)=z^',num2str(n),'+C; Point Number: k=',num2str(kk),'; C(k)=',num2str(c(kk))));
pause(0.01); % пауза для отображения картинки
end;
end;
end; % Конец циклов перебора координат начальной точки c=a+i*b
% цикл отсева внутренних точек
kc=0;
for k=1:length(c)
% Определяем число соседних с C(k) точек
% по отстоянию по каждой координате
sumC=0;
for kk=1:length(c)
if and(abs(imag(c(kk))-imag(c(k)))<1.001*hy,abs(real(c(kk))-real(c(k)))<1.001*hx)
sumC=sumC+1;
end;
end;
if sumC<7 % Если среди соседних точек хотя бы одна из пустого пространства
kc=kc+1; % увеличиваем счётчик внешних точек на 1
JR(kc)=c(k); % запоминаем эту точку в множестве Жюлиа
% Рисуем множество Жюлиа
plot([real(JR(kc))],[imag(JR(kc))],'or-','LineWidth',3);
title(strcat('f(z)=z^',num2str(n),'+C; Point Number: k=',num2str(kc),'; JR(k)=',num2str(JR(kc))));
pause(0.01);
end;
end; % Конец цикла отсева внутренних точек
hold off; % Выкл. Режим наложения изображений
end; % конец цикла выбора порядка Z^n:
case 5
% Поиск точек множества Мандельброта методом обратных итераций (МОИ):
mn=0; n=2;
while mn<5 % цикл выбора числа точек по действ. оси:
M=[50 100 200 400];
mn=menu('SeLect ReaL Axis Points Number:','m=50','m=100','m=200','m=400','EXIT');
if mn==5 % Если нажата 5-ая кнопка
break; % Выходим из выбора пунктов меню
end;
plot([-2 2],[0 0],'k-','LineWidth',3);
hold on; % Вкл. Режим наложения изображений
plot([0 0],[-2 2],'k-','LineWidth',3);
text(0,2,'+2j');
text(2,0,'+2');
% число точек по координатам
nx=M(mn);
% шаги по координатам
hx=(2-(-2))/nx; hy=hx;
% Задаём циклы перебора координат начальной точки c=a+i*b
kk=1; % Инициируем счётчик точек МандельБрота
c(1)=-2+i*0; % первая точка МандельБрота
for a=-2+hx:hx:2
Y=sqrt(4-a^2);
for b=-Y:hy:Y
z(1)=a+i*b;
if abs(z(1))<2 % условие |c|<2
%plot([a],[b],'k-','LineWidth',1);
N=10; % максимальное число точек в цикле
for k=1:N % цикл счёта итераций
z(k+1)=z(k)^n+z(1);
% Вычисляем расстояние между точками в итерациях
if abs(z(k+1))>=2
break;
elseif k==N
kk=kk+1; % Увеличиваем счётчик точек на 1
c(kk)=a+i*b; % Запоминаем точку
plot([a],[b],'.r-','LineWidth',1);
title(strcat('f(z)=z^',num2str(n),'+C; Point Number: k=',num2str(kk),'; C(k)=',num2str(c(kk))));
pause(0.01); % пауза для отображения картинки
end;
end; % конец цикла счёта точек итераций
end; % Конец условия |c|<2
end;
end; % Конец циклов перебора координат начальной точки c=a+i*b
hold off; % Выкл. Режим наложения изображений
end; % конец цикла выбора числа точек по действ. оси
end; % конец селектора кнопок главного меню
end; % конец цикла выбора пунктов меню