最近因科研工作需求,要用到Runge-Kutta Method解二阶ODE,自己也懒得造轮子了,所以干脆就直接使用Matlab的内置函数ode45来解决(该内置函数基于Explicit Runge-Kutta Method)。于此处记录一下ode45的一些比较有效的使用方法(主要是关于如何传入额外参数)。
现用ode45求以下初始值问题的数值解,注意该方程组含有一个参数a(该参数a需要提前计算好,然后才能求解此方程组),
首先转化成一阶微分方程组,令
便得到
初始条件为
相应的Matlab代码如下:
sysODE.m - 该文件用来描述需要求解的一阶微分方程组。
function [dydt] = sysODE(t,y,a)
dydt = [y(2); -a*y(1)*y(2)*t];
end
demo.m - 该文件为主脚本,负责调用ode45以及sysODE这两个函数
a = 10;
[t,y] = ode45(@(t,y) sysODE(t,y,a), [0,1],[1,2]);
plot(t,y(:,1))
注意这里为了使表述简洁,直接给a赋值了,在许多实际问题中像a这样的参数可能需要经过很多计算步骤才能得到,这也是为什么需要这种传入参数的方法。
运行demo.m得到该方程组的数值解:
Reference
[1] Differential Equations An Introduction to Modern Methods and Applications by James R. Brannan, William E. Boyce.
[2] Matlab Help Center - ode45: https://www.mathworks.com/help/matlab/ref/ode45.html