20_拋物體

20 拋物體

到目前為止,我們使用的微分方程是一階的,這意味著它們只涉及一階導(dǎo)數(shù)引几。在本章中,我們將注意力轉(zhuǎn)向二階常微分方程挽铁,它可能涉及一階和二階導(dǎo)數(shù)伟桅。

我們將重新訪問第1章中的“自由落體的硬幣”示例,并使用run_ode_solver分別在考慮和不考慮空氣阻力的情況下查找硬幣下降時的位置和速度屿储。

20.1 牛頓第二運動定律

一階常微分方程組可以寫作
dy/dx = G(x,y)
其中 Gxy 的某個函數(shù)(參見http://modsimpy.com/ode). 二階常微分方程組可寫作
d^2y/dx^2 = H(x,y,dy/dx)
其中 Hx , ydy/dx 的函數(shù)贿讹。

在這一章里,我們將用到最著名并且很實用的牛頓第二運動定律够掠,其公式是一個二階常微分方程:
F= ma
其中F是力或一組力的總和民褂,m 是運動物體的質(zhì)量,a 是它的加速度疯潭。

牛頓定律可能看起來不像微分方程赊堪,除非我們意識到加速度 a 是位置 y 對時間 t 的二階導(dǎo)數(shù)
a = d^2y/dt^2
所以牛頓第二定律也可以寫成
d^2y/dt^2 = F/m
這絕對是二階常微分方程。一般來說竖哩,F 可以是時間哭廉、位置和速度的函數(shù)。

當(dāng)然相叁,這個“定律”實際上是一個模型遵绰,因為它是對現(xiàn)實世界的簡化。雖然這通常是正確的:

  • 它只適用于 m 為常數(shù)的情況增淹。如果質(zhì)量取決于時間椿访、位置或速度,我們必須使用牛頓定律的更一般形式(見http://modsimpy.com/varmass).
  • 對于非常微觀的事物虑润,它不是一個好的模型成玫,而另一個模型,量子力學(xué)可以更好地描述它們。
  • 對于高速運動的物體哭当,它并不是一個很好的模型猪腕,可以用另一個模型,相對論力學(xué)來描述钦勘。

然而陋葡,對于質(zhì)量恒定、以中等速度運動的中型物體彻采,牛頓模型是非常有用的脖岛。如果我們能量化作用在這樣一個物體上的力,我們就可以預(yù)測它將如何移動颊亮。

20.2 拋硬幣

作為第一個例子,讓我們回想在1.1節(jié)中討論過的帝國大廈掉下來的硬幣陨溅。我們將實施兩種模式的系統(tǒng):一種是不考慮空氣阻力终惑,另一種考慮空氣阻力。

考慮到帝國大廈高381米门扇,假設(shè)硬幣是從靜止?fàn)顟B(tài)掉落的雹有,初始條件是:

init = State(y=381 * m,
            v=0 * m/s)

其中 y 是地平面以上的高度,v 是速度臼寄。ms 是 Pint 里提供的單位霸奕。

m = UNITS.meter
s = UNITS.second

唯一的系統(tǒng)參數(shù)是重力加速度:

g = 9.8 * m/s**2

此外,我們還將指定模擬的持續(xù)時間和步長:

t_end = 10 * s
dt = 0.1 * s

有了這些參數(shù)吉拳,時間步數(shù)是100质帅,這對于許多問題來說是很好的。一旦我們有了解決方案留攒,我們將增加步驟的數(shù)量煤惩,看看它對結(jié)果有什么影響。
我們需要一個系統(tǒng)來存儲參數(shù):

system = System(init=init, g=g, t_end=t_end, dt=dt)

現(xiàn)在我們需要一個斜率函數(shù)炼邀,這就是問題的癥結(jié)所在魄揉。如我們所見,run_ode_solver可以解一階常微分方程組拭宁,但牛頓定律是二階常微分方程組洛退。但是,如果我們認識到這一點

  1. 速度 v 是位置的導(dǎo)數(shù)杰标,dy/dt
  2. 加速度 a 是速度的導(dǎo)數(shù)兵怯,dv/dt

我們可以將牛頓定律改寫為一階常微分方程組:
dy/dt = v

dv/dt =a

并且我們可以把這些等式轉(zhuǎn)換成一個斜率函數(shù):

def slope_func(state, t, system):
    y, v = state
    
    dydt = v
    dvdt = -system.g
    
    return dydt, dvdt

第一個參數(shù)state包含硬幣的位置和速度。最后一個參數(shù)system包含系統(tǒng)參數(shù)g在旱,它是由于重力引起的加速度的大小摇零。

第二個參數(shù)t是時間。該斜率函數(shù)中不使用它,因為模型中的任何因素都不是時間相關(guān)的(見第18.1節(jié))驻仅。我之所以包含它谅畅,是因為這個函數(shù)將由run_ode_solver調(diào)用,它總是提供相同的參數(shù)噪服,不管它們是否需要毡泻。

函數(shù)的其余部分是微分方程的直接轉(zhuǎn)換,替換a=-g粘优,這表示重力引起的加速度朝著y減小的方向發(fā)展仇味。slope_func返回一個包含兩個導(dǎo)數(shù)的序列。
在調(diào)用run_ode_solver之前雹顺,最好使用初始條件測試斜率函數(shù):

dydt, dvdt = slpoe_func(system.init, 0, system)
20_1.png

圖20.1: 硬幣的高度與時間的關(guān)系丹墨,沒有空氣阻力

速度為 0 m/s,加速度為 9.8 m/s^2℃依ⅲ現(xiàn)在我們將run_ode_solver稱為如下:

results, details = run_ode_solver(system, slope_func)

結(jié)果是一個有兩列的時間框架(TimeFrame):y 代表硬幣的高度贩挣;v 代表它的速度。

我們可以像這樣畫出結(jié)果圖:

def plot_position(results):
    plot(results.y)
    decorate(xlabel='Time (s)',
            ylabel='Position (m)')

圖20.1顯示了結(jié)果没酣。由于加速度恒定王财,速度線性增加,位置二次減少裕便;因此绒净,高度曲線是拋物線。

results.y的最后一個值是-109m偿衰,這意味著我們運行模擬的時間太長了挂疆。解決這個問題的一種方法是利用結(jié)果來估計硬幣落在地面上的時間。

ModSim庫提供交叉哎垦,它接受一個TimeSeries和一個值囱嫩,并在序列通過該值時返回一個時間序列。我們可以這樣找到硬幣高度為 0 的時間:

t_crossings = crossings(results.y, 0)

結(jié)果是一個只有一個值的數(shù)組漏设,8.818s∧校現(xiàn)在,我們可以用t_end=8.818再次運行模擬郑口,但是還有更好的方法鸳碧。

20.3 事件

作為一個選項,run_ode_solver可以使用一個event_function犬性,該函數(shù)檢測到一個“事件”瞻离,如硬幣擊中地面,那就結(jié)束模擬乒裆。

事件函數(shù)采用與斜率函數(shù)套利、statetsystem相同的參數(shù)。它們應(yīng)該返回一個在事件發(fā)生時變?yōu)?code>0的值肉迫。以下是一個事件函數(shù)验辞,用于檢測硬幣撞到地面上:

