Килим Серпінського
Ки́лим Серпі́нського — це плоский фрактал, вперше описаний Вацлавом Серпінським в 1916 році[1]. Килим є одним із прикладів множини Кантора у двох вимірах (у більших вимірах — хмари Кантора). Серпінський продемонстрував, що цей фрактал є універсальною кривою, де будь-який можливий одновимірний граф, спроектований на двовимірну площину, гомеоморфний до підмножини серветки Серпінського. Для кривих, які не можуть бути зображені на двовимірній поверхні без самоперетинань, відповідна універсальна крива — губка Менгера, узагальнення для більших вимірів.
Побудова
Побудова килима Серпінського починається із квадрата. Квадрат розрізається на 9 конгруентних підквадратів, що утворюють сітку три на три, і центральний підквадрат видаляється. Та ж процедура нескінченно рекурсивно застосовується до вісьмох квадратів, що залишилися. На ілюстрації нижче показані перші ітерації процесу побудови.
Килим Серпінського: | |||||
Фаза 0 | Фаза 1 | Фаза 2 | Фаза 3 | Фаза 4 | Фаза 5 |
- має розмірність Гаусдорфа . Як наслідок, міра Лебега дорівнює нулю.
Броунівський рух на килимі Серпінського
Тема броуновського руху на килимі Серпінського в останні роки привернула науковий інтерес. Мартін Барлоу й Річард Басс показали, що випадкове блукання на килимі Серпінського поширюється з меншою швидкістю ніж необмежене випадкове блукання на площині. Для останнього випадку середня відстань пропорційна n1/2 після «n» кроків, а випадкове блукання на дискретному килимі Серпінського дає середню відстань, пропорційну n1/β для деякого β > 2. Мартін Барлоу й Річард Басс також показали, що це випадкове блукання задовольняє сильнішим нерівностям великого відхилення (так званим «субгаусовим нерівностям») і задовольняє овальній нерівності Харнака, при цьому не задовольняючи параболічній. Існування цього прикладу було відкритою проблемою багато років.
Комп'ютерна програма
Наступний Java-аплет малює килим Серпінського за допомогою методу, що рекурсивно викликає себе:
import java.awt.*;
import java.applet.*;
public class SierpinskiCarpet extends Applet {
private Graphics g=null;
private int d0=729; // 3^6
public void init() {
g=getGraphics();
resize(d0,d0);
}
public void paint(Graphics g) {
// start recursion:
drawSierpinskiCarpet ( 0, 0, getWidth(), getHeight() );
}
private void drawSierpinskiCarpet(int xTL, int yTL, int width, int height) {
if (width>2 && height>2) {
int w=width/3, h=height/3;
g.fillRect ( xTL+w, yTL+h, w, h );
for (int k=0;k<9;k++) if (k!=4) {
int i=k/3, j=k%3;
drawSierpinskiCarpet ( xTL+i*w, yTL+j*h, w, h ); // recursion
}
}
}
}