Kreslení funkcí pro pokročilé

Kreslení funkcí pro pokročilé#

Jednoduché úkoly je vhodné řešit jednoduše a nejjednodušší je data kreslit do grafu rovnou po výpočtu. Ve složitějších modelech se však data počítají dlouho a je proto nejlepší je nejprve vypočítat a potom vykreslit. K ukládání se hodí tabulky. Snadné je použití knihovny Pandas.

Je dobré nejprve zavolat knihovny a nastavit proměnné, sestavit tabulku, vykreslit grafy a poté dodělat kosmetické úpravy. To je v jednotlivých políčkách. Na konci práce bude asi vhodné poslední čtyři políčka spojit. Zkontrolujte, že jste v příkazovém modu (needitujete políčko, nalevo je modrá čára a ne zelená), označte spojované buňky (shift plus šipky) a spojte (shift + M). Případně neznačujte a shift+M připojí následující buňku. Stejnou práci odvede Menu -> Edit -> Merge Cell Bellow).

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
N = 500
meze = [0,1]
lov = [0,0.1,0.2,0.3]
x = np.linspace(*meze,N)
def logisticky_rust(x,h=0):
    """
    Funkce definuje pravou stranu logisticke rovnice s pridanym lovem konstantni intenzity.
    """
    r = 1
    K = 1
    return(x*r*(1-x/K) - h)
# První metoda, výpočet dat a poté vložení do tabulky
data = [logisticky_rust(x,h=h) for h in lov]
df = pd.DataFrame(data).T
df.columns = lov
df.index = x

# Druhá metoda, skládání tabulky po sloupcích
# df = pd.DataFrame()
# df.index = x
# for h in lov:
#     df[h] = logisticky_rust(x,h=h)

# Varianta obou, data vypočteme po sloupcích a potom sestavíme tabulku
#
# data = np.full([len(x),len(lov)],np.nan)
# for i,h in enumerate(lov):
#     data[:,i] = logisticky_rust(x,h=h)
# df = pd.DataFrame(data, columns=lov)
# df.index = x

# Dalsi varianta vyuziva datovy typ dictionary, podle nej se nastavi automaticky jmena sloupcu
# data = {h: logisticky_rust(x,h=h) for h in lov}
# df = pd.DataFrame(data)
# df.index = x

df
0.0 0.1 0.2 0.3
0.000000 0.000000 -0.100000 -0.200000 -0.300000
0.002004 0.002000 -0.098000 -0.198000 -0.298000
0.004008 0.003992 -0.096008 -0.196008 -0.296008
0.006012 0.005976 -0.094024 -0.194024 -0.294024
0.008016 0.007952 -0.092048 -0.192048 -0.292048
... ... ... ... ...
0.991984 0.007952 -0.092048 -0.192048 -0.292048
0.993988 0.005976 -0.094024 -0.194024 -0.294024
0.995992 0.003992 -0.096008 -0.196008 -0.296008
0.997996 0.002000 -0.098000 -0.198000 -0.298000
1.000000 0.000000 -0.100000 -0.200000 -0.300000

500 rows × 4 columns

fig, ax = plt.subplots()
df.plot(ax=ax)
<Axes: >
../_images/4ab6fc3646d80a25e8ca1d519fbe049b93cee97fda536c53890e33f606242adc.png
ax.legend(lov, title="Intenzita lovu")
ax.set(title="Vliv lovu na logistický růst", 
      xlabel="velikost populace",
      ylabel="rychlost růstu", 
      ylim=(0,None))
ax.grid()
fig
../_images/4c1d01c1e89086b2bcddf72de0f08d5a4d7e1cbf86f526b13b1a60d73f755e9d.png