1D nelineární konvekce

V druhém kroku upravím původní kód tak, aby zahrnoval rovnici pro nelineární konvekci. Nelineární konvekce je podobná té lineární, liší se pouze v tom, že se nepohybuje konstantní rychlostí c, ale rychlostí u:

$$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = 0 $$

Okrajové podmínky nastavím např. takto:

nx=200       #number of grid points
dx=4/(nx-1) #distance between adjacent points
dt=0.008 #time of each timestep
nt=1 #number of timesteps

Do výpočtu použijeme původní rovnici, pouze namísto konstantní rychlosti c, která násobí druhý výraz, dosadíme rychlost u. Nyní je náš druhý výraz nelineární. Použijeme stejnou diskretizaci – forward difference FD v čase a backward difference BD v prostoru:

$$ \frac{u_i^{n+1}-u_i^n}{\Delta t} + u_i^n \frac{u_i^n-u_{i-1}^n}{\Delta x} = 0 $$

Z této rovnice opět vyjádříme jedinou neznámou, čímž vypočteme následující krok v čase:

$$ u_i^{n+1} = u_i^n – u_i^n \frac{\Delta t}{\Delta x} (u_i^n – u_{i-1}^n) $$

Tuto rovnici opět implementujeme v kód jako iteraci časových kroků:

    for i in range(1,nx):
u[i] = un[i] - un[i] * (dt/dx) * (un[i] - un[i-1])

Pomocí knihovny Matplotlib opět získáme animaci chování naší funkce: