MATLAB中ode23函式,龍格庫塔函式

2021-07-31 04:07:50 字數 2268 閱讀 3898

今天說一說matlab中ode23函式的原理,在網上看了好多,但是不知道是怎麼計算的,就知道是那麼用的,但是最後結果咋回事不知道,今天來講一講是怎麼計算的。

首先來個程式:

function f=eg6fun(t,y) 

f=-y^3-2;

end

上面是我定義的乙個函式,看著挺簡單的哈!不多說了。

[t,y]=ode23(@eg6fun,[0,30],1);
這句話是我用ode23呼叫的語句,先說一下,這裡eg6fun是我上面函式的名稱,也就是ode23主要計算的就是這個函式的微分。[0,30]為t的範圍,這裡t沒有什麼太大的作用,只是為了計算步長用的,之後我把執行後的t和y資料粘在這裡,我們發現,在matlab中步長並不是固定的。這裡應該是用乙個什麼函式求得,我沒查,感興趣的自己查一下。1為y的初值,也就是我們常常說的y0。

先粘上實驗結果,我們在分析怎麼來的:

下面的是t的值,這裡matlab將t在[0,30]區間分成了67份,我這裡只粘了一部分: 0

0.0266666666666667

0.0974376132058027

0.178185989598692

0.270160382755732

下面是y的結果,y最後也是乙個[1,67]的矩陣: 1

0.922959859735161

0.740501273051361

0.556672216994644

0.363414446549133

下面我們來說是怎麼計算的吧!看下面的圖,這個是我在數值分析書上照的,其實ode23就是龍格庫塔函式的應用,而龍格庫塔函式就是根據尤拉法得來的,看下圖:

上面中有三個公式,第乙個公式h後面括號中的內容就是要求積分的函式,就是我們程式中的eg6fun。那麼就好辦了,把圖中公式中的括號中的內容換成我們的公式也就是

-y^3-2
然後計算就好了。這裡h為步長,也就是我們程式中t的步長,我們可以看到第一次t為0.0266666666666667,而下一次的步長為0.0974376132058027-0.0266666666666667,只要這麼一步一步計算就好了。

(這裡看圖中黑色筆手寫的公式)

這裡計算一步來表示計算的大概過程:

例如: (1)計算yp=y1+h * (-y1^3 - 2) = 1 - 0.027*3 = 0.919

(2)       yc=y1+h * (-yp^3 - 2) = 1 - 0.027*(0.919^3 - 2) = 0.925

(3)        y(n+1) = 1/2 * (yp + yc) = 1/2 * (0.919 + 0.925) = 0.922

因為這裡我們保留精度為3位小數,可能計算的有些誤差。還有一點需要注意,龍格庫塔函式是對尤拉方法進行的改進,其實龍格庫塔函式的精度要比尤拉方法更高。因此這裡計算有些許誤差。但是大概的過程就是這樣的。

上面的內容是之前寫的,講解的是尤拉演算法計算微分的過程,其實龍格-庫塔方法後來在書中看到,下面介紹一下龍格庫塔方法:

matlab中的ode23就是用的二階的龍格庫塔方法,就是圖中3.6的三個公式,這裡h為步長,上面給出的t,c1和c2是係數,這個係數取值不是固定的,matlab中是啥我也不是確定,但是書中最後給的是c1=0,c2=1,λ2和μ21取值1/2。這樣一來,計算一波:y1=1;求y2,將y1帶入公式中的yn,這裡沒有x,所以有x的項可以忽略

k1=-3;

k2=f(1-(1/2)*0.0267*3)=f(0.96)=-2.88

y2=1-0.0267*2.88=0.923

y2求出,其餘的過程都是這樣求得。ode45是四階龍格庫塔函式,下圖為4階求法,這裡不再做介紹:

到此matlab中ode23的計算方法已經講解完了,當然,ode45跟這個應該類似,就是ode45比ode23更精確一點,在matlab中,如果我們用ode45會發現,t在[0,30]間分成了167份,很明顯精度提高了。其實matlab中有好多的函式都是用到了數值分析中的內容,而數值分析就是用我們的笨方法來計算數值的一種工具,這是我自己定義的哈,通過減少誤差來使計算出來的資料更準確。

ode中函式引數傳遞

在用odesolver ode45,ode15s,來解微分方程的時候,最基本的用法是 t,y odesolver odefun,tspan,y0 這裡的odefun是待求的微分方程。那麼odefun中一般會含有多個系統引數,通常要通過改變引數來觀察系統動態的變化。那麼如何在呼叫odesolver的時...

matlab中find函式簡介

找到非零元素的索引和值 語法 1.ind find x 2.ind find x,k 3.ind find x,k,first 4.ind find x,k,last 5.row,col find x,6.row,col,v find x,說明 1.ind find x 找出矩陣x中的所有非零元素,...

MATLAB中的length函式

在matlab中 size 獲取陣列的行數和列數 length 陣列長度 即行數或列數中的較大值 numel 元素總數。s size a 當只有乙個輸出引數時,返回乙個行向量,該行向量的第乙個元素時陣列的行數,第二個元素是陣列的列數。r,c size a 當有兩個輸出引數時,size函式將陣列的行數...