Zapomeňte na e-shopy: Python umí modelovat realitu (4. díl) – co je to rotace?
Co když se pole nikde „nerodí“, ale přesto se děje něco zajímavého? V tomto díle se podíváme na rotaci — veličinu, která odhaluje lokální víry ve vektorovém poli. Ukážeme si intuici i výpočet v Pythonu.
V předchozím článku jsme si ukázali, co je to divergence – veličina, která nám říká, zda se v daném bodě pole „něco rodí“, „zaniká“, nebo zda je tok vyrovnaný. Intuitivně jsme ji chápali jako lokální zdroj nebo propad pole a zároveň jsme si ukázali, jak ji můžeme vizualizovat pomocí Pythonu.
Jenže tím popis chování pole v jednom bodě nekončí.
Představ si například proudění vody. V některých místech voda přitéká nebo odtéká (to zachytí divergence), ale jinde se může jen „točit na místě“ – vznikají víry, které nemají žádný čistý zdroj ani zánik, a přesto se v nich děje něco zásadního.
A právě tohle divergence nezachytí.
V dnešním článku se proto podíváme na druhou klíčovou vlastnost vektorového pole: rotaci. Ukážeme si, jak poznat, jestli se pole v daném bodě „otáčí“, jak si to představit intuitivně a jak to opět převést do konkrétní vizualizace v Pythonu.

Kód pro článek: https://colab.research.google.com/drive/1r8G2HgYz01bzO_HKE1h8rg7QfiiMa4Wl#scrollTo=gcdWHHevWQyy&line=1&uniqifier=1
Rotace
Na začátku jsme pracovali s mapou počasí. Když si zobrazíme skalární pole atmosférického tlaku na Zemi a zároveň vektorové pole větru, můžeme si všimnout zajímavého jevu, který zatím nemáme jak popsat.

Jinými slovy, vzduch se zde nepohybuje jen z jednoho místa do druhého. Celé proudění má rotační charakter – částice vzduchu opisují zakřivené dráhy a proudnice se kolem center tlaku stáčejí.
Právě tento jev — tedy lokální otáčení vektorového pole — popisuje další operátor vektorové analýzy, který se nazývá rotace (anglicky curl).
Rotace nám říká, zda má pole v daném místě tendenci vytvářet vír. Pokud bychom si představili malou lopatku nebo vrtulku umístěnou do proudícího pole, rotace nám říká, zda by se tato lopatka začala otáčet, a pokud ano, kolem jaké osy.
V meteorologii se rotace používá například při popisu cyklon a anticyklon, tedy velkých atmosférických vírů spojených s tlakovými nížemi a výšemi.
Matematika tak dokáže velmi přesně popsat jev, který známe z každodenní zkušenosti — vítr, který se stáčí do spirály kolem tlakových útvarů v atmosféře.
Divergence nám říká, zda se pole v daném místě rozbíhá nebo sbíhá. Viděli jsme to například u elektrického pole nebo proudění částic.
U větru na mapě počasí jsme ale pozorovali ještě jiný jev. Proudnice se kolem tlakových útvarů stáčejí do spirály. Jinými slovy, pole má vířivý charakter.
Jak ale takový vír matematicky změřit?
Představme si jednoduchý experiment. Do proudění položíme malé kolečko nebo lopatku, podobně jako malý vodní mlýnek. Pokud proudění působí na kolečko tak, že ho začne otáčet, znamená to, že pole má v daném místě rotaci.
Teď si představme velmi malý čtverec v prostoru. Sledujme, jak působí vektorové pole na jednotlivé jeho strany.
Pokud by rychlost pole byla na všech stranách stejná, čtverec by se jen posouval — ale neotáčel by se. Aby vznikla rotace, musí být situace trochu jiná.
Například:
- na horní straně čtverce proudění táhne doprava silněji,
- na dolní straně táhne doprava slaběji.
V takové situaci vznikne otáčivý moment a čtverec se začne otáčet.
Podobně může vzniknout rotace i v druhém směru:
- na pravé straně pole táhne nahoru,
- na levé straně táhne dolů.
V obou případech jde vlastně o to, že se pole mění v prostoru a tyto změny vytvářejí malý vír.
Abychom vír dokázali popsat matematicky, musíme se zamyslet nad tím, co vlastně způsobuje otáčení.
Představme si opět malý čtverec v prostoru. Vektorové pole v něm popisuje například rychlost proudění kapaliny nebo větru. Čtverec je velmi malý, takže pole se v jeho okolí mění jen trochu.
Teď se podívejme na dvě věci.
Nejprve sledujme svislou složku pole $F_y$. Ta říká, jak silně pole tlačí nahoru nebo dolů. Pokud se tato složka mění při pohybu zleva doprava, znamená to, že pravá strana čtverce může být tlačena nahoru jinak než levá. Taková nerovnováha může způsobit otáčení čtverce.

