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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

四阶龙格库塔算法及matlab代码

發(fā)布時間:2023/12/31 循环神经网络 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四阶龙格库塔算法及matlab代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

常微分方程

Ordinary differential equation,簡稱ODE,自變量只有一個的微分方程。
例子1: dydx=f(x,y)\dfrac {dy} {dx}=f(x,y)dxdy?=f(x,y) ,f(x,y)f(x,y)f(x,y)是已知函數(shù)

偏微分方程

Partial differential equation,簡稱PDE,自變量有多個的微分方程。
例子2:ut?a2uxx=0,a>0u_t-a^2u_{xx}=0,a>0ut??a2uxx?=0,a>0為常數(shù)(熱傳導(dǎo)方程,拋物型方程的典型代表)

顯式(Explicit)

第n步結(jié)果可以從n-1, n-2, …1步的結(jié)果直接推導(dǎo)出來,迭代時每步的計(jì)算量很小,但迭代增量也有限制,不能太大,否則會出現(xiàn)發(fā)散。

隱式(Implicit)

第n步的計(jì)算結(jié)果不能直接從前面的結(jié)果推導(dǎo)出來,必須做進(jìn)一步的求解,這樣,迭代時每步的計(jì)算量很大。

泰勒公式

f(x)=f(a)0!+f′(a)1!(x?a)+f′′(a)2!(x?a)2+...+f(n)(a)n!(x?a)n+Rn(x)f(x)=\dfrac {f(a)} {0!}+\dfrac {f'(a)} {1!}(x-a)+\dfrac {f''(a)} {2!}(x-a)^2+...+\dfrac {f^{(n)}(a)} {n!}(x-a)^n+R_n(x) f(x)=0!f(a)?+1!f(a)?(x?a)+2!f(a)?(x?a)2+...+n!f(n)(a)?(x?a)n+Rn?(x)
稱為 f(x) 在 x = a 點(diǎn)關(guān)于 x 的冪函數(shù)展開式,又稱為 Taylor 公式,式中Rn(x)叫做 Lagrange 余項(xiàng)。

歐拉方法

考慮一階常微分方程的初值問題
{dydx=f(x,y)y(x0)=y0\left\{ \begin{aligned} &\dfrac {dy} {dx}=f(x,y)\\ &y(x_0)=y_0 \end{aligned} \right.?????dxdy?=f(x,y)y(x0?)=y0??

前向歐拉法

yn+1=yn+hf(xn,yn),n=0,1,...y_{n+1}=y_n+hf(x_n,y_n),n=0,1,...yn+1?=yn?+hf(xn?,yn?),n=0,1,...

后向歐拉算法

yn+1=yn+hf(xn+1,yn+1),n=0,1,...y_{n+1}=y_n+hf(x_{n+1},y_{n+1}),n=0,1,...yn+1?=yn?+hf(xn+1?,yn+1?),n=0,1,...
前后向歐拉法的推理、舉例及穩(wěn)定性對比的超棒分析!地址入口

梯形公式

yn+1=yn+h2[f(xn+yn)+f(xn+1+yn+1)],n=0,1,...y_{n+1}=y_n+\frac h 2[f(x_n+y_n)+f(x_{n+1}+y_{n+1})],n=0,1,...yn+1?=yn?+2h?[f(xn?+yn?)+f(xn+1?+yn+1?)],n=0,1,...

改進(jìn)的歐拉算法

{y^n+1=yn+hf(xn,yn)yn+1=yn+h2[f(xn,yn)+f(xn+1,y^n+1)]\left\{ \begin{aligned} &\hat{y}_{n+1}=y_n+hf(x_n,y_n)\\ &y_{n+1}=y_n+\frac h 2[f(x_n,y_n)+f(x_{n+1},\hat{y}_{n+1})] \end{aligned} \right.?????y^?n+1?=yn?+hf(xn?,yn?)yn+1?=yn?+2h?[f(xn?,yn?)+f(xn+1?,y^?n+1?)]?
也可以表示成
{yf=yn+hf(xn,yn)yb=yn+hf(xn+1,yf)yn+1=12(xf+xb)\left\{ \begin{aligned} &y_f=y_n+hf(x_n,y_n)\\ &y_b=y_n+hf(x_{n+1},y_f)\\ &y_{n+1}=\frac 1 2 (x_f+x_b) \end{aligned} \right.???????????yf?=yn?+hf(xn?,yn?)yb?=yn?+hf(xn+1?,yf?)yn+1?=21?(xf?+xb?)?

其中yfy_fyf?表示利用向前(顯式)歐拉公式的近似值,yby_byb?表示利用向后(隱式)歐拉公式的近似值(利用了yfy_fyf?),最后取平均值。
上面利用f(xn+1,y^n+1)]f(x_{n+1},\hat{y}_{n+1})]f(xn+1?,y^?n+1?)]是有誤差的,也可通過多次迭代減少誤差,具體公式如下
{y^n+1(0)=yn+hf(xn,yn)yn+1(k+1)=yn+h2[f(xn,yn)+f(xn+1,y^n+1(k))],k=0,1,2,...\left\{ \begin{aligned} &\hat{y}_{n+1}^{(0)}=y_n+hf(x_n,y_n)\\ &y_{n+1}^{(k+1)}=y_n+\frac h 2[f(x_n,y_n)+f(x_{n+1},\hat{y}_{n+1}^{(k)})],k=0,1,2,... \end{aligned} \right.???????y^?n+1(0)?=yn?+hf(xn?,yn?)yn+1(k+1)?=yn?+2h?[f(xn?,yn?)+f(xn+1?,y^?n+1(k)?)],k=0,1,2,...?

其中,后向歐拉算法和梯形公式是隱式算法,前向歐拉算法和改進(jìn)的歐拉算法是顯式算法。歐拉算法計(jì)算容易,但是精度低,梯形公式精度高,但是是隱式形式,不易求解。將兩式結(jié)合,則可以得到改進(jìn)的歐拉公式。先用歐拉公式求出yn+1的一個粗糙的估計(jì)值,再用梯形方法進(jìn)行精確化,稱為校正值。

四階龍格庫塔算法(Runge-kutta method)

{k1=f(xn,yn)k2=f(xn+h2,yn+h2×k1)k3=f(xn+h2,yn+h2×k2)k4=f(xn+h,yn+h×k3)yn+1=yn+(k1+2k2+2k3+k4)6×h\left\{ \begin{aligned} &k_1=f(x_n,y_n)\\ &k_2=f(x_n+\frac h 2,y_n+\frac h 2×k_1)\\ &k_3=f(x_n+\frac h 2,y_n+\frac h 2×k_2)\\ &k_4=f(x_n+h,y_n+h×k_3)\\ &y_{n+1}=y_n+\frac {(k_1+2k_2+2k_3+k_4)} 6 ×h \end{aligned} \right.???????????????????????????k1?=f(xn?,yn?)k2?=f(xn?+2h?,yn?+2h?×k1?)k3?=f(xn?+2h?,yn?+2h?×k2?)k4?=f(xn?+h,yn?+h×k3?)yn+1?=yn?+6(k1?+2k2?+2k3?+k4?)?×h?
龍格-庫塔算法是一種在工程上應(yīng)用廣泛的高精度單步算法,算法精度較高,如果預(yù)先取四個點(diǎn)就是四階龍格-庫塔算法。
真的!龍格庫塔算法的超強(qiáng)解析!地址入口

四階龍格庫塔函數(shù)代碼

runge_kuttx0_o4.m
代碼參考的博客地址入口
總結(jié)一下代碼的優(yōu)點(diǎn)~
1、使用函數(shù)句柄,方便復(fù)用~
2、模仿了ode45的函數(shù)輸入變量,和ode45用起來差不多~

function [t,y,n]=runge_kuttx0_o4(ufunc,tspan,y0,h)%參數(shù)表順序依次是微分方程組的函數(shù)名稱,時間起點(diǎn)終點(diǎn),初始值,步長(參數(shù)形式參考了ode45函數(shù)) if nargin<4h=0.01; end if size(tspan)==[1,2]t0=tspan(1);tn=tspan(2); elseerror(message('MATLAB:runge_kuttx0_o4:WrongDimensionOfTspan')); end n=floor((tn-t0)/h);%求步數(shù) t(1)=t0;%時間起點(diǎn) y(:,1)=y0;%第一列賦初值,可以是向量,代表不同的初始值 for i=1:n t(i+1)=t(i)+h; k1=ufunc(t(i),y(:,i)); k2=ufunc(t(i)+h/2,y(:,i)+h*k1/2); k3=ufunc(t(i)+h/2,y(:,i)+h*k2/2); k4=ufunc(t(i)+h,y(:,i)+h*k3); y(:,i+1)=y(:,i)+h*(k1+2*k2+2*k3+k4)/6; %按照龍格庫塔方法進(jìn)行數(shù)值求解 end

test1.m

clear clc test_fun=@(t,y)(y+3*t)/t^2; tspan=[1 4]; y0=-2; h=1; [t1,y1]=ode45(test_fun,tspan,y0); [t2,y2]=runge_kuttx0_o4(test_fun,tspan,y0,h); plot(t1,y1,'r',t2,y2,'g') legend('ode45函數(shù)效果','自編四階龍格庫塔函數(shù)效果') xlabel('t'); ylabel('y'); title('效果對比圖')

test.m運(yùn)行結(jié)果

步長選擇

之前討論的所有的龍格-庫塔方法都是以ΔtΔtΔt定步長來展開的,但從xi?xi+1x_i ?x_{i+1}xi??xi+1?單步遞推過程來說,步長ΔtΔtΔt越小,局部截?cái)嗾`差越小(方法確定情況下),但是隨著步長的縮小,不但會引起計(jì)算量的增加,而且也有可能引起舍入誤差的嚴(yán)重積累;但步長ΔtΔtΔt太大又不能達(dá)到預(yù)期的精度要求,所以選擇合適的步長ΔtΔtΔt,在實(shí)際計(jì)算中也是比較重要的。其實(shí)有時候在實(shí)際使用中步長并不需要算法確定,而是需要根據(jù)數(shù)據(jù)幀率來確定的,比如imu數(shù)據(jù)。??
下面給出求解步長的步驟:

1、以步長ΔtΔtΔt開始,利用龍格-庫塔公式計(jì)算xi?xi+1x_i ?x_{i+1}xi??xi+1?得到一個近似值xi+1Δtx_{i+1}^{\Delta t}xi+1Δt?
2、然后步長減半為Δt/2\Delta t /2Δt/2,利用龍格-庫塔公式分兩步計(jì)算xi?xi+12?xi+1x_i ? x_{i + \frac1 2} ? x_{i+1}xi??xi+21???xi+1?得到一個近似值xi+1Δt/2x_{i + 1}^{Δt/2}xi+1Δt/2?
3、計(jì)算∣xi+1Δt/2?xi+1Δt<?∣∣x_{i + 1}^{Δt/2}-x_{i + 1}^{Δt}< ? ∣xi+1Δt/2??xi+1Δt?<?是否成立,如果成立直接步長選擇ΔtΔtΔt,否則繼續(xù)步長減半,重復(fù)上訴步驟直到滿足精度要求。
test2.m

clear clc test_fun=@(t,y)(y+3*t)/t^2; tspan=[1 15]; y0=-2; h=1; acc=0.0001; [t1,y1,n1]=runge_kuttx0_o4(test_fun,tspan,y0,h); tf=t1;yf=y1;hf=h; h=h/2; [t2,y2,n2]=runge_kuttx0_o4(test_fun,tspan,y0,h); while(sum(abs(y1(2:n1+1)-y2(3:2:n2+1)))/n1>=acc) t1=t2;y1=y2;n1=n2; h=h/2; [t2,y2,n2]=runge_kuttx0_o4(test_fun,tspan,y0,h); end plot(tf,yf,'r',t2,y2,'g') legend(['四階龍格庫塔初始步長下的效果,h=',num2str(hf)],['四階龍格庫塔精度約為0.01的效果,h=',num2str(h*2)]) xlabel('t'); ylabel('y'); title('效果對比圖')

總結(jié)

以上是生活随笔為你收集整理的四阶龙格库塔算法及matlab代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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