Zapomeňte na e-shopy: Python umí modelovat realitu (1. díl) – co je to pole?

Matematika není o vzorcích, ale o popisu reality. V tomhle článku vysvětluju, co je pole a jak ho pomocí Pythonu použít pro modelování světa kolem nás.

Zapomeňte na e-shopy: Python umí modelovat realitu (1. díl) – co je to pole?

Na vysoké škole jsem se s matematikou docela trápil. Přišel jsem z chemické průmyslovky, kde se na matematiku nekladl takový důraz jako na gymnáziích. První rok studia jsem proto ve velké míře doháněl matematické základy. Počítal jsem velké množství příkladů a často jsem se matematiku učil spíše mechanicky než skutečným porozuměním.

Hlavní problém byl v tom, že mi tehdy mnoho věcí nedávalo smysl. Často jsem si kladl otázku, kterou si klade spousta studentů:
„K čemu mi to vlastně bude?“

Musím říct, že způsob výuky tomu někdy příliš nepomáhal. Výklad často probíhal velmi úsporně a formálně: definice, věta, důkaz, jeden ukázkový příklad a pokračujeme dál, protože sylabus je dlouhý a času málo. Tento styl výuky je sice efektivní z hlediska předání formální struktury matematiky, ale neodpovídá tomu, jak matematika ve skutečnosti historicky vznikala.

Historický proces objevování matematiky je totiž téměř opačný.

Většinou začíná nějakým problémem. Člověk, skupina lidí nebo celé lidstvo narazí na konkrétní otázku. Často jde o velmi specifický problém – matematik by řekl speciální případ. Lidé začnou problém zkoumat a postupně si všímají určitých pravidelností nebo vzorů.

Například si někdo může všimnout, že obvod kruhu roste úměrně s jeho průměrem. Pokud změří několik kruhů, zjistí, že poměr obvodu a průměru je vždy přibližně stejný. Nejprve vyjde číslo okolo 3. Později přesnější měření dávají hodnoty 3,1; 3,14; 3,141; 3,1415 a tak dále.

Teprve ve chvíli, kdy je tento vzor dostatečně zřejmý, vznikne matematické zobecnění:

$O = \pi d$

nebo

$O = 2\pi r$

Matematický vzorec tak vlastně vzniká ze vzoru, který jsme v realitě pozorovali. Slovo „vzorec“ tuto souvislost krásně připomíná.

Matematika tedy historicky nevznikala tak, že by někdo nejprve napsal definici, poté větu a důkaz. Většinou to bylo naopak: nejdřív přišlo pozorování a hledání pravidelností a až následně jejich přesné matematické vyjádření.

A právě tento způsob uvažování mi začal dávat smysl až mnohem později, když jsem matematiku začal vnímat jako jazyk pro popis vzorů ve světě kolem nás. V tomto článku bych chtěl jeden takový jazyk představit: matematiku vektorových polí, která stojí za popisem proudění tekutin, elektromagnetismu, difuze nebo přenosu tepla.

Ironii osudu je, že jsem na tomto tématu vyletěl poprvé a naposledy z písemné zkoušky. Tehdy jsem ještě nechápal, k čemu se to používá, aplikace přišla později.

Co je pole?

Slovo pole má v češtině několik významů. Většina lidí si pravděpodobně představí pole, na kterém se pěstují plodiny. Pokud programujete, možná vás napadne také pole jako datová struktura, která slouží k ukládání sekvence hodnot v paměti počítače.

V tomto článku ale nemám na mysli ani jedno z těchto polí. Budeme se bavit o matematickém poli. Než se k němu dostaneme formálněji, podívejme se na obrázek, který jeho pochopení výrazně usnadní.

Na obrázku vidíme velkou část mapy světa. Zobrazuje dvě informace, které jsou pro nás důležité.

První informací je barva jednotlivých oblastí. Barva zde reprezentuje teplotu vzduchu v daném místě. Každému bodu na mapě je tedy přiřazeno jedno číslo – teplota. Takový typ matematického objektu nazýváme skalární pole.

Formálně řečeno je skalární pole funkce, která každému bodu v prostoru přiřazuje jednu hodnotu, tzv. skalár. Typickými příklady skalárních polí jsou například:

  • teplota v atmosféře,
  • tlak v kapalině,
  • koncentrace látky v chemickém reaktoru,
  • nebo nadmořská výška na mapě terénu.