Míru této změny popisuje derivace
$$ \frac{\partial F_y}{\partial x}.$$
Ta říká, jak rychle se svislá složka pole mění při pohybu v horizontálním směru.
Podobný efekt může vzniknout i obráceně. Podívejme se na vodorovnou složku pole $F_x$, která říká, jak silně pole tlačí doleva nebo doprava. Pokud se tato složka mění při pohybu zdola nahoru, může horní strana čtverce tlačit jinak než dolní.

Tuto změnu popisuje derivace
$$\frac{\partial F_x}{\partial y}.$$
A právě kombinace těchto dvou efektů určuje, zda se čtverec začne otáčet.
Rotace pole ve dvou rozměrech je proto dána rozdílem
$$ \frac{\partial F_y}{\partial x} - \frac{\partial F_x}{\partial y}.$$
Tento výraz říká, jak moc pole vytváří lokální otáčení v okolí daného bodu.
Pokud je výsledek nulový, pole v tomto místě žádný vír nevytváří. Pokud je nenulový, pole má vířivý charakter a malé kolečko vložené do pole by se začalo otáčet.
Zatím jsme rotaci definovali pouze pro dvourozměrné pole. Výsledkem byl výraz
$$ \frac{\partial F_y}{\partial x} - \frac{\partial F_x}{\partial y}.$$
Možná jste si všimli jedné zvláštnosti: výsledek je jedno číslo, tedy skalár. To může působit trochu překvapivě, protože rotace přece souvisí s otáčením — a otáčení má vždy nějakou osu.
Důvod je jednoduchý. V čistě dvourozměrném prostoru může vír vzniknout pouze jedním způsobem. Malé kolečko vložené do pole se může otáčet jen kolem osy kolmé k rovině.
Pokud tedy pracujeme v rovině $xy$, je tato osa směrem $z$. Rotace, kterou jsme před chvílí spočítali, je vlastně velikost rotace kolem osy $z$.
Jinými slovy, dvourozměrná rotace je ve skutečnosti jen jedna složka trojrozměrného vektoru rotace.
Jakmile přejdeme do trojrozměrného prostoru, situace se změní. Malé kolečko vložené do pole se může otáčet kolem libovolné osy. Proto už rotaci nemůžeme popsat jedním číslem — potřebujeme vektor, který určí směr i velikost rotace.
Pro vektorové pole
$$ \mathbf{F}(x,y,z) = (F_x, F_y, F_z)$$
je rotace definována jako
$$ \nabla \times \mathbf{F} = \left( \frac{\partial F_z}{\partial y} - \frac{\partial F_y}{\partial z}, \frac{\partial F_x}{\partial z} - \frac{\partial F_z}{\partial x}, \frac{\partial F_y}{\partial x} - \frac{\partial F_x}{\partial y} \right) $$
Každá složka tohoto vektoru popisuje rotaci v jiné rovině prostoru:
- první složka odpovídá rotaci v rovině $yz$,
- druhá složka rotaci v rovině $zx$,
- třetí složka rotaci v rovině $xy$.
A právě tato poslední složka je přesně ten výraz, který jsme odvodili v dvourozměrném případě.
Python ukázka rotace
Abychom si rotaci neukazovali jen na jednom jediném víru, vytvoříme tentokrát složitější vektorové pole, ve kterém budou vedle sebe dva víry s opačným směrem otáčení. Jeden bude mít kladnou rotaci a druhý zápornou.
Díky tomu na jednom obrázku uvidíme nejen proudnice pole, ale také to, že rotace je lokální vlastnost, která se může v různých částech prostoru lišit.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import TwoSlopeNorm
# mřížka
x = np.linspace(-3, 3, 150)
y = np.linspace(-3, 3, 150)
X, Y = np.meshgrid(x, y)
# středy vírů
x1, y1 = -1.5, 0
x2, y2 = 1.5, 0
# vzdálenosti
r1 = (X-x1)**2 + (Y-y1)**2
r2 = (X-x2)**2 + (Y-y2)**2
# víry
U1 = -(Y-y1) * np.exp(-r1)
V1 = (X-x1) * np.exp(-r1)
U2 = (Y-y2) * np.exp(-r2)
V2 = -(X-x2) * np.exp(-r2)
# výsledné pole
U = U1 + U2
V = V1 + V2
# rotace
dx = x[1] - x[0]
dy = y[1] - y[0]
dVdx = np.gradient(V, dx, axis=1)
dUdy = np.gradient(U, dy, axis=0)
curl = dVdx - dUdy
# symetrická barevná škála
limit = np.max(np.abs(curl))
norm = TwoSlopeNorm(vmin=-limit, vcenter=0, vmax=limit)
# graf
plt.figure(figsize=(9,7))
plt.contourf(X, Y, curl, levels=80, cmap="RdBu_r", norm=norm)
plt.colorbar(label="Rotation")
plt.streamplot(X, Y, U, V, color="black", density=1.6, linewidth=1)
plt.title("Vector field with two vortices")
plt.xlabel("x")
plt.ylabel("y")
plt.axis("equal")
plt.show()

