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

這個(gè)時(shí)候就出現(xiàn)了一個(gè)很神奇的事情:
無(wú)論初始水平是多少,采用這種服藥方式的話,最終藥物水平都會(huì)收斂于2.0這個(gè)值,即所謂平衡點(diǎn)
是這樣的嗎,我們?cè)俣喈?huà)幾條:

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

似乎對(duì)應(yīng)每個(gè)服藥方案都會(huì)有一個(gè)平衡點(diǎn)。而且我們可以看到,對(duì)于每日服藥量±1的變動(dòng)會(huì)引起平衡點(diǎn)±2的變化。
是不是呢,我們?cè)佼?huà)一下不同服藥方案在不同初始濃度下的圖像,得到下面這個(gè)酷炫的圖形:

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