這一期講動力系統(tǒng)
在準(zhǔn)備這一期教程的過程中我找到了一個挺有意思的課件,推薦給大家:
動力系統(tǒng)建模-唐云(清華大學(xué)教授)
里面講到了一個很吸引目光的名詞:
蝴蝶效應(yīng)
大家應(yīng)該都知道蝴蝶效應(yīng)是個什么玩意兒,但是蝴蝶效應(yīng)是怎么產(chǎn)生的呢?
這次先不講蝴蝶效應(yīng),我們先就這個動力系統(tǒng)來講一講,算是個引子:
什么叫動力系統(tǒng)呢,先說最簡單的動力系統(tǒng),講起來也是個很熟的公式:
an+1 = r × an + b(其中r≠1)
這不還是遞推公式嗎?
和上期的差分方程那個遞推公式不同的是,這個動力系統(tǒng)有個被稱為平衡點的概念。
廢話少說,先看一個最簡單的實例:
實例1--血液中藥物水平試驗
有一個醫(yī)生給病人開藥,什么藥我不記得了,也不重要,就叫A吧,要求病人血液中的鈣離子濃度穩(wěn)定在一個有效的值,求如何開藥?
前提:
A在病人體內(nèi)原本就有。
不服藥的情況下,每一周的A濃度水平是前一周的一半。
列式:
an+1 = 0.5 × an + b
這里為了方便畫圖我們先假設(shè)b = 1,先畫個圖看看。
那么式子變成:an+1 = 0.5 × an + 1
接下來我們分別取
a0 = 1
a0 = 2
a0 = 3
畫圖
python代碼如下:
# 先畫a<sub>0</sub> = 1:
import matplotlib.pyplot as plt
def drawCurve(Reagentperday,CurrentLevel):
RegentLevel = []
for i in range(15):
RegentLevel.append(CurrentLevel)
CurrentLevel = CurrentLevel * 0.5 + Reagentperday
Time = [i for i in range(15)]
print(Time,RegentLevel)
plt.plot(Time, RegentLevel)
for i in range(1,4):
drawCurve(1,i)
畫出的圖形是這樣的:

這個時候就出現(xiàn)了一個很神奇的事情:
無論初始水平是多少,采用這種服藥方式的話,最終藥物水平都會收斂于2.0這個值,即所謂平衡點
是這樣的嗎,我們再多畫幾條:

看來確實有這樣的規(guī)律。
那么變一下每天服藥的數(shù)量之后呢,我們將每天的服藥量作為變量來畫一下:

似乎對應(yīng)每個服藥方案都會有一個平衡點。而且我們可以看到,對于每日服藥量±1的變動會引起平衡點±2的變化。
是不是呢,我們再畫一下不同服藥方案在不同初始濃度下的圖像,得到下面這個酷炫的圖形:

這個地方可能是我顯卡有問題,截出來的圖不是很清晰
究竟是為什么呢?
下一期我們講講為什么,主要是依據(jù)文章開頭貼出來的動力系統(tǒng)建模-唐云(清華大學(xué)教授)的ppt來用Python代碼講解。
就這樣結(jié)束了嗎??
熟悉高數(shù)的人肯定大呼上當(dāng)。
因為
an+1 = r × an + b
這個式子可以寫成:
an+1 + b/(r-1) = r × an + b + b/(r-1)
an+1 + b/(r-1) = r × [an +b/(r-1)]
可以判定[an + b/(r-1)]是一個公比為r的等比數(shù)列,當(dāng)r<1,且首項≠0時,必有a收斂于[a0+b/(r-1)]/(1-r)
動力系統(tǒng)就這么簡單嗎?
這只是一次的動力系統(tǒng),那么二次的呢……