几种数字仿真的物理意义与代码实现
任何的系統(tǒng)都包括輸入與輸出,小到一片最小的代碼片,大道航天工業(yè)系統(tǒng),都是由最基本的輸入輸出與中間環(huán)節(jié)構(gòu)成。如何處理中間的環(huán)節(jié)就顯得異常重要?,F(xiàn)如今的系統(tǒng)大多為數(shù)字仿真系統(tǒng),也就是大多使用計(jì)算機(jī)來處理輸入與反饋信號(hào)。也信號(hào)又分為連續(xù)信號(hào)與離散信號(hào),今天我們來談一談利用計(jì)算機(jī)仿真來處理信號(hào)的幾種典型的方法及實(shí)現(xiàn)的MATLAB代碼。
(1)數(shù)值積分法:
我們知道,從數(shù)學(xué)的角度上考慮,y(k+1)=y(k)+∫f(t,y(t))dt這樣得來的確實(shí)是最優(yōu)解,如果一直這樣計(jì)算下去,得到的永遠(yuǎn)都是最精確地值。但是我們的計(jì)算機(jī)卻無法做到這樣的計(jì)算,因?yàn)閮蓵r(shí)刻之間的斜率為變化值。于是我們利用簡化的方式去代替積分,只要采樣時(shí)刻取得足夠小,我們就可以理所當(dāng)然的人為t(k)時(shí)刻與t(k+1)時(shí)刻之間是一條直線,于是我們就認(rèn)為兩者之間的斜率就是不變的值。這樣看來就是好辦多了只要曲積分為t(k)時(shí)刻的斜率,就解決了。下面為實(shí)例實(shí)現(xiàn)代碼:
已知:y’ = -y; y(0) = 1;
結(jié)果如下:
可見,這種方法仿真的結(jié)果隨著時(shí)間的推移誤差會(huì)越來越大,并且精度會(huì)隨著步長的變大而差,但是這種方法提供了最基本的思想,所以一直是教學(xué)的典例。
(二)梯形法:y(k+1)=y(k)+(1/2)*h[f(tk,yk) + f(t(k+1),y(k+1))],以上·公式可以看出一個(gè)問題,就是我要得到y(tǒng)(k+1)的值,利用梯形法,就必須先要的到y(tǒng)(k+1)的值,似乎變成了雞生蛋的問題,這里我們利用歐拉方式先進(jìn)行預(yù)測,然后結(jié)合梯形法,這樣一來,梯形法也就是一種改進(jìn)的歐拉方法,只是提高了精度。下面看看他是如何提高精度的,我們利用泰勒展開將t(k+1)時(shí)刻的值利用泰勒展開得到了如下的值:y(t+1) = y(k) + hy’(k) + (1/2!)h^2y”(t)·········
我們利用歐拉公式,得到了前兩項(xiàng),其舍去了2次方及其以后的部分,因此其截?cái)嗾`差也就是O(h^2),相比下,梯形法雖然只是改變了其去斜率的方式,但是截?cái)嗾`差卻提高了一個(gè)等級(jí)。
(三)龍哥-庫塔法:
我們利用提梯形法提高了精度,但是如果仿真的時(shí)間過長,誤差還是會(huì)一步一步的變差,提高精度的精髓在于如何設(shè)計(jì)積分中的斜率,于是引入龍哥-庫塔法:
梯形法中我們?nèi)バ甭饰襶(k)與y(k+1)的斜率的平均,也就是取得二者同樣的權(quán)重,現(xiàn)在用同樣的方法去兩點(diǎn)之間的點(diǎn),只要給點(diǎn)的斜率賦合理的權(quán)重,就可以很好的提高截?cái)嗾`差的階次即精度。那么如何巧合的得提高截?cái)嗾`差?這里不得不佩服龍格的逆行思維,他采用倒推方式,先設(shè)置每個(gè)點(diǎn)的斜率的加權(quán)為一個(gè)未知數(shù),帶著未知數(shù)去推導(dǎo),這樣一來,將得到的y(k+1)時(shí)刻的值與泰勒展開進(jìn)行比較,一一對(duì)比,從而得到了每一階次所應(yīng)該設(shè)定的權(quán)重。我們最多應(yīng)用的也就是四階龍格-庫塔法。其取點(diǎn)的權(quán)重正好是(1 2 2 1),而二階的龍格-庫塔也正好與梯形法對(duì)應(yīng)上。其實(shí)現(xiàn)代碼:
結(jié)果如下:
從結(jié)果看出來幾乎完全重合,也就是說明精度提高了很多。
總結(jié)
以上是生活随笔為你收集整理的几种数字仿真的物理意义与代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言指针:从底层原理到花式技巧,用图文
- 下一篇: 暴力字符匹配算法的C语言实现