Tập hợp JULIA và MANDELBROT
La Trí Dũng
(Trang dành cho các bạn sinh viên và chuyên tin)
Trong số trước, chúng tôi đã giới thiệu với các bạn một khái niệm rất thú vị trong hình học,
được ứng dụng rộng rãi là Fractal, và một thuật toán đơn giản tạo các hình fractal. Để đáp
ứng nhu cầu của các bạn, trong bài này chúng tôi xin giới thiệu với các bạn hai hình fractal
nổi tiếng là Julia và Mandelbrot cùng thuật toán tạo ra chúng. Để nắm được khái niệm và
tạo ra các hình này, các bạn chỉ cần một ít kiến thức về số phức và một số kĩ năng tối thiểu
về lập trình.
Tập Julia
Xét hàm biến phức Q
c
(z) = z
2
+c với z, c là các số phức.
Định nghĩa 1. Quĩ đạo của z theo Q
c
là tập |Q
c
n
(z) | n (- N}
Định nghĩa 2.. Quĩ đạo của z theo Q
c
được gọi là bị chặn nếu tồn tại số K sao cho | Q
c
n
(z)|
< K với mọi n. Ngược lại quỹ đạo được gọi là không bị chặn.
Định nghĩa 3.. Tập Julia đặc của Q
c
là tập các điểm mà quĩ đạo của chúng theo Q
c
là bị
chặn. Tập Julia của Q
c
là tập các điểm biên của tập Julia đặc.Tập Julia đặc thường kí hiệu
là K
c
, còn tập Julia -J
c
.
Định lí (tiêu chuẩn thoát). Giả sử |z| > |c| > 2. Khi đó |Q
c
n
(z) |→ ∞ khi n → ∞
Hệ quả. Giả sử |z| > max{|c|, 2}. Khi đó |Q
c
n
(z) | > (1+λ)
n
|z| nên |Q
c
n
(z) | → ∞ khi n → ∞
Chứng minh định lí trên và hệ quả các bạn có thể tham khảo trong A first course in chaotic
dynamical systems của Robert L. Devaney.
Từ định lí trên ta suy ra một thuật toán tạo tập Julia đặc:
Chọn số bước lặp lớn nhất là N. Với mỗi điểm z trên mặt phẳng phức ta tìm N điểm đầu
tiên trên quĩ đạo của z. Nếu |Q
c
i
(z)| > max{|c|, 2} với i <= N thì ngừng lặp và tô điểm z
màu trắng. Tập các điểm màu đen (không được tô màu) sẽ là xấp xỉ của tập Julia đặc.
Chương trình sau mô phỏng thuật toán bằng ngôn ngữ Pascal:
Program Julia;
Uses Crt,Graph;
Const
W=180;
N=200;
Re_c=-0.5;
Im_c=0.57;
Re_a=-1.8;
Im_a=-1.3;
s=2.5;
Re_b=Re_a+1.5*s;
Im_b=Im_a+s;
i,m,Gd,Gm: integer;
Re_z,Im_z,size,r,t,Re_zi,Im_zi: real;
BEGIN
Gd:=Detect;
InitGraph(Gd,Gm,' ');
size:=s/500;
Re_z:=Re_a;
Repeat
Im_z:=Im_a;
Repeat
r:=Sqr(Re_z)+Sqr(Im_z);
i:=0;
Re_zi:=Re_z;
Im_zi:=Im_z;
Repeat
t:=Sqr(Re_zi)-Sqr(Im_zi)+Re_c;
Im_zi:=2*Re_zi*Im_zi+Im_c;
Re_zi:=t;
r:=Sqr(Re_zi)+Sqr(Im_zi);
Inc(i);
Until (i>N)or(r>4);
If i<=N then Putpixel(Round((Re_z-Re_a)*W),Round((Im_z-Im_a)*W),15);
Im_z:=Im_z+size;
Until Im_z>Im_b;
Re_z:=Re_z+size;
Until Re_z>Re_b;
CloseGraph;
END.
Tập Julia đặc có hình dạng như hình bên (màu đen).
Các viền màu quanh tập Julia đặc cũng là các tập Julia đặc xấp xỉ, ứng với N nhỏ hơn.
Trong chương trình trên, các bạn có thể dựa vào độ lớn của biến i khi thoát khỏi vòng lặp
để tô màu cho điểm (Re_z, Im_z), chẳng hạn màu đỏ ứng với i=1, màu hồng ứng với i=2,
màu cam ứng với i=3,... Các bạn cũng có thể thay đổi các số liệu ban đầu như giá trị của c,
độ phóng đại W, toạ độ điểm góc trái trên a, góc phải dưới b,... để thu được các tập Julia
đặc khác nhau.
Tập Mandelbrot
Xét hàm biến phức Q
c
(z) = z
2
+c như trên.
Có thể xảy ra 2 khả năng:
1. Quĩ đạo của điểm 0 theo Q
c
là tập không bị chặn. Khi đó K
c
chứa vô số thành phần
không liên thông.
2. Quĩ đạo của điểm 0 bị chặn, khi đó K
c
là tập liên thông.
Do đó ta có:
Định nghĩa 4. Tập Mandelbrot M là tập hợp chứa tất cả các điểm c sao cho các tập Julia
đặc K
c
tương ứng là tập liên thông, hay tương đương M = {c ∈ C | |Q
c
n
(0)| → ∞ }.
Thuật toán tạo tập Mandelbrot:
Chọn số bước lặp lớn nhất là N. Với mỗi điểm c trên mặt phẳng phức ta tìm N điểm đầu
tiên trên quĩ đạo của 0 theo Q
c
. Nếu |Q
c
i
(0)| > 2 với i ≤ N thì ngừng lặp và tô điểm c màu
trắng. Nếu |Q
c
i
(0)| ≤ 2 với mọi i ≤ N thì tô điểm c màu đen.
Chương trình sau mô phỏng thuật toán bằng ngôn ngữ Pascal:
Program Mandelbrot;
Uses Crt,Graph;
Const
W=200;
s=2.4;
N=34;
Re_a=-2.1;
Im_a=-1.2;
Re_b=Re_a+1.5*s;
Im_b=Im_a+s;
Var
i,Gd,Gm: integer;
Re_c,Im_c,size,r,t,Re_0i,Im_0i: real;
BEGIN
Gd:=Detect;
InitGraph(Gd,Gm,' ');
size:=s/480;
Re_c:=Re_a;
Repeat
Im_c:=Im_a;
Repeat
Re_0i:=0;
Im_0i:=0;
i:=0;
r:=0;
Repeat
t:=Sqr(Re_0i)-Sqr(Im_0i)+Re_c;
Im_0i:=2*Re_0i*Im_0i+Im_c;
Re_0i:=t;
r:=Sqr(Re_0i)+Sqr(Im_0i);
Inc(i);
Until (i>N)or(r>4);
If i<=N then Putpixel(Round((Re_c-Re_a)*W),Round((Im_c-Im_a)*W),15);
Im_c:=Im_c+size;
Until Im_c>Im_b;
Re_c:=Re_c+size;
Until Re_c>Re_b;
CloseGraph;
END.
Tập Mandelbrot có dạng như hình bên.
Hy vọng rằng chúng tôi sẽ còn có dịp quay lại với các bạn về các tính chất đặc sắc và lý
thú của các tập hợp Julia và Maldelbrot này.