文档介绍:Ordinary Differential Equations
ODE
一阶常微分方程的初值问题:
节点:x1<x2< …<xn
步长为常数
一欧拉方法(折线法)
yi+1=yi+h f(xi,yi) (i =0,1, …, n-1)
优点:计算简单。
缺点:一阶精度。
二改进的欧拉方法
改进的欧拉公式可改写为
它每一步计算f(x,y)两次,截断误差为O(h3)
精确解:
function [t,y] = Heun(ode,tspan,h,y0)
t = (tspan(1):h:tspan(end))';
n = length(t);
y = y0*ones(n,1);
for i=2:n
k1 = feval(ode,t(i-1),y(i-1));
k2 = feval(ode,t(i),y(i-1)+h*k1);
y(i) = y(i-1)+h*(k1+k2)/2;
end
三龙格—库塔法(Runge-Kutta)
欧拉公式可改写为
它每一步计算 f (xi,yi) 一次,截断误差为O(h2)
标准四阶龙格—库塔公式
每一步计算 f (x, y) 四次,截断误差为O(h5)
0
1/2
1/2
1/2
0
1/2
1
0
0
1
1/6
2/6
2/6
1/6
对于两个分量的一阶常微分方程组
用经典4阶 Runge-Kutta 法求解的格式为
n 级显式Runge-Kutta 方法的一般计算格式:
其中
Adams 外插公式(Adams-Bashforth 公式)是一类 k+1 步 k+1 阶显式方法
三步法(k=2),
四步法(k=3),
Adams 内插公式(Adams-Moulton 公式)是一类 k+1 步 k+2 阶隐式方法
三步法(k=2),
Adams 预估-校正方法(Adams-Bashforth-Moulton 公式)
一般取四步外插法与三步内插法结合。
#include <>
#include <>
#include <>
#define TRUE 1
main()
{
int nstep_pr, j, k;
float h, hh, k1, k2, k3, k4, t_old, t_limit, t_mid, t_new, t_pr, y, ya, yn;
double fun();
printf( "\n Fourth-Order Runge-Kutta Scheme \n" );
while(TRUE){
printf( "Interval of t for printing ?\n" );
scanf( "%f", &t_pr );
printf( "Number of steps in one printing interval?\n" );
scanf( "%d", &nstep_pr );
printf( "Maximum t?\n" );
scanf( "%f", &t_limit );
y = ; /* Setting the initial value of the solution */
h = t_pr/nstep_pr;
printf( "h=%g \n", h );
t_new = 0; /* Time is initialized. */
hh = h/2;
printf( "--------------------------------------\n" );
printf( " t y\n" );
printf( "--------------------------------------\n" );
printf( " % % \n", t_new, y );