日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

几种数字仿真的物理意义与代码实现

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几种数字仿真的物理意义与代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

任何的系統都包括輸入與輸出,小到一片最小的代碼片,大道航天工業系統,都是由最基本的輸入輸出與中間環節構成。如何處理中間的環節就顯得異常重要。現如今的系統大多為數字仿真系統,也就是大多使用計算機來處理輸入與反饋信號。也信號又分為連續信號與離散信號,今天我們來談一談利用計算機仿真來處理信號的幾種典型的方法及實現的MATLAB代碼。
(1)數值積分法:
我們知道,從數學的角度上考慮,y(k+1)=y(k)+∫f(t,y(t))dt這樣得來的確實是最優解,如果一直這樣計算下去,得到的永遠都是最精確地值。但是我們的計算機卻無法做到這樣的計算,因為兩時刻之間的斜率為變化值。于是我們利用簡化的方式去代替積分,只要采樣時刻取得足夠小,我們就可以理所當然的人為t(k)時刻與t(k+1)時刻之間是一條直線,于是我們就認為兩者之間的斜率就是不變的值。這樣看來就是好辦多了只要曲積分為t(k)時刻的斜率,就解決了。下面為實例實現代碼:
已知:y’ = -y; y(0) = 1;

function y = euler(y0,h,f) y = y0 + h*f; %代碼如下 : h = 0.1; %步長確定了精度; y0 = 1; %確定初值 t = 0:h:1; n = length(t); numy = zeros(1,n); f = -y0; numy(1) = 0; for i = 2:nnumy(i) = euler(y0,h,f);y0 = numy(i);f = -y0; end realy = exp(-t); plot(t,realy,t,numy,'ro-') legend('真值''歐拉') <注意:有的版本內euler函已經是新版本MATLAB的內部構造函數,無法再次定義使用,并且更改函數M文件是要保證函數名與被調用的函數名相同,不然代碼會無法運行,你也無法調試出來錯誤!>

結果如下:
可見,這種方法仿真的結果隨著時間的推移誤差會越來越大,并且精度會隨著步長的變大而差,但是這種方法提供了最基本的思想,所以一直是教學的典例。
(二)梯形法: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),而二階的龍格-庫塔也正好與梯形法對應上。其實現代碼:

function dy = ff(y0) dy = -y0; function funge4(y0,h) k1 = h*ff(y0); k2 = h*ff(y0 + k1/2); k3 = h*ff(y0 + k3/2); k4 = h*ff(y0 + k3); yk_1 = y0 + (k1 + 2*k2 + 2*k3 + k4)/6; %下面為實現的main函數: y0 = 1; h = 0.1; t = 0:h:1; n = length(t); runge4_y = zeros(1,n); runge4_y(1) = 1; for i = 2:nrunge4_y(i) = runge4(y0,h);y0 = runge4_y(1); end realy = exp(-t); plot(t,realy,t,runge4_y,'-o')

結果如下:
從結果看出來幾乎完全重合,也就是說明精度提高了很多。

總結

以上是生活随笔為你收集整理的几种数字仿真的物理意义与代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。