19_案例學(xué)習(xí)

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章中,我們用了maxidxmax函數(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ù)組。linrangelinspace是很相似的:區(qū)別在于linrange允許指定值之間的間距,并計(jì)算值的數(shù)量;linspace允許指定值的數(shù)量,并計(jì)算它們之間的間距。

下面是一個(gè)使用linrangerun_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 由以下微分方程控制:
\frac{dI}{dt}=-kI(t)+\gamma[G(t)-G_T]t

其中:

  • k是獨(dú)立于血糖控制胰島素消失率的參數(shù)。
  • G(t)是時(shí)間 t 時(shí)測得的血糖濃度。
  • G_T是是葡萄糖閾值;當(dāng)血糖高于這個(gè)水平時(shí),會引發(fā)血胰島素濃度的增加。
  • \gamma是血糖濃度高于(或低于)G_T時(shí)控制血胰島素濃度升高(或降低)速率的參數(shù)。

初始狀態(tài)是I(0)=I_0。在葡萄糖最小模型中,我們將初始條件作為一個(gè)參數(shù),我們將選擇它來擬合數(shù)據(jù)。

該模型的參數(shù)可以用來估計(jì)\Phi_1\Phi_2, 這兩個(gè)值分別描述第一階段和第二階段胰腺反應(yīng)對葡萄糖的敏感性。它們與以下參數(shù)相關(guān):
\Phi_1=\frac{I_{max}-I_b}{k(G_0-G_b)}\\ \Phi_2=\gamma\times10^4
其中,I_{max}是測得的最大胰島素水平,I_bG_b分別是胰島素和葡萄糖的基礎(chǔ)水平。

在這本書的存儲庫中,你可以找到筆記本insulin.ipynb,其中包含本案例研究的啟動程序代碼。用它來實(shí)現(xiàn)胰島素模型,找到擬合數(shù)據(jù)最好的參數(shù),并估計(jì)這些值。

19.3 低通濾波器

下面的電路圖[1]展示了由一個(gè)電阻和一個(gè)電容構(gòu)成的低通濾波器。

19_1.png

圖19.1

“濾波器”是將一個(gè)信號V_{in}作為輸入,并產(chǎn)生一個(gè)信號V_{out}作為輸出的電路。在這種情況下,”信號“是隨時(shí)間變化的電壓值。

如果一個(gè)濾波器允許低頻信號保持不變地從V_{in}V_{out}通過,而降低高頻信號的振幅,那么它就是“低通”的。

應(yīng)用電路分析定律,我們可以導(dǎo)出一個(gè)描述該系統(tǒng)現(xiàn)象的微分方程。通過求解微分方程,我們可以預(yù)測該電路對任何輸入信號的影響。

假設(shè)我們給定某個(gè)特定時(shí)刻的V_{in}V_{out}。根據(jù)歐姆定律,此定律是電阻特性的一個(gè)簡單模型,通過電阻的瞬時(shí)電流為:
I_R=(V_{in}-V_{out})/R
其中R是以歐姆(\Omega)為單位的電阻值。

假設(shè)沒有電流通過電路的輸出,霍爾基夫電流定律表明通過電容器的電流為:
I_C=I_R
根據(jù)電容器特性的一個(gè)簡單模型,通過電容器的電流會引起電容器上電壓的變化:
I_C=C\frac{dV_{out}}{dt}
其中C是以法拉(F)為單位的電容值。合并這些等式可以得到V_{out}的微分方程:
\frac{dV_{out}}{dt}=\frac{V_{in}-V_{out}}{RC}

在這本書的存儲庫中,你可以找到筆記本filter.ipynb,其中包含本案例研究的啟動程序代碼。按照以下說明模擬低通濾波器,輸入信號如下所示:
V_{in}(t)=Acos(2\pi ft)

其中A是輸入信號的的振幅,比如5 V,f是信號的頻率,單位為Hz。

在這本書的存儲庫中,你可以找到筆記本filter.ipynb,其中包含本案例研究的啟動程序代碼。閱讀筆記本,運(yùn)行代碼,并做練習(xí)。

19.4 墻的熱力學(xué)行為

本案例研究是基于Gori等人的一篇論文[2],該論文對磚墻的熱力學(xué)行為進(jìn)行了建模,目的是了解“建筑物的預(yù)期能量使用與其測量的能量使用之間的性能差距”。

下圖展示了墻的場景及其模型:

19_0.png

圖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)載。


  1. 來自http://modsimpy.com/divider ?

  2. 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é),這使得本案例研究成為可能。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容