Řešení modelu s různými parametry

25. Řešení modelu s různými parametry#

Lambda funkce využíváme s výhodou, pokud chceme řešit model pro různé hodnoty parametrů. Pokud má funkce mnoho parametrů a chceme je nechat na přednastavených hodnotách, můžeme v řešiči použít lambda funkce. Následující kód řeší model

\[\frac{\mathrm dN}{\mathrm dt}=rN\left(1-\frac NK\right)\]
růstu v prostředí s omezenou nosnou kapacitou pro čtyři různé hodnoty parametru r. Výměna hodnot parametru je zajišťována v cyklu for a pro předávání hodnoty parametru je použita lambda funkce.

Modifikujte kód tak, aby hodnoty ze seznamu seznam byly dosazovány za parametr K. Abychom měli celou dynamiku, zajistěte ještě, aby se řešení hledalo na intervalu \([0,10]\) a ne původně nastavených \([0,5]\). Nic jiného, než řádky s definicí intervalu, cyklováním proměnné a dosazením proměnné do funkce neměňte. Nemusíte rozumět celému kódu řádek po řádku, abyste byli schopni identifikovat místa, která je nutné modifikovat.

Výstup by se měl změnit následovně

Popis

Obrázek

Původní obrázek

Nový obrázek

Pokud bychom lambda funkci nepoužili, je možné volitelné parametry funkce v příkazu solve_ivp zadat i jiným způsobem, volbou args. Nevýhoda takového postupu je, že v takovém případě musíte zadat všechny volitelné parametry a navíc v pořadí, ve kterém jsou uvedeny v definici funkce. Při použití konstrukce s lambda funkcí taková omezení nemáme.

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

pocatecni_podminka = [0.1]
meze = [0,5]
N = 100
seznam = [1,2,3,4]

t = np.linspace(*meze,N)

def rovnice(t, x, r=1, K=1):
    return r*x*(1-x/K)

reseni = np.zeros((N,len(seznam)))
for i,r in enumerate(seznam):
    reseni[:,i] = solve_ivp(
                       lambda t,x:rovnice(t,x,r=r),
                       meze,
                       pocatecni_podminka,
                       t_eval=t
                       ).y

plt.plot(t,reseni)
plt.legend(seznam, title="Hodnota parametru")