四阶龙格库塔算法及matlab代码
常微分方程
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)是已知函数
偏微分方程
Partial differential equation,简称PDE,自变量有多个的微分方程。
例子2:ut−a2uxx=0,a>0u_t-a^2u_{xx}=0,a>0ut−a2uxx=0,a>0为常数(热传导方程,抛物型方程的典型代表)
显式(Explicit)
第n步结果可以从n-1, n-2, …1步的结果直接推导出来,迭代时每步的计算量很小,但迭代增量也有限制,不能太大,否则会出现发散。
隐式(Implicit)
第n步的计算结果不能直接从前面的结果推导出来,必须做进一步的求解,这样,迭代时每步的计算量很大。
泰勒公式
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 点关于 x 的幂函数展开式,又称为 Taylor 公式,式中Rn(x)叫做 Lagrange 余项。
欧拉方法
考虑一阶常微分方程的初值问题
{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,...
前后向欧拉法的推理、举例及稳定性对比的超棒分析!地址入口
梯形公式
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,...
改进的欧拉算法
{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,...
其中,后向欧拉算法和梯形公式是隐式算法,前向欧拉算法和改进的欧拉算法是显式算法。欧拉算法计算容易,但是精度低,梯形公式精度高,但是是隐式形式,不易求解。将两式结合,则可以得到改进的欧拉公式。先用欧拉公式求出yn+1的一个粗糙的估计值,再用梯形方法进行精确化,称为校正值。
四阶龙格库塔算法(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
龙格-库塔算法是一种在工程上应用广泛的高精度单步算法,算法精度较高,如果预先取四个点就是四阶龙格-库塔算法。
真的!龙格库塔算法的超强解析!地址入口
四阶龙格库塔函数代码
runge_kuttx0_o4.m
代码参考的博客地址入口
总结一下代码的优点~
1、使用函数句柄,方便复用~
2、模仿了ode45的函数输入变量,和ode45用起来差不多~
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函数效果','自编四阶龙格库塔函数效果') xlabel('t'); ylabel('y'); title('效果对比图')test.m运行结果
步长选择
之前讨论的所有的龙格-库塔方法都是以ΔtΔtΔt定步长来展开的,但从xi⇒xi+1x_i ⇒x_{i+1}xi⇒xi+1单步递推过程来说,步长ΔtΔtΔt越小,局部截断误差越小(方法确定情况下),但是随着步长的缩小,不但会引起计算量的增加,而且也有可能引起舍入误差的严重积累;但步长ΔtΔtΔt太大又不能达到预期的精度要求,所以选择合适的步长ΔtΔtΔt,在实际计算中也是比较重要的。其实有时候在实际使用中步长并不需要算法确定,而是需要根据数据帧率来确定的,比如imu数据。??
下面给出求解步长的步骤:
1、以步长ΔtΔtΔt开始,利用龙格-库塔公式计算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,利用龙格-库塔公式分两步计算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、计算∣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,否则继续步长减半,重复上诉步骤直到满足精度要求。
test2.m
总结
以上是生活随笔为你收集整理的四阶龙格库塔算法及matlab代码的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: IE七大手法介绍
- 下一篇: 自由曲面透镜设计matlab,led自由