Změna hodnoty proměnné v programu

7. Změna hodnoty proměnné v programu#

Častou úlohou je modifikovat existující kód. Pokud jsou v něm proměnné pojmenovány tak, aby bylo zřetelné, co která proměnná obsahuje, je snadné kód přizpůsobit nové situaci.

Přednastavený kód modeluje dynamiku druhového bohatství na ostrově. Vychází z modelu z literatury a pro různé hodnoty parametrů modeluje vývoj ekosystému. V modelu je nastaven vývoj z nulové počáteční podmínky. Identifikujte příslušnou část programu, kde se počáteční podmínka nastavuje, a změňte tak, aby počáteční podmínka definující výchozí stav byla rovna pěti.

Stačí modifikovat jeden jediný řádek, nic jiného neměňte. Ani nemusíte mít ambice celému kódu rozumět. Jenom se snažte identifikovat místo, kde se počáteční podmínka nastavuje na nulu a přenastavte ji na pětku.

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

Popis

Obrázek

Původní obrázek

Nový obrázek

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


### Příprava funkcí a parametrů
pocatecni_podminka = 0  # počáteční podmínka
meze = [0,15]  # interval, na kterém hledáme řešení
n = 100 # počet dělících bodů
parametry = [0.25,0.5,1,2] # seznam parametrů


def model(t, N, a=1, b=8, beta=0.2, D=0.5, k=1.3, S=20):
    """
    Funkce z pravé strany modelu dynamické rovnováhy počtu druhů na ostrovech, 
    podle McArthura a Wilsona. 
    
    Vstup:
    -----
    Povinnými parametry jsou čas a počet druhů, volitelnými vzdálenost 
    D od pevniny, rozloha ostrova S, další parametry modelu a konstanty 
    úměrnosti. Přednastavené hodnoty jsou pouze ilustrační, závisí na volbě
    jednotek a konkrétním použití.
    
    Výstup:
    ------
    Hodnota funkce.
    """
    kolonizace = b/(D*(N+beta))
    vymirani = a*N**k/S 
    return  kolonizace - vymirani 

### Řešení modelu
t=np.linspace(*meze, n)  # definiční obor, v těchto bodech budeme hledat řešení
df = pd.DataFrame()      # tabulka pro výstup
df["t"] = t              # sloupec s časem

for parametr in parametry:
    reseni = solve_ivp(
                       lambda t,x:model(t,x,D=parametr),
                       meze,
                       [pocatecni_podminka],
                       t_eval=t
                       )
    df[parametr] = reseni.y.T # další sloupec tabulky
    # lambda funkce viz https://www.w3schools.com/python/python_lambda.asp
    # (dočasná nepojmenovaná funkce)

### Vizualizace řešení
ax = df.plot(x="t")
ax.set(
    ylim = (0,None),
    title = "Řešení diferenciální rovnice",
    xlabel=r"$t$",
    ylabel=r"$x$",
)
plt.legend(title="Hodnoty parametru")