Druhou informaci na obrázku představují bílé čáry, které vypadají jako jemné šmouhy. Ty znázorňují směr proudění větru. V každém bodě prostoru zde tedy není jen jedna hodnota, ale informace o směru a velikosti pohybu vzduchu.

Takový typ pole nazýváme vektorové pole.

Formálně je vektorové pole funkce, která každému bodu v prostoru přiřazuje vektor. Vektor je veličina, která má nejen velikost, ale také směr. Proto se hodí k popisu jevů, kde záleží na orientaci v prostoru.

Typickými příklady vektorových polí jsou například:

  • rychlost proudění vzduchu (vítr),
  • rychlost proudění vody v řece,
  • elektrické pole kolem nabité částice,
  • magnetické pole kolem vodiče s proudem.

Skalární pole nám tedy říká kolik, zatímco vektorové pole nám říká kolik a kam. Právě tato jednoduchá myšlenka stojí za velkou částí matematiky, která popisuje proudění tekutin, elektromagnetismus nebo difuzi látek.

Pokud chcete vidět tu mapu interaktivně, koukněte sem: https://www.ventusky.com/

Pole v Pythonu

Můj blog se snažím psát tak, aby byl co nejvíce lidský, konkrétní a praktický. Nechci jen vysvětlovat matematické pojmy abstraktně, ale ukázat také, jak s nimi můžeme pracovat v praxi. Proto v článku najdete i jednoduché ukázky kódu v Pythonu, které si můžete sami vyzkoušet.

Začněme tím nejjednodušším typem pole, se kterým se v matematice i fyzice setkáme – skalárním polem. Na krátkém příkladu si ukážeme, jak takové pole vytvořit a vizualizovat.

Skalární pole

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-2,2,100)
y = np.linspace(-2,2,100)

X, Y = np.meshgrid(x,y)

Z = X**2 + Y**2

plt.contourf(X,Y,Z,20)
plt.colorbar()
plt.title("Scalar field")
plt.show()

Pojďme si postupně vysvětlit, co jednotlivé části kódu dělají.

Nejprve importujeme dvě knihovny:

import numpy as np
import matplotlib.pyplot as plt

Knihovna NumPy slouží k numerickým výpočtům a práci s poli čísel.
Matplotlib používáme pro vizualizaci dat.

Vytvoření souřadnic

x = np.linspace(-2,2,100)
y = np.linspace(-2,2,100)

Funkce linspace vytvoří 100 rovnoměrně rozložených bodů mezi hodnotami -2 a 2.
Tyto body budou představovat souřadnice v rovině.

Můžeme si je představit jako jemnou síť bodů na mapě.

Vytvoření mřížky bodů

X, Y = np.meshgrid(x,y)

Funkce meshgrid vytvoří dvourozměrnou mřížku bodů ze souřadnic x a y.

Každý bod mřížky má tedy souřadnice:

$(x,y)$

Tato mřížka reprezentuje prostor, ve kterém budeme skalární pole počítat.

Definice skalárního pole

Z = X**2 + Y**2

Zde definujeme funkci

$ f(x,y) = x^2 + y^2 $

Tato funkce každému bodu roviny přiřazuje jedno číslo.

Například:

xyhodnota
000
101
112
228

To je přesně definice skalárního pole.

Vykreslení pole

plt.contourf(X,Y,Z,20)

Funkce contourf vykreslí vyplněné vrstevnice (contour plot).
Číslo 20 určuje počet barevných úrovní.

Výsledek připomíná topografickou mapu, kde různé barvy reprezentují různé hodnoty funkce.

Barevná legenda

plt.colorbar()

Přidá barevnou škálu, která ukazuje, jaké hodnoty odpovídají jednotlivým barvám.

Titulek grafu

plt.title("Scalar field")

Přidá název grafu.

Zobrazení grafu

plt.show()

Nakonec graf vykreslí na obrazovku.

Co vlastně vidíme?

Výsledný obrázek ukazuje skalární pole funkce

$ f(x,y) = x^2 + y^2 $

Nejmenší hodnota je uprostřed (v bodě (0,0)).
Čím dál od středu se posouváme, tím hodnota funkce roste.

Geometricky jde o paraboloid – tvar připomínající misku.

Teď se posuňme o krok dál a podívejme se na vektorová pole. Na rozdíl od skalárního pole, které každému bodu přiřazuje jednu hodnotu, vektorové pole přiřazuje vektor – tedy veličinu, která má velikost i směr.

