lpnguyen commited on
Commit
530f1e3
1 Parent(s): 8ce35c5

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -0
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"))