首先理解一下什么是常微分方程,简单的说就是只有一个未知数的微分方程,具体定义如下:
凡含有参数,未知函数和未知函数导数 (或微分) 的方程,称为微分方程,有时简称为方程,未知函数是一元函数的微分方程称作常微分方程,未知函数是多元函数的微分方程称作偏微分方程。
一阶常微分方程的初值问题是:
其中 y=y(x) y = y ( x ) 是未知函数, y(x0)=y0 y ( x 0 ) = y 0 是初值条件,而 f(x,y) f ( x , y ) 是给定的二元函数
简单的数值方法就是用差商代替导数,公式如下:
欧拉方法是龙格-库塔方法的一个特例,其局部截断误差为一阶泰勒余项 O(h2) O ( h 2 ) ,为了使误差更小,我们可以做更高阶的误差截断,这也就是我们Runge-Kutta方法的基本原理,具体推导可参考《数值分析》的第八章.其公式如下:
先看一个简单的例子: dydx=y+3xx2 d y d x = y + 3 x x 2 ,初值 y(0)=−2 y ( 0 ) = − 2 ,求解区间为 [14] [ 1 4 ] ,代码如下:
odefun=@(x,y) (y+3*x)/x^2;
tspan=[1 4];
y0=-2;
[x y]=ode45(odefun,tspan,y0)
plot(x,y)
但是我们再看另外一个例子:
odefun=@(x,y) y/x-2*y^2;
tspan=[0 3];
y0=0;
[x y]=ode45(odefun,tspan,y0)
plot(x,y)
disp(y)
odefun=@(x,y) fun(x,y);
tspan=[0 3];
y0=0;
[x y]=ode45(odefun,tspan,y0);
plot(x,y)
function dy = fun(x,y)
if(x==0)
dy=1-2*y^2
else
dy = y/x-2*y^2
end
end
这里需要强调一点的是,Runge-Kutta法针对的是连续的函数 f f ,由于在例子中,函数在 x=0 x = 0 处是不连续的,所以在这个地方是需要单独处理的,在这里, yx y x 在 x=0 x = 0 处的导数为1(洛必达法则,即 00=1 0 0 = 1 )