Фракталы деревьев: L-системы и правило ветвления
В 1968 году биолог Аристид Линденмайер пытался описать рост водоросли Anabaena catenula. Он придумал формальный язык замены символов — и неожиданно обнаружил, что им можно описать любое растение. Любое дерево — это программа из нескольких строк.
Место в нарративной оси
Фракталы — это мост между математикой и жизнью. Мандельброт показал, что природа не знает прямых линий: береговые линии, горы, облака, сосуды — всё самоподобно на разных масштабах. Дерево — идеальный объект для изучения: его можно описать символами, нарисовать от руки, запрограммировать, измерить на улице. Золотой угол ветвления 137,5° — то же число, что в подсолнухе и ракушке наутилуса.
Часть 1: Что такое L-системы
Система Линденмайера
L-система — это:
- Алфавит: символы с определёнными действиями
- Аксиома: начальная строка
- Правила замены: как заменять символы на каждом шаге
Стандартный алфавит «черепашьей графики»:
| Символ | Действие |
|---|---|
| F | Шаг вперёд с рисованием |
| f | Шаг вперёд без рисования |
| + | Повернуть влево на угол δ |
| - | Повернуть вправо на угол δ |
| [ | Запомнить позицию и направление |
| ] | Вернуться к запомненной позиции |
Простейшее дерево
Аксиома: F
Правило: F → F[+F]F[-F]F
Угол δ: 25.7°
Итерации:
Шаг 0: F
Шаг 1: F[+F]F[-F]F
Шаг 2: F[+F]F[-F]F[+F[+F]F[-F]F]F[+F]F[-F]F[-F[+F]F[-F]F]F[+F]F[-F]F
Шаг 3: (строка ~200 символов)
Шаг 4: (~1000 символов)
Шаг 5: (~5000 символов → визуально — дерево!)
Симметричное и случайное деревья
Симметричное (δ = 22.5°):
- Аксиома:
X - X →
F+[[X]-X]-F[-FX]+X - F →
FF
Случайное (добавить вероятность к правилу):
- С вероятностью 0.7:
F → F[+F]F[-F]F - С вероятностью 0.3:
F → F[-F]F→ каждый раз — уникальное дерево, как в природе
Опыт 1: Нарисовать дерево вручную
Время: 30–45 минут Материалы: лист A3, карандаш, линейка, транспортир
Задание: пройти 3 итерации правила F → F[+F]F[-F]F с δ = 30°.
Техника:
- Нарисуйте вертикальный отрезок 8 см — это F (ствол, уровень 0)
- По правилу замены разбейте этот F: в конце ствола начертите F (продолжение), от него под +30° — ветку F, затем продолжение, от него под -30° — ветку F
- Каждая новая F = отрезок 4 см (вдвое короче — это «сжатие» масштаба)
- Повторите для каждого нового отрезка — это следующая итерация
- На 3-й итерации F = 2 см → у вас 5-уровневое дерево
Что заметить: структура ветвления одинакова на всех уровнях — это и есть самоподобие.
Опыт 2: Код на Python (10 строк)
import turtle
import re
def apply_rules(axiom, rules, n):
s = axiom
for _ in range(n):
s = ''.join(rules.get(c, c) for c in s)
return s
def draw_lsystem(t, instructions, angle, length):
stack = []
for cmd in instructions:
if cmd == 'F':
t.forward(length)
elif cmd == '+':
t.left(angle)
elif cmd == '-':
t.right(angle)
elif cmd == '[':
stack.append((t.position(), t.heading()))
elif cmd == ']':
t.penup()
pos, head = stack.pop()
t.goto(pos); t.setheading(head)
t.pendown()
# Параметры
axiom = 'F'
rules = {'F': 'F[+F]F[-F]F'}
n = 4 # число итераций
angle = 25.7 # угол ветвления
length = 5 # длина отрезка (пикселей)
t = turtle.Turtle()
t.speed(0); t.left(90); t.penup(); t.goto(0, -200); t.pendown()
instructions = apply_rules(axiom, rules, n)
draw_lsystem(t, instructions, angle, length)
turtle.done()
Упражнения:
- Измените
angleот 10° до 60° → как меняется форма? - Попробуйте правило
F → FF+[+F-F-F]-[-F+F+F](ещё одна классика) - Добавьте цвет:
t.color('green')для ветвей,t.color('brown')для ствола - Измените
nот 1 до 6 → считайте число «листьев» (терминальных F)
Закономерность: при n итерациях, если каждый F порождает k новых F, число ветвей = kⁿ. При n=5, k=3: 3⁵ = 243 ветви из одного правила.
Опыт 3: Измерить реальное дерево
Правило Леонардо да Винчи
В записных книжках Леонардо (~1490) есть наблюдение:
«Все ветви дерева на каждой высоте, взятые вместе, равны толщине ствола.»
Формально: сумма площадей сечений всех ветвей одного уровня = площадь сечения ствола.
π·r₀² = π·r₁² + π·r₂² + ... + π·rₙ²
r₀² = r₁² + r₂² + ... + rₙ²
Это оптимизирует гидравлическое сопротивление — вода поднимается с минимальными потерями давления.
Измерение:
- Найдите небольшое деревце (3–5 м) или ветку
- Измерьте диаметр ствола на высоте 1 м: d₀
- Найдите первый уровень ветвления — измерьте диаметры всех ветвей: d₁, d₂, …
- Проверьте: d₀² ≈ d₁² + d₂² + … ?
- Перейдите на второй уровень — проверьте то же самое
Обычно правило работает с точностью 10–20%. Отклонения — интересный повод для вопроса: почему?
Золотой угол ветвления
В листорасположении (филлотаксис) угол между соседними листьями — 137,5° (золотой угол = 360° / φ², где φ = 1,618…).
У деревьев угол ветвления варьируется, но в спиральных структурах (шишки, подсолнухи) — именно 137,5°.
Измерение:
- Найдите молодой побег с чётко выраженным листорасположением (яблоня, вяз, бук)
- Отметьте последовательные листья: 1, 2, 3, 4…
- Измерьте угол между листьями 1 и 2, 2 и 3…
- Сравните с 137,5°
Фрактальная размерность
Фрактальная размерность D дерева измеряется методом «покрытия клетками»:
- Сфотографируйте зимнее дерево (без листьев) на однородном фоне
- Распечатайте на A4, наложите сетку с ячейкой h
- Подсчитайте число ячеек N(h), которые пересекает дерево
- Уменьшите ячейку вдвое: h/2 → N(h/2)
- D = log(N(h/2)/N(h)) / log(2)
Для реальных деревьев D ≈ 1,5–1,8 (больше линии = 1, меньше площади = 2).
Опыт 4: Фотография + реконструкция
Время: 60–90 минут Лучшее время: зима или ранняя весна (до распускания листьев)
Задание:
- Сфотографируйте дерево при пасмурном небе (равномерный фон)
- По фотографии определите «тип» ветвления: симметричное / спиральное / вееровидное
- Подберите правило L-системы, которое даёт похожий силуэт
- Сравните: что совпало, что нет? Почему?
Математика: как считать ветви
При правиле F → F[+F]F[-F]F каждый F порождает 5 новых F, но из них 2 являются ветвями ([+F] и [-F]), а 3 — продолжением ствола. Число ветвей N_n на уровне n:
N₀ = 1 (ствол)
N₁ = 2 (первые ветви)
N₂ = 4
N_n = 2ⁿ
Рост числа ветвей экспоненциальный — вот почему дерево за лето образует тысячи листьев из одной почки.
Галерея L-систем: классические примеры
| Система | Правила | Итер. | Что получается |
|---|---|---|---|
| Трава | F→FF-[-F+F+F]+[+F-F-F] | 4 | Куст травы |
| Папоротник | X→F+[[X]-X]-F[-FX]+X, F→FF | 5 | Папоротник |
| Снежинка Коха | F→F+F—F+F | 4 | Снежинка |
| Дракон | X→X+YF+, Y→-FX-Y | 12 | Дракон Хартера-Хейтуэя |
| Водоросль | A→AB, B→A | 8 | Рост клеток |
Вопросы для обсуждения
- Почему в природе нет деревьев с идеально симметричным ветвлением? Какой биологический смысл случайности?
- Если фрактальная размерность побережья Великобритании = 1,25, что это значит?
- Как L-системы помогают в компьютерной графике для игр и кино?
- Правило Леонардо оптимально для водопроводной трубы или для дерева? В чём разница?
- Могло ли правило ветвления 137,5° возникнуть случайно, или это необходимое следствие математики роста?
Связи с другими экспериментами
- fractals-nature — фракталы в неживой природе: береговые линии, снежинки, лихтенберг
- fractals-mandelbrot — сложность из простого правила z→z²+c
- fibonacci-nature — числа Фибоначчи, золотое сечение и тот же угол 137,5°
- physarum — физарум строит оптимальные сети: другой алгоритм природы