Vytvoření mřížky bodů
Nejprve si připravíme prostor, ve kterém budeme pole počítat.
x = np.linspace(-3, 3, 150)
y = np.linspace(-3, 3, 150)
X, Y = np.meshgrid(x, y)
Pomocí linspace vytvoříme rovnoměrně rozložené body v intervalu od -3 do 3. Funkce meshgrid z nich sestaví dvourozměrnou síť bodů. Každý bod této sítě představuje jedno místo v rovině, kde budeme počítat směr a velikost vektoru.
Umístění dvou vírů
Potom zvolíme středy dvou vírů:
x1, y1 = -1.5, 0
x2, y2 = 1.5, 0
První vír bude vlevo od středu obrázku, druhý vpravo. Díky tomu budou od sebe dostatečně oddělené a půjde dobře vidět, jak se jejich pole skládají.
Vzdálenost od středu každého víru
Abychom mohli určit, jak silně každý vír působí v různých částech prostoru, spočítáme vzdálenost od jeho středu.
r1 = (X-x1)**2 + (Y-y1)**2
r2 = (X-x2)**2 + (Y-y2)**2
Zde nepoužíváme samotnou vzdálenost, ale její druhou mocninu. To je výhodné, protože se pak dobře kombinuje s exponenciální funkcí.
Konstrukce jednotlivých vírů
Nyní definujeme první a druhý vír zvlášť.
U1 = -(Y-y1) * np.exp(-r1)
V1 = (X-x1) * np.exp(-r1)
U2 = (Y-y2) * np.exp(-r2)
V2 = -(X-x2) * np.exp(-r2)
Každý vír má dvě složky:
Uje vodorovná složka pole,Vje svislá složka pole.
První vír je zkonstruován tak, aby se otáčel jedním směrem, druhý opačným směrem. Exponenciální člen np.exp(-r) zajišťuje, že vír je nejsilnější ve svém středu a směrem ven rychle slábne.
To je důležité, protože jinak by pole působilo stejně silně i ve velmi vzdálených místech a obrázek by nebyl přirozený.
Složení výsledného pole
Celkové pole získáme jako součet obou vírů.
U = U1 + U2
V = V1 + V2
To je velmi důležitá myšlenka, která se v matematice i fyzice objevuje často: složitější pole lze vytvořit jako superpozici jednodušších polí.
Výpočet rotace
Ve dvou rozměrech jsme rotaci definovali jako
$$\frac{\partial F_y}{\partial x} - \frac{\partial F_x}{\partial y}.$$
V našem kódu platí:
- $F_x = U$
- $F_y = V$
Proto počítáme:
dx = x[1] - x[0]
dy = y[1] - y[0]
dVdx = np.gradient(V, dx, axis=1)
dUdy = np.gradient(U, dy, axis=0)
curl = dVdx - dUdy
Funkce np.gradient numericky aproximuje parciální derivace. Jejich rozdílem dostaneme rotaci v každém bodě mřížky.
Výsledkem je skalární pole rotace, které nám říká, kde má pole tendenci roztočit malé kolečko jedním směrem a kde směrem opačným.
Barevná škála se středem v nule
Protože rotace může být kladná i záporná, chceme, aby nula ležela přesně uprostřed barevné škály.
limit = np.max(np.abs(curl))
norm = TwoSlopeNorm(vmin=-limit, vcenter=0, vmax=limit)
To je důležité pro správnou interpretaci obrázku:
- kladná rotace bude mít jednu barvu,
- záporná rotace jinou,
- nulová rotace bude uprostřed.
Vykreslení obrázku
Nejprve vykreslíme barevnou mapu rotace:
plt.contourf(X, Y, curl, levels=80, cmap="RdBu_r", norm=norm)
plt.colorbar(label="Rotation")
Použitá barevná mapa RdBu_r je vhodná pro veličiny, které mohou nabývat kladných i záporných hodnot.
Potom přes ni vykreslíme proudnice vektorového pole:
plt.streamplot(X, Y, U, V, color="black", density=1.6, linewidth=1)
Proudnice ukazují, jak by se v poli pohybovala částice. Díky nim vidíme samotnou strukturu vírů.
Nakonec nastavíme popisky os a poměr stran:
plt.title("Vector field with two vortices")
plt.xlabel("x")
plt.ylabel("y")
plt.axis("equal")
Poměr stran equal je důležitý, aby se víry nedeformovaly.
Jak obrázek interpretovat
Na výsledném obrázku uvidíme dvě důležité vrstvy informace.
První vrstvou jsou proudnice, které ukazují, že se pole v levé a pravé části skutečně otáčí opačnými směry.
Druhou vrstvou je barevná mapa rotace, která ukazuje, že:
- v jedné oblasti je rotace kladná,
- v druhé záporná,
- mezi nimi může být rotace blízká nule.
To je velmi důležité. Rotace není globální vlastnost celého pole, ale lokální vlastnost každého bodu.
Tím jsme si uzavřeli další důležitý kousek skládačky.
Divergence nám říká, kde se pole „rodí“ nebo „zaniká“. Rotace nám naopak odhaluje, kde se pole stáčí a vytváří víry. Obě tyto veličiny jsou lokální — dívají se na chování pole v nekonečně malém okolí jednoho bodu.
A právě tady se dostáváme k zásadní otázce:
Co když nás nezajímá jen to, co se děje v jednom bodě, ale v nějaké oblasti jako celku?
Představ si uzavřenou plochu — třeba bublinu v kapalině nebo imaginární sféru v prostoru. Kolik pole jí „protéká“ ven? A jak to souvisí s tím, co se děje uvnitř?
Nebo si představ uzavřenou křivku — například kružnici v proudění. Jak moc se pole „otáčí“ kolem této křivky jako celku?
Tím se posouváme od lokálního pohledu k pohledu globálnímu.
V příštím díle začneme právě tímto přechodem. Ukážeme si, co je tok pole (flux) — veličina, která propojuje lokální vlastnosti pole s jeho chováním na větších celcích. Uvidíš, že právě tady se začíná objevovat hlubší struktura matematiky, která stojí za fyzikou, elektřinou, prouděním kapalin i mnoha dalšími jevy.
A možná tě překvapí, že to celé nakonec povede k jedné z nejkrásnějších myšlenek matematiky: že to, co se děje uvnitř, se dá číst z toho, co se děje na hranici.
Pokud chcete vidět celý obraz a jak to všechno zapadá dohromady, tady je kompletní článek:


