19 案例學(xué)習(xí)
本章回顧到目前為止我們看到的計(jì)算模式,并介紹可以應(yīng)用它們的練習(xí)。
19.1 計(jì)算工具
在第11章我們看到了一種更新函數(shù)(update function),它使用多個(gè)賦值來解壓一個(gè)State對象,并將狀態(tài)變量賦值給局部變量。
def update_func(state, t, system):
s, i, r = state
infected = system.beta * i * s
recovered = system.gamma * i
s -= infected
i += infected - recovered
r += recovered
return State(S=s, I=i, R=r)
在run_simulation中,我們再次使用多個(gè)賦值將狀態(tài)變量賦值給TimeFrame中的一行:
def run_simulation(system, update_func):
frame = TimeFrame(columns=system.init.index)
frame.row[system.t_0] = system.init
for t in linrange(system.t_0, system.t_end):
frame.row[t+1] = update_func(frame.row[t], system)
return frame
在第12章中,我們用了max和idxmax函數(shù)來計(jì)算度量指標(biāo):
largest_value = S.max()
time_of_largest_value = S.idxmax()
然后我們看到了logistic函數(shù),是一種用來模擬變量之間關(guān)系的通用函數(shù),比如作為支出函數(shù)的干預(yù)有效性。
在第13章中,我們用SweepFrame對象來掃描兩個(gè)參數(shù):
def sweep_parameters(beta_array, gamma_array):
frame = SweepFrame(columns=gamma_array)
for gamma in gamma_array:
frame[gamma] = sweep_beta(beta_array, gamma)
return frame
然后我們用contour生成一個(gè)二維掃描的等高線圖。
在第15章中,我們用linrange來創(chuàng)建一個(gè)等間距值的數(shù)組。linrange和linspace是很相似的:區(qū)別在于linrange允許指定值之間的間距,并計(jì)算值的數(shù)量;linspace允許指定值的數(shù)量,并計(jì)算它們之間的間距。
下面是一個(gè)使用linrange的run_simulation版本:
def run_simulation(system, update_func):
init = system.init
t_0, t_end, dt = system.t_0, system.t_end, system.dt
frame = TimeFrame(columns=init.index)
frame.row[t_0] = init
ts = linrange(t_0, t_end, dt)
for t in ts:
frame.row[t+dt] = update_func(frame.row[t], t, system)
return frame
在第16章中,我們用root_bisect來求生成一個(gè)特定結(jié)果的參數(shù)的值,首先定義一個(gè)誤差函數(shù)(error function):
system = make_system(T_init=90, r=r, volume=300, t_end=30)
results = run_simulation(system, update_func)
T_final = get_last_value(results.T)
return T_final - 70
然后將返回的值傳遞給root_bisect并給定初始區(qū)間,如下所示:
res = root_bisect(error_func1, [0.01, 0.02])
r_coffee = res.root
在第17章中,我們用了interpolate,返回的結(jié)果是一個(gè)函數(shù):
I = interpolate(data.insulin)
我們可以像其他函數(shù)一樣調(diào)用I,將單個(gè)值或NumPy數(shù)組作為傳遞的參數(shù):
I(18)
ts = linrange(t_0, t_end)
I(ts)
在第18章中,我們用了Params對象,它是參數(shù)的集合。
params = Params(G0 = 290,
k1 = 0.03,
k2 = 0.02,
k3 = 1e-05)
第18章還介紹了run_ode_solver,用來計(jì)算微分方程的數(shù)值解。
run_ode_solver使用一個(gè)斜率函數(shù)(slope function),類似于更新函數(shù):
G, X = state
k1, k2, k3 = system.k1, system.k2, system.k3
I, Ib, Gb = system.I, system.Ib, system.Gb
dGdt = -k1 * (G - Gb) - X*G
dXdt = k3 * (I(t) - Ib) - k2 * X
return dGdt, dXdt
然后我們這樣調(diào)用它:
results, details = run_ode_solver(system, slope_func)
本章的其余部分將介紹可以用來練習(xí)這些工具的實(shí)例研究。
19.2 胰島素最小模型
除了第17章的葡萄糖最小模型外,Berman等人還開發(fā)了胰島素最小模型,在此模型中胰島素的濃度 I 由以下微分方程控制:
其中:
-
是獨(dú)立于血糖控制胰島素消失率的參數(shù)。
-
是時(shí)間 t 時(shí)測得的血糖濃度。
-
是是葡萄糖閾值;當(dāng)血糖高于這個(gè)水平時(shí),會引發(fā)血胰島素濃度的增加。
-
是血糖濃度高于(或低于)
時(shí)控制血胰島素濃度升高(或降低)速率的參數(shù)。
初始狀態(tài)是。在葡萄糖最小模型中,我們將初始條件作為一個(gè)參數(shù),我們將選擇它來擬合數(shù)據(jù)。
該模型的參數(shù)可以用來估計(jì)和
, 這兩個(gè)值分別描述第一階段和第二階段胰腺反應(yīng)對葡萄糖的敏感性。它們與以下參數(shù)相關(guān):
其中,是測得的最大胰島素水平,
和
分別是胰島素和葡萄糖的基礎(chǔ)水平。
在這本書的存儲庫中,你可以找到筆記本insulin.ipynb,其中包含本案例研究的啟動程序代碼。用它來實(shí)現(xiàn)胰島素模型,找到擬合數(shù)據(jù)最好的參數(shù),并估計(jì)這些值。
19.3 低通濾波器
下面的電路圖[1]展示了由一個(gè)電阻和一個(gè)電容構(gòu)成的低通濾波器。

