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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

任何的系統(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;

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('真值''歐拉') <注意:有的版本內(nèi)euler函已經(jīng)是新版本MATLAB的內(nèi)部構(gòu)造函數(shù),無法再次定義使用,并且更改函數(shù)M文件是要保證函數(shù)名與被調(diào)用的函數(shù)名相同,不然代碼會(huì)無法運(yùn)行,你也無法調(diào)試出來錯(cuò)誤!>

結(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)代碼:

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; %下面為實(shí)現(xiàn)的main函數(shù): 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')

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。