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