Euler法,梯形法,RK2,RK4對ODE應(yīng)用的matlab代碼和誤差分析及圖像輸出——數(shù)值方法

一次挺滿意的小組合作,記錄一下使用的代碼和過程。事先聲明代碼來自chatGPT,由于CSDN上沒有找到類似的代碼,這也是為以后或許要用到的同學(xué)留個(gè)資源吧。雖然說代碼不是親自寫的,理解還是很容易,順便注明一些我們走的彎路。

數(shù)值方法:
歐拉法:
很容易理解,順帶提一句chatGPT的代碼注釋真的很強(qiáng)大。
歐拉法調(diào)用方法:
(我們作業(yè)內(nèi)的ODE是,所以下面的都以這個(gè)ODE為例,再順帶提一句,使用matlab解ODE用dsolve就好。)
本來想解釋一下,但真沒啥解釋的...定義函數(shù),初值,區(qū)間,步長,調(diào)用函數(shù),畫圖,坐標(biāo)軸和圖名,就這些。
歐拉法輸出圖像:

梯形法:
英文是Trapezoidal method,tra pe zo i dal,梯形。
這次tspan是區(qū)間,不懂就看下面輸入案例。
梯形法調(diào)用方法:
梯形法輸出圖像:

RK2:
RK2調(diào)用方法:
圖不放了,同上(雖然說調(diào)用方法也類似,我還是把餅遞到嘴邊吧)。
RK4:
RK4調(diào)用方法:

誤差分析:
我們做的誤差分析是得出原函數(shù)在t=1時(shí)的值和數(shù)值方法逼近的值差的絕對值再取對數(shù),聽著有點(diǎn)麻煩啊,寫成式子應(yīng)該是這樣:。這里我們將步長設(shè)為自變量,從10的-1到-6次方,誤差為因變量,這樣取對數(shù)后,正常的誤差分析結(jié)果應(yīng)該是幾條斜率不同的直線。
代碼:
誤差分析圖像:

小問答:這里直線的斜率分別為1,2,4,原因是什么?
另外,效果最好的是RK4,我一開始疑惑為什么RK4方法會觸底反彈,chatGPT的解釋是:
使用RK4方法擬合函數(shù)時(shí),有時(shí)在步長減小到一個(gè)值時(shí),隨著步長繼續(xù)減小,誤差反而增大的原因:在RK4方法中,步長的大小會影響擬合精度,通常情況下,減小步長可以提升擬合的精度。然而,當(dāng)步長繼續(xù)減小時(shí),誤差反而增大的原因在于舍入誤差的影響。由于計(jì)算機(jī)存儲浮點(diǎn)數(shù)是有限精度的,當(dāng)步長較小時(shí),函數(shù)的微小變化可能會因?yàn)榫炔蛔愣缓雎?,從而?dǎo)致誤差逐漸累積,最終使得計(jì)算結(jié)果和真實(shí)結(jié)果之間的差距增大。
我也詢問了為什么歐拉法和RK2為什么不會如此,chatGPT解釋是:
歐拉法和RK2方法在同樣的函數(shù)上進(jìn)行數(shù)值積分時(shí),沒有出現(xiàn)這種問題的原因是因?yàn)樗鼈兊挠?jì)算精度相對較低,誤差隨著步長的減小而不是增大。歐拉法和RK2方法都是數(shù)值積分常用的一階顯式方法,與RK4方法相比,它們的計(jì)算復(fù)雜度較低,每次迭代只需要使用一次函數(shù)導(dǎo)數(shù)計(jì)算即可。這種簡單的計(jì)算方式使得它們在處理簡單的函數(shù)時(shí)更加高效。然而,這種高效性也帶來了精度的犧牲。相較于RK4方法的四階精度,歐拉法只有一階,而RK2方法只有二階。因此,在進(jìn)行數(shù)值積分時(shí),它們的誤差通常較大。
一些踩坑:
之后,我們換了一個(gè)新的函數(shù),區(qū)間設(shè)為0到60。我們一開始想用函數(shù)中間的值來對比誤差,即y(30),結(jié)果搞出一個(gè)四不像圖像,具體的就不放了。后來在做報(bào)告前,我們才發(fā)現(xiàn)在誤差分析的代碼中,我們用了例如y_exact(t_euler(end))的函數(shù)。我們將步長,初值,區(qū)間和取值全都換為了新的函數(shù),但就是沒發(fā)現(xiàn)這個(gè)...最后作差是將函數(shù)中間數(shù)值方法的值和原函數(shù)末端值比較,當(dāng)然完全不對了。還是沒有完全理解如此簡單的代碼啊。順帶一提這些迭代的方法,比較函數(shù)末端(end)值其實(shí)應(yīng)該是最能顯示誤差的。
最后看看我們對另一個(gè)函數(shù)做的誤差分析圖吧:

注意兩個(gè)誤差分析圖的斜率哦!