Abychom si tuto myšlenku lépe představili, ukážeme si jednoduchý příklad v Pythonu. Pomocí několika řádků kódu můžeme vektorové pole nejen spočítat, ale také vizualizovat jako síť šipek, které ukazují směr a velikost vektorů v jednotlivých bodech prostoru.

Vektorové pole

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-2,2,20)
y = np.linspace(-2,2,20)

X, Y = np.meshgrid(x,y)

U = -Y
V = X

plt.quiver(X,Y,U,V)
plt.title("Vector field")
plt.show()

Pojďme si vysvětlit jednotlivé části.

Import knihoven

Nejprve importujeme dvě knihovny, stejné jako u skalárního pole.

import numpy as np
import matplotlib.pyplot as plt

Vytvoření souřadnic

x = np.linspace(-2,2,20)
y = np.linspace(-2,2,20)

Funkce linspace vytvoří 20 rovnoměrně rozložených bodů mezi hodnotami -2 a 2.

Tyto body představují souřadnice v rovině. V podstatě si připravujeme mřížku bodů, ve kterých budeme vektorové pole počítat.

Vytvoření mřížky

X, Y = np.meshgrid(x,y)

Funkce meshgrid vytvoří dvourozměrnou síť bodů.

Každý bod má souřadnice

$(x,y)$

Tato mřížka reprezentuje prostor, ve kterém budeme vektorové pole definovat.

Definice vektorového pole

Teď definujeme samotné pole.

U = -Y
V = X

Každý vektor v poli má dvě složky:

$F(x,y) = (U,V)$

V našem případě tedy

$F(x,y) = (-y, x)$

To znamená:

  • vodorovná složka vektoru je (-y)
  • svislá složka je (x)

Jak pole vypadá

Toto pole má zajímavou vlastnost: vektory rotují kolem středu.

Například:

bodvektor
(1,0)(0,1)
(0,1)(-1,0)
(-1,0)(0,-1)

Vektory tedy tvoří rotační pole – podobné například víru v kapalině.

Vykreslení pole

Pole vykreslíme pomocí funkce quiver.

plt.quiver(X,Y,U,V)

Funkce quiver zobrazí vektorové pole jako síť šipek.

Každá šipka:

  • začíná v bodě ((x,y))
  • směřuje podle vektoru ((U,V))

Titulek a zobrazení

Nakonec přidáme název grafu a vykreslíme ho.

plt.title("Vector field")
plt.show()

V předchozím příkladu jsme použili funkci quiver, která zobrazuje vektorové pole jako mřížku šipek. Každá šipka ukazuje směr a velikost vektoru v daném bodě prostoru. Pro pochopení struktury pole je to velmi užitečné, protože vidíme jednotlivé vektory přímo.

Existuje ale ještě jiný způsob vizualizace vektorového pole, který je často ještě intuitivnější. Místo jednotlivých šipek můžeme zobrazit tzv. proudnice (anglicky streamlines). Ty ukazují, jak by se v daném poli pohybovala částice, kdyby se v něm nechala unášet. V Pythonu k tomu slouží funkce streamplot z knihovny Matplotlib. Výsledný obrázek pak připomíná například proudění kapaliny, větru nebo magnetické siločáry. Níže je ukázka kódu a výsledného obrázku.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3,3,100)
y = np.linspace(-3,3,100)

X, Y = np.meshgrid(x,y)

U = -Y
V = X

speed = np.sqrt(U**2 + V**2)

plt.streamplot(X, Y, U, V, color=speed, cmap="viridis")
plt.colorbar(label="Speed")
plt.title("Vector field")
plt.show()

Tohle je první krok.

Ukázali jsme si, že pole je způsob, jak popsat realitu — každému místu v prostoru přiřadíme nějakou informaci.

V dalším článku se posuneme o krok dál.

Podíváme se na to, jak se pole mění v prostoru a jak z něj dostat směr, kterým má smysl se vydat.

Tomu se říká gradient.


Pokud chcete vidět celý obraz a jak to všechno zapadá dohromady, tady je kompletní článek:

Zapomeňte na e-shopy: Python umí modelovat realitu – vektorová pole, tok a Stokesova věta
Jak gradient, divergence, rotace, tok pole a Stokesova věta souvisí s modelováním reality? Intuitivní vysvětlení vektorového počtu doplněné o experimenty a vizualizace v Pythonu.