def event_func(state, t, system):
y, v = state
return y

返回值是硬幣的高度 y,當(dāng)硬幣碰到地面時喊衫,它變?yōu)?code>0跌造。

我們把事件函數(shù)像這樣傳遞給run_ode_solver

results, details = run_ode_solver(system, slope_func,
                                  events=event_func)

然后我們可以得到在空中的時間和最終速度,如下所示:

t_sidewalk = get_last_label(results) * s
v_sidewalk = get_last_value(results.v)

在你繼續(xù)之前族购,你可能想讀一下本章的筆記本壳贪,chap20.ipynb,并練習(xí)一下寝杖。有關(guān)下載和運行代碼的說明违施,請參閱Section 0.4。

本書的中文翻譯由南開大學(xué)醫(yī)學(xué)院智能醫(yī)學(xué)工程專業(yè)2018級瑟幕、2019級的師生完成醉拓,方便后續(xù)學(xué)生學(xué)習(xí)《Python仿真建模》課程收苏。翻譯人員(排名不分前后):薛淏源、金鈺愤兵、張雯鹿霸、張瑩睿、趙子雨秆乳、李翀懦鼠、慕振墺、許靖云屹堰、李文碩肛冶、尹瀛寰、沈紀辰扯键、迪力木拉睦袖、樊旭波、商嘉文荣刑、趙旭馅笙、連煦、楊永新厉亏、樊一諾董习、劉志鑫、彭子豪爱只、馬碧婷皿淋、吳曉玲、常智星、陳俊帆窝趣、高勝寒疯暑、韓志恒、劉天翔高帖、張藝瀟缰儿、劉暢。

整理校訂由劉暢完成散址,如果您發(fā)現(xiàn)有翻譯不當(dāng)或者錯誤乖阵,請郵件聯(lián)系changliu@nankai.edu.cn

本書中文版不用于商業(yè)用途预麸,供大家自由使用瞪浸。

未經(jīng)允許,請勿轉(zhuǎn)載吏祸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末对蒲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贡翘,更是在濱河造成了極大的恐慌蹈矮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸣驱,死亡現(xiàn)場離奇詭異泛鸟,居然都是意外死亡,警方通過查閱死者的電腦和手機踊东,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門北滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闸翅,你說我怎么就攤上這事再芋。” “怎么了坚冀?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵济赎,是天一觀的道長。 經(jīng)常有香客問我记某,道長联喘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任辙纬,我火速辦了婚禮豁遭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贺拣。我一直安慰自己蓖谢,他們只是感情好捂蕴,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闪幽,像睡著了一般啥辨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盯腌,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天溉知,我揣著相機與錄音,去河邊找鬼腕够。 笑死级乍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帚湘。 我是一名探鬼主播玫荣,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼大诸!你這毒婦竟也來了捅厂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤资柔,失蹤者是張志新(化名)和其女友劉穎焙贷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贿堰,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡盈厘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了官边。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡外遇,死狀恐怖注簿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跳仿,我是刑警寧澤诡渴,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站菲语,受9級特大地震影響妄辩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜山上,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一眼耀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佩憾,春花似錦哮伟、人聲如沸干花。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽池凄。三九已至,卻和暖如春鬼廓,著一層夾襖步出監(jiān)牢的瞬間肿仑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工碎税, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尤慰,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓蚣录,卻偏偏與公主長得像割择,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萎河,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容