分叉与逻辑斯蒂映射
上节回顾:
logistic方程: { 微分式: N ′ = r ⋅ N ( 1 − N K ) 积分式: N t = K ⋅ b e − r ⋅ t + b \begin{cases}微分式:&N'=r\cdot N(1-\frac{N}{K}) \\积分式:&N_{t}=\frac{K\cdot b}{e^{-r\cdot t}+b}\end{cases} {微分式:积分式:N′=r⋅N(1−KN)Nt=e−r⋅t+bK⋅b
一、系统的概念
系统(System):多元素有序排列、相互关联的功能单位(个人理解)。e.g.生态学系统 vs. 生态系统
系统一般具有三大要素:
{
1
、元素(
E
l
e
m
e
n
t
s
)
2
、关系(
R
e
l
a
t
i
o
n
s
h
i
p
)
3
、功能(
F
u
n
c
t
i
o
n
)
\begin{cases}1、元素(Elements)\\2、关系(Relationship)\\3、功能(Function)\end{cases}
⎩
⎨
⎧1、元素(Elements)2、关系(Relationship)3、功能(Function)
此时的logistic方程
N
′
=
r
⋅
N
(
1
−
N
K
)
N'=r\cdot N(1-\frac{N}{K})
N′=r⋅N(1−KN) 就是一个微分动力系统:
{
左边
=
N
′
=
d
N
d
t
:包含有参数
t
,是时变系统
右边
=
r
⋅
N
(
1
−
N
K
)
:不包含
t
参数,为自治系统
\begin{cases}左边=N'=\frac{dN}{dt}:包含有参数t,是时变系统\\右边=r\cdot N(1-\frac{N}{K}):不包含t参数,为自治系统\end{cases}
{左边=N′=dtdN:包含有参数t,是时变系统右边=r⋅N(1−KN):不包含t参数,为自治系统
对于常微分方程(未知函数是一元函数)的求解,一般分为以下步骤:
1、Find a steady state
即寻求“静止”状态下的函数关系,e.g. logistic方程:
N
′
=
r
⋅
N
(
1
−
N
K
)
N'=r\cdot N(1-\frac{N}{K})
N′=r⋅N(1−KN) 在
N
′
=
0
N'=0
N′=0 时,系统静止,即种群大小没有波动,即:
t
时刻后种群大小的变化:
N
′
=
d
N
d
t
=
r
⋅
N
(
1
−
N
K
)
=
0
t时刻后种群大小的变化:N'=\frac{dN}{dt}=r\cdot N(1-\frac{N}{K})=0
t时刻后种群大小的变化:N′=dtdN=r⋅N(1−KN)=0
2、求解
即求解“静止”状态的函数方程,即:
d
N
d
t
=
r
⋅
N
(
1
−
N
K
)
=
0
\frac{dN}{dt}=r\cdot N(1-\frac{N}{K})=0
dtdN=r⋅N(1−KN)=0
解:
{
N
1
∗
=
0
N
2
∗
=
K
解:\begin{cases}N^{*}_{1}=0\\N^{*}_{2}=K\end{cases}
解:{N1∗=0N2∗=K
在数轴表示为:
3、寻求均衡解
N
′
=
r
⋅
N
(
K
−
N
K
)
N'=r\cdot N(\frac{K-N}{K})
N′=r⋅N(KK−N)
一共有以下几种情况:
{
N
>
K
时,
K
−
N
K
<
0
,
N
↑
N
=
K
时,
K
−
N
K
=
0
,
N
不变
0
<
N
<
K
时,
K
−
N
K
>
0
,
N
↓
N
≤
0
,无现实意义
\begin{cases}N>K时,\frac{K-N}{K}<0,N\uparrow\\N=K时,\frac{K-N}{K}=0,N不变\\0<N<K时,\frac{K-N}{K}>0,N\downarrow\\N\le0,无现实意义\end{cases}
⎩
⎨
⎧N>K时,KK−N<0,N↑N=K时,KK−N=0,N不变0<N<K时,KK−N>0,N↓N≤0,无现实意义
在数轴上表示为:
∵
N
→
K
\because N\rightarrow K
∵N→K
∴
N
2
∗
=
K
是函数的均衡解
\therefore N^{*}_{2}=K是函数的均衡解
∴N2∗=K是函数的均衡解
二、logistic方程二次积分
N
′
′
=
(
r
⋅
N
(
1
−
N
K
)
)
′
=
(
r
⋅
N
−
r
⋅
N
2
K
)
′
=
(
r
⋅
N
)
′
−
(
r
⋅
N
2
K
)
′
=
r
−
2
⋅
N
K
\begin{aligned} N'' &=(r\cdot N(1-\frac{N}{K}))'\\ &=(r\cdot N-\frac{r\cdot N^{2}}{K})'\\ &=(r\cdot N)'-(\frac{r\cdot N^{2}}{K})'\\ &=r-\frac{2\cdot N}{K} \end{aligned}
N′′=(r⋅N(1−KN))′=(r⋅N−Kr⋅N2)′=(r⋅N)′−(Kr⋅N2)′=r−K2⋅N
求解:
令
N
′
′
=
0
得:
令N''=0得:
令N′′=0得:
0
=
r
−
2
r
⋅
N
K
0=r-\frac{2r\cdot N}{K}
0=r−K2r⋅N
解得
N
=
K
2
N=\frac{K}{2}
N=2K,即收获理论
N
′
′
=
r
−
2
r
⋅
N
K
,有几种情况:
N''=r-\frac{2r\cdot N}{K},有几种情况:
N′′=r−K2r⋅N,有几种情况:
{
N
′
′
>
0
时,
N
<
K
2
,
N
′
上升(上凹)
N
′
′
<
0
时,
N
>
K
2
,
N
′
下降(下凹)
N
′
′
=
K
2
时,
N
′
最大,种群增长率最大
\begin{cases} N''>0时,N<\frac{K}{2},N'上升(上凹)\\ N''<0时,N>\frac{K}{2},N'下降(下凹)\\ N''=\frac{K}{2}时,N'最大,种群增长率最大 \end{cases}
⎩
⎨
⎧N′′>0时,N<2K,N′上升(上凹)N′′<0时,N>2K,N′下降(下凹)N′′=2K时,N′最大,种群增长率最大
三、Bifurcation and Logistic Map
1、 N ′ = 4 N − N 3 + C N'=4N-N^{3}+C N′=4N−N3+C
构建函数:
N
′
=
4
N
−
N
3
N'=4N-N^{3}
N′=4N−N3
求解:
Steady state:
N
′
=
0
N'=0
N′=0
方程
4
N
−
N
3
=
0
4N-N^{3}=0
4N−N3=0 解得:
{
N
1
=
−
2
N
2
=
0
N
3
=
2
\begin{cases} N_{1}=-2\\ N_{2}=0\\ N_{3}=2 \end{cases}
⎩
⎨
⎧N1=−2N2=0N3=2
函数关系可视化为:
此时函数
N
′
=
4
N
−
N
3
与
N
轴有三个交点
N
1
、
N
2
、
N
3
。
此时函数N'=4N-N^{3}与N轴有三个交点N_{1}、N_{2}、N_{3}。
此时函数N′=4N−N3与N轴有三个交点N1、N2、N3。
∵
\because
∵
N
∈
(
0
,
2
]
时,
N
′
最大值为
a
N\in(0,2]时,N'最大值为a
N∈(0,2]时,N′最大值为a
∴
\therefore
∴
当
C
=
a
时,函数与
N
轴有两个交点
当C=a时,函数与N轴有两个交点
当C=a时,函数与N轴有两个交点
使用Plotly(python v.3.9)绘制散点图,以探究 a a a 值:
from plotly.graph_objs import Scatter
from plotly import offline
#Three lists made visualization requested.
dNs, Ns, labels = [], [], []
#Make data lists
for N in range(-30,30):
N = N * 0.1
dN = 4 * N - N**3
label = f"({N},{dN})"
Ns.append(N)
dNs.append(dN)
labels.append(label)
#visulization
trace =Scatter(
x = Ns,
y = dNs,
mode = "markers",
marker = dict(color = 'rgba(0, 255, 0, 1)'),
text= labels
)
data = [trace]
layout = dict(title = "N' = 4N - N^3",
xaxis= dict(title= "N"),
yaxis= dict(title= "N'")
)
fig = dict(data = data, layout = layout)
offline.plot(fig,filename='N_dN.html')
从图中可以看出,当
N
≈
1.2
时,
N
′
≈
3.072
,即
a
≈
3.072
N\approx 1.2时,N'\approx 3.072,即a\approx 3.072
N≈1.2时,N′≈3.072,即a≈3.072
为探究函数与
N
轴的交点数的变化,引入参数
C
得新函数:
为探究函数与N轴的交点数的变化,引入参数C得新函数:
为探究函数与N轴的交点数的变化,引入参数C得新函数:
N
′
=
4
N
−
N
3
+
C
N'=4N-N^{3}+C
N′=4N−N3+C
使
C
值逐渐增加,使函数曲线与
N
轴的交点逐渐减少:
使C值逐渐增加,使函数曲线与N轴的交点逐渐减少:
使C值逐渐增加,使函数曲线与N轴的交点逐渐减少:
Python实现:
from plotly.graph_objs import Scatter
from plotly import offline
#Three lists made visualization requested.
Ns, data = [], []
C = 0
#Make Ns
for N in range(-250,250):
N = N * 0.01
Ns.append(N)
#Main loop
while C <= 5:
dNs = []
for N in Ns:
dN = (4 * N - N**3) + C
dNs.append(dN)
#Mark function curve, if C > 3.072
if C > 3.072:
trace =Scatter(
x = Ns,
y = dNs,
mode = "markers",
marker = dict(color = 'rgba(255, 0, 0, 1)'),
)
#Hight the point by green, if C = 0
elif C == 0:
trace =Scatter(
x = Ns,
y = dNs,
mode = "markers",
marker = dict(color = 'rgba(0, 255, 0, 1)')
)
#Make points transparencied, if C isn't 3.072 or 0
else:
trace =Scatter(
x = Ns,
y = dNs,
mode = "markers",
marker = dict(color = 'rgba(0, 0, 255, 0.1)')
)
data.append(trace)
#iteration
C += 0.1512
layout = dict(title = "N' = 4N - N^3 + C",
xaxis= dict(title= "N"),
yaxis= dict(title= "N'")
)
fig = dict(data = data, layout = layout)
offline.plot(fig, filename = "N_dNs.html")
从可视化结果中可以发现,随着C的值增加,交点
N
1
N_{1}
N1 和
N
2
N_{2}
N2 越来越近,当
C
=
a
C=a
C=a 时,
N
1
=
N
2
N_{1}=N_{2}
N1=N2 即两交点合并为一个交点。当
C
>
a
C>a
C>a 时,函数与N轴只余一个交点
N
3
N_{3}
N3 。
2、Bifurcation
现在以
C
C
C 为
x
x
x 轴,
N
N
N 为
y
y
y 轴:
此时
C
=
a
C=a
C=a 时对应的
N
N
N 值就是Critical point,即在此点发生了临界突变(Sudden Transition)。
3、微分原理
以logistic方程为例:
d
N
d
t
=
r
⋅
N
(
1
−
N
K
)
=
lim
Δ
t
→
0
N
t
+
Δ
t
−
N
t
(
t
+
Δ
t
)
−
t
\begin{aligned} \frac{dN}{dt} &=r\cdot N(1-\frac{N}{K})\\ &=\lim\limits_{\Delta t \rightarrow0} \frac{N_{t+\Delta t}-N_{t}}{(t+\Delta t)-t} \end{aligned}
dtdN=r⋅N(1−KN)=Δt→0lim(t+Δt)−tNt+Δt−Nt
表示单位时间 (
Δ
t
\Delta t
Δt,时间增量)内,种群大小
N
N
N 的增量 (
Δ
N
\Delta N
ΔN )的近似值(
d
N
d
t
\frac{dN}{dt}
dtdN),但需要注意,
Δ
N
≠
d
N
d
t
\Delta N\not=\frac{dN}{dt}
ΔN=dtdN,后者只是前者的近似值,且随着
Δ
t
→
0
\Delta t\rightarrow0
Δt→0,二者间的差异也趋近于零。
4、Logistic映射
整理合并,得:
N
t
+
Δ
t
−
N
t
Δ
t
=
r
⋅
N
t
(
1
−
N
t
K
)
\frac{N_{t+\Delta t}-N_{t}}{\Delta t}=r\cdot N_{t}(1-\frac{N_{t}}{K})
ΔtNt+Δt−Nt=r⋅Nt(1−KNt)
令
Δ
t
=
1
\Delta t=1
Δt=1(1表示1单位的时间增量,不是具体时间间隔)得:
N
t
+
1
−
N
t
=
r
⋅
N
t
(
1
−
N
t
K
)
N_{t+1}-N_{t}=r\cdot N_{t}(1-\frac{N_{t}}{K})
Nt+1−Nt=r⋅Nt(1−KNt)
整理等式:
N
t
+
1
=
N
t
+
r
⋅
N
t
(
1
−
N
t
K
)
=
N
t
[
1
+
r
(
1
−
N
t
K
)
]
=
N
t
(
r
+
1
−
r
⋅
N
t
K
)
=
(
r
+
1
)
N
t
⋅
[
1
−
r
⋅
N
t
(
r
+
1
)
K
]
\begin{aligned} N_{t+1}&=N_{t}+r\cdot N_{t}(1-\frac{N_{t}}{K})\\ &=N_{t}[1+r(1-\frac{N_{t}}{K})]\\&=N_{t}(r+1-\frac{r\cdot N_{t}}{K})\\ &=(r+1) N_{t}\cdot [1-\frac{r\cdot Nt}{(r+1)K}] \end{aligned}
Nt+1=Nt+r⋅Nt(1−KNt)=Nt[1+r(1−KNt)]=Nt(r+1−Kr⋅Nt)=(r+1)Nt⋅[1−(r+1)Kr⋅Nt]
设:
x
=
r
⋅
N
(
r
+
1
)
K
x
t
=
r
⋅
N
t
(
r
+
1
)
K
x
t
+
1
=
r
⋅
N
t
+
1
(
r
+
1
)
K
\begin{aligned} &x=\frac{r\cdot N}{(r+1)K}\\ &x_{t}=\frac{r\cdot N_{t}}{(r+1)K}\\ &x_{t+1}=\frac{r\cdot N_{t+1}}{(r+1)K} \end{aligned}
x=(r+1)Kr⋅Nxt=(r+1)Kr⋅Ntxt+1=(r+1)Kr⋅Nt+1
将
x
,
x
t
,
x
t
+
1
x,x_{t},x{t+1}
x,xt,xt+1带入得:
N
t
+
1
=
(
r
+
1
)
N
t
⋅
[
1
−
r
⋅
N
t
(
r
+
1
)
K
]
=
(
r
+
1
)
N
t
⋅
(
1
−
x
t
)
x
t
+
1
⋅
(
r
+
1
)
K
r
=
x
t
⋅
(
r
+
1
)
2
⋅
K
⋅
(
1
−
x
t
)
r
x
t
+
1
=
x
t
⋅
(
r
+
1
)
⋅
(
1
−
x
t
)
\begin{aligned} N_{t+1} &=(r+1)N_{t}\cdot [1-\frac{r\cdot N_{t}}{(r+1)K}]\\ &=(r+1)N_{t}\cdot (1-x_{t})\\\frac{x_{t+1}\cdot (r+1)K}{r} &=\frac{x_{t}\cdot (r+1)^2\cdot K\cdot (1-x_{t})}{r}\\x_{t+1} &=x_{t}\cdot (r+1)\cdot (1-x_{t}) \end{aligned}
Nt+1rxt+1⋅(r+1)Kxt+1=(r+1)Nt⋅[1−(r+1)Kr⋅Nt]=(r+1)Nt⋅(1−xt)=rxt⋅(r+1)2⋅K⋅(1−xt)=xt⋅(r+1)⋅(1−xt)
设
μ
=
r
+
1
\mu=r+1
μ=r+1 得:
x
t
+
1
=
x
t
⋅
μ
⋅
(
1
−
x
t
)
x_{t+1}=x_{t}\cdot\mu\cdot (1-x_{t})
xt+1=xt⋅μ⋅(1−xt)
∵
\because
∵
N
>
0
,
r
∈
(
0
,
1
]
,
K
>
0
,
K
>
N
N>0,r\in(0,1],K>0,K>N
N>0,r∈(0,1],K>0,K>N
∴
\therefore
∴
x
t
∈
(
0
,
1
]
,
μ
∈
(
0
,
4
)
x_{t}\in(0,1],\mu\in(0,4)
xt∈(0,1],μ∈(0,4)
5、映射可视化
据上述函数关系,利用python实现函数的可视化:
from tqdm import tqdm
import numpy as np
from plotly.graph_objs import Scatter
from plotly import offline
def LogisticMap():
mu = np.arange(0, 4, 0.0001)
x = 0.2 #initial value of x
iters = 1000 # iterations that not be visualized
last = 100 # iterations will be visualized
#iteration
for i in tqdm(range(iters+last)):
x = mu * x * (1 - x)
if i >= iters:
#visualization
trace =Scatter(
x = mu,
y = x,
mode = "markers",
marker = dict(color = 'rgba(125, 255, 125, 1)',
size = 2)
)
data = [trace]
layout = dict(title = "Logistic Map",
xaxis= dict(title = "mu"),
yaxis= dict(title = "x")
)
fig = dict(data = data, layout = layout)
offline.plot(fig,filename = 'Logisticmap.html')
LogisticMap()
plotly可能存在兼容性的问题(更有可能是我使用不当),图中的某些点没有显示。
利用另一常用的模块matplotlib进行可视化:
模块一:
from tqdm import tqdm
import matplotlib.pyplot as plt
import numpy as np
def logisticmap(mu = 4):
mu = np.arange(2, mu, 0.0001)
x = 0.2
iters = 1000
last = 100
for i in tqdm(range(iters+last)):
x = mu * x * (1 - x)
if i >= iters:
plt.plot(mu, x, ',k', alpha=0.25)
plt.show()
可视化:
from image import logisticmap
logisticmap(mu = 4)