Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import numpy as np
|
3 |
+
from tools import integrate
|
4 |
+
from dynamical_system import exp_discrete, exp_continuous
|
5 |
+
from scipy.integrate import odeint
|
6 |
+
import pandas as pd
|
7 |
+
import altair as alt
|
8 |
+
|
9 |
+
st.title("Discrete vs continuous population")
|
10 |
+
|
11 |
+
st.header("Exponential growth population")
|
12 |
+
|
13 |
+
st.markdown(
|
14 |
+
r"""
|
15 |
+
Discrete time model
|
16 |
+
|
17 |
+
$N_{t+1} = N_t + R N_t$
|
18 |
+
|
19 |
+
Continuous time model
|
20 |
+
|
21 |
+
$\frac{dN}{dt} = r N$
|
22 |
+
|
23 |
+
|
24 |
+
"""
|
25 |
+
)
|
26 |
+
|
27 |
+
st.write("")
|
28 |
+
|
29 |
+
init = 0.2 # initial population density
|
30 |
+
time_series = np.arange(0, 101, 1)
|
31 |
+
|
32 |
+
r = st.sidebar.number_input("r", 1e-3, 0.2, value=0.05, step=1e-4, format="%.4f")
|
33 |
+
R = st.sidebar.number_input("R", 1e-3, 0.2, value=0.05, step=1e-4, format="%.4f")
|
34 |
+
st.sidebar.write(
|
35 |
+
r"The two models give similar results when $R = e^r - 1 = $", np.exp(r) - 1
|
36 |
+
)
|
37 |
+
|
38 |
+
# simulation for continuous time model
|
39 |
+
pop_continuous = odeint(exp_continuous, init, time_series, args=(r,), tfirst=True)
|
40 |
+
|
41 |
+
# simulation for discrete time model
|
42 |
+
t_discrete, pop_discrete = integrate(exp_discrete, init, time_series[-1], R)
|
43 |
+
|
44 |
+
df = pd.DataFrame(
|
45 |
+
dict(
|
46 |
+
time=t_discrete, pop_discrete=pop_discrete, pop_continuous=pop_continuous[:, 0]
|
47 |
+
)
|
48 |
+
)
|
49 |
+
|
50 |
+
|
51 |
+
def make_plot(scale, title):
|
52 |
+
tt = alt.TitleParams(title, anchor="middle")
|
53 |
+
l1 = (
|
54 |
+
alt.Chart(df, title=tt)
|
55 |
+
.mark_line()
|
56 |
+
.encode(
|
57 |
+
x="time",
|
58 |
+
y=alt.Y(
|
59 |
+
"pop_discrete",
|
60 |
+
axis=alt.Axis(title="Population density"),
|
61 |
+
scale=alt.Scale(type=scale),
|
62 |
+
),
|
63 |
+
color=alt.value("red"),
|
64 |
+
)
|
65 |
+
)
|
66 |
+
l2 = (
|
67 |
+
alt.Chart(df)
|
68 |
+
.mark_line()
|
69 |
+
.encode(x="time", y="pop_continuous", color=alt.value("blue"))
|
70 |
+
)
|
71 |
+
return l1 + l2
|
72 |
+
|
73 |
+
|
74 |
+
col1, col2 = st.columns(2, gap="large")
|
75 |
+
|
76 |
+
with col1:
|
77 |
+
st.altair_chart(make_plot("linear", "Normal scale"))
|
78 |
+
with col2:
|
79 |
+
st.altair_chart(make_plot("log", "Log scale"))
|