圖19.1
“濾波器”是將一個(gè)信號作為輸入,并產(chǎn)生一個(gè)信號
作為輸出的電路。在這種情況下,”信號“是隨時(shí)間變化的電壓值。
如果一個(gè)濾波器允許低頻信號保持不變地從到
通過,而降低高頻信號的振幅,那么它就是“低通”的。
應(yīng)用電路分析定律,我們可以導(dǎo)出一個(gè)描述該系統(tǒng)現(xiàn)象的微分方程。通過求解微分方程,我們可以預(yù)測該電路對任何輸入信號的影響。
假設(shè)我們給定某個(gè)特定時(shí)刻的和
。根據(jù)歐姆定律,此定律是電阻特性的一個(gè)簡單模型,通過電阻的瞬時(shí)電流為:
其中是以歐姆(
)為單位的電阻值。
假設(shè)沒有電流通過電路的輸出,霍爾基夫電流定律表明通過電容器的電流為:
根據(jù)電容器特性的一個(gè)簡單模型,通過電容器的電流會引起電容器上電壓的變化:
其中是以法拉(
)為單位的電容值。合并這些等式可以得到
的微分方程:
在這本書的存儲庫中,你可以找到筆記本filter.ipynb,其中包含本案例研究的啟動程序代碼。按照以下說明模擬低通濾波器,輸入信號如下所示:
其中A是輸入信號的的振幅,比如5 V,f是信號的頻率,單位為Hz。
在這本書的存儲庫中,你可以找到筆記本filter.ipynb,其中包含本案例研究的啟動程序代碼。閱讀筆記本,運(yùn)行代碼,并做練習(xí)。
19.4 墻的熱力學(xué)行為
本案例研究是基于Gori等人的一篇論文[2],該論文對磚墻的熱力學(xué)行為進(jìn)行了建模,目的是了解“建筑物的預(yù)期能量使用與其測量的能量使用之間的性能差距”。
下圖展示了墻的場景及其模型:

圖19.2
在墻的內(nèi)外表面,他們測量了三天內(nèi)的溫度和熱通量。將兩個(gè)蓄熱體連接到表面,并通過熱敏電阻相互連接,以此來模擬墻模型。
該論文的主要方法是用貝葉斯方法推導(dǎo)系統(tǒng)的參數(shù)(兩個(gè)蓄熱體和三個(gè)熱敏電阻)。
主要結(jié)果是兩個(gè)模型的比較:一個(gè)模型有兩個(gè)蓄熱體,另外一個(gè)更簡單的模型則只有一個(gè)蓄熱體。他們發(fā)現(xiàn)雙蓄熱體的模型能更好地持續(xù)性地再生測量的熱通量。
對于此案例研究,我們將實(shí)現(xiàn)他們的模型,并用論文中估計(jì)的參數(shù)運(yùn)行它,然后使用fit_leastsq來看看我們是否能找到產(chǎn)生較低誤差的參數(shù)。
在這本書的存儲庫中,你可以找到筆記本wall.ipynb,其中有本案例研究的代碼和結(jié)果。
本書的中文翻譯由南開大學(xué)醫(yī)學(xué)院智能醫(yī)學(xué)工程專業(yè)2018級、2019級的師生完成,方便后續(xù)學(xué)生學(xué)習(xí)《Python仿真建?!氛n程。翻譯人員(排名不分前后):薛淏源、金鈺、張雯、張瑩睿、趙子雨、李翀、慕振墺、許靖云、李文碩、尹瀛寰、沈紀(jì)辰、迪力木拉、樊旭波、商嘉文、趙旭、連煦、楊永新、樊一諾、劉志鑫、彭子豪、馬碧婷、吳曉玲、常智星、陳俊帆、高勝寒、韓志恒、劉天翔、張藝瀟、劉暢。
整理校訂由劉暢完成,如果您發(fā)現(xiàn)有翻譯不當(dāng)或者錯(cuò)誤,請郵件聯(lián)系changliu@nankai.edu.cn。
本書中文版不用于商業(yè)用途,供大家自由使用。
未經(jīng)允許,請勿轉(zhuǎn)載。
-
Gori, Marincioni, Biddulph, Elwell, “Inferring the thermal resistance and effective ther-mal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces”, Energy and Buildings, Volume 135, pages 398-409, http://modsimpy.com/wall2 . 作者將其論文置于知識共享(Creative Commoms)許可下,并在http://modsimpy.com/wall 上提供了他們的數(shù)據(jù),我感謝他們致力于開放、可復(fù)制的科學(xué),這使得本案例研究成為可能。 ?