Barnsley Fern là fractal hình thành bởi hệ lặp hàm (Iterated Function System - IFS) gồm 4 phép biến đổi affine với xác suất khác nhau. Được phát minh bởi Michael Barnsley.
Công thức toán học
Mỗi phép biến đổi: f(x,y) = [[a,b],[c,d]] * [x,y] + [e,f]
4 phép biến đổi với xác suất:
| Xác suất | a | b | c | d | e | f |
|---|---|---|---|---|---|---|
| 1% | 0 | 0 | 0 | 0.16 | 0 | 0 |
| 85% | 0.85 | 0.04 | -0.04 | 0.85 | 0 | 1.6 |
| 7% | 0.2 | -0.26 | 0.23 | 0.22 | 0 | 1.6 |
| 7% | -0.15 | 0.28 | 0.26 | 0.24 | 0 | 0.44 |
Mã nguồn Python
import matplotlib.pyplot as plt
import random
x = [0]
y = [0]
current = 0
for i in range(1, 50000): # tăng số lần lặp cho đẹp hơn
z = random.randint(1, 100)
if z == 1: # 1%
x.append(0)
y.append(0.16 * y[current])
elif 2 <= z <= 86: # 85%
x.append(0.85 * x[current] + 0.04 * y[current])
y.append(-0.04 * x[current] + 0.85 * y[current] + 1.6)
elif 87 <= z <= 93: # 7%
x.append(0.2 * x[current] - 0.26 * y[current])
y.append(0.23 * x[current] + 0.22 * y[current] + 1.6)
else: # 94-100: 7%
x.append(-0.15 * x[current] + 0.28 * y[current])
y.append(0.26 * x[current] + 0.24 * y[current] + 0.44)
current += 1
plt.figure(figsize=(8, 10))
plt.scatter(x, y, s=0.1, c='green', edgecolors='none')
plt.axis('off')
plt.title('Barnsley Fern')
plt.show()Kết quả

Giải thích
- Phép biến đổi 1 (1%): Tạo chân rừng (stem).
- Phép biến đổi 2 (85%): Tạo các lá chính nhỏ dần lên trên.
- Phép biến đổi 3 & 4 (7% mỗi): Tạo lá trái/phải dưới cùng.
- Số điểm 50,000 cho hình ảnh mượt; 1000 chỉ cho hình thô.
Mở rộng
- Thay đổi tham số để tạo fractal khác (Maple leaf, Spiral...).
- Dùng NumPy vectorization để tăng tốc độ lớn.
- Lưu thành ảnh high-res:
plt.savefig('fern.png', dpi=300).
Kết luận
Barnsley Fern minh họa đẹp cho Chaos Theory và IFS. Chỉ cần vài chục dòng Python tạo ra hình ảnh tự nhiên phức tạp.