Order Conditions for Runge Kutta Methods

The general Runge Kutta method for integrating x'=f(x) is as follows. Given x[n]  an approximation to x(t[n]) , we find x[n+1] , an approximation to x(t[n+1]) ,  by (1) finding k[1] , k[2] ,..., k[s] , which satisfy       k[i] = f(x[n]+h*sum(a[i,j]*k[k],j = 1 .. s))   (here s is the number of "stages" of the method,  the a[i,j]  are constants and h = t[n+1]-t[n] ), and (2) setting    x[n+1] = x[n]+h*sum(w[i]*k[i],i = 1 .. s)   (the w_i are also constants).  If the a[i,j]  are zero when j is greater than i we say the method is explicit.

We say the method is of order p if, assuming   x[n]  is exact, the error in x[n+1]  is of order h^(p+1)  . Order conditions (at least for relatively low orders) can be computed by simple Taylor expansions. There is a single order condition of orders 1 and 2, 2 of order 3 and 4 of order 4. These equations are given below:

>     restart;

>    e1:= sum(w[i],i=1..d)=1;

e1 := sum(w[i],i = 1 .. d) = 1

>    e2:= sum(w[i]*sum(a[i,j],j=1..d),i=1..d)=1/2;

e2 := sum(w[i]*sum(a[i,j],j = 1 .. d),i = 1 .. d) = 1/2

>    e3:=sum(w[i]*sum(a[i,j],j=1..d)^2,i=1..d)=1/3;

e3 := sum(w[i]*sum(a[i,j],j = 1 .. d)^2,i = 1 .. d) = 1/3

>    e4:= sum(w[i]*sum(sum(a[i,j]*a[j,k],k=1..d),j=1..d),i=1..d)=1/6;

e4 := sum(w[i]*sum(sum(a[i,j]*a[j,k],k = 1 .. d),j = 1 .. d),i = 1 .. d) = 1/6

>    e5:=sum(w[i]*sum(a[i,j],j=1..d)^3,i=1..d)=1/4;

e5 := sum(w[i]*sum(a[i,j],j = 1 .. d)^3,i = 1 .. d) = 1/4

>    e6:=sum(w[i]*sum(a[i,j],j=1..d)*sum(sum(a[i,j]*a[j,k],k=1..d),j=1..d),i=1..d)=1/8;

e6 := sum(w[i]*sum(a[i,j],j = 1 .. d)*sum(sum(a[i,j]*a[j,k],k = 1 .. d),j = 1 .. d),i = 1 .. d) = 1/8

>    e7:= sum(sum(w[i]*a[i,j]*(sum(a[j,k],k=1..d))^2,j=1..d),i=1..d)=1/12;

e7 := sum(sum(w[i]*a[i,j]*sum(a[j,k],k = 1 .. d)^2,j = 1 .. d),i = 1 .. d) = 1/12

>    e8:= sum(w[i]*sum(sum(sum(a[i,j]*a[j,k]*a[k,l],l=1..d),k=1..d),j=1..d),i=1..d)=1/24;

e8 := sum(w[i]*sum(sum(sum(a[i,j]*a[j,k]*a[k,l],l = 1 .. d),k = 1 .. d),j = 1 .. d),i = 1 .. d) = 1/24

We are going to concerning oursleves with 4-stage explicit methods. In other words we set

>    d:=4; a[1,1]:=0; a[1,2]:=0; a[1,3]:=0; a[1,4]:=0; a[2,2]:=0; a[2,3]:=0; a[2,4]:=0; a[3,3]:=0; a[3,4]:=0; a[4,4]:=0;

d := 4

a[1,1] := 0

a[1,2] := 0

a[1,3] := 0

a[1,4] := 0

a[2,2] := 0

a[2,3] := 0

a[2,4] := 0

a[3,3] := 0

a[3,4] := 0

a[4,4] := 0

to get

>    e1;

w[1]+w[2]+w[3]+w[4] = 1

>    e2;

w[2]*a[2,1]+w[3]*(a[3,1]+a[3,2])+w[4]*(a[4,1]+a[4,2]+a[4,3]) = 1/2

>    e3;

w[2]*a[2,1]^2+w[3]*(a[3,1]+a[3,2])^2+w[4]*(a[4,1]+a[4,2]+a[4,3])^2 = 1/3

>    e4;

w[3]*a[3,2]*a[2,1]+w[4]*(a[4,2]*a[2,1]+a[4,3]*a[3,1]+a[4,3]*a[3,2]) = 1/6

>    e5;

w[2]*a[2,1]^3+w[3]*(a[3,1]+a[3,2])^3+w[4]*(a[4,1]+a[4,2]+a[4,3])^3 = 1/4

>    e6;

w[3]*(a[3,1]+a[3,2])*a[3,2]*a[2,1]+w[4]*(a[4,1]+a[4,2]+a[4,3])*(a[4,2]*a[2,1]+a[4,3]*a[3,1]+a[4,3]*a[3,2]) = 1/8

>    e7;

w[3]*a[3,2]*a[2,1]^2+w[4]*a[4,2]*a[2,1]^2+w[4]*a[4,3]*(a[3,1]+a[3,2])^2 = 1/12

>    e8;

w[4]*a[4,3]*a[3,2]*a[2,1] = 1/24

There are 8 equations. We can get rid of w1,w2,w3,w4 which appear linearly:

>    solve({e1,e2,e4,e8},{w[1],w[2],w[3],w[4]});

{w[2] = 1/24*(a[4,3]*a[3,2]^2+12*a[4,3]*a[3,2]^2*a[2,1]^2-a[3,2]*a[2,1]*a[4,1]-a[4,3]*a[3,2]*a[2,1]+2*a[4,3]*a[3,2]*a[3,1]-4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+a[3,1]*a[4,2]*a[2,1]+a[4,3]*a[3,1]^2-4*a[4,3]*a[...
{w[2] = 1/24*(a[4,3]*a[3,2]^2+12*a[4,3]*a[3,2]^2*a[2,1]^2-a[3,2]*a[2,1]*a[4,1]-a[4,3]*a[3,2]*a[2,1]+2*a[4,3]*a[3,2]*a[3,1]-4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+a[3,1]*a[4,2]*a[2,1]+a[4,3]*a[3,1]^2-4*a[4,3]*a[...
{w[2] = 1/24*(a[4,3]*a[3,2]^2+12*a[4,3]*a[3,2]^2*a[2,1]^2-a[3,2]*a[2,1]*a[4,1]-a[4,3]*a[3,2]*a[2,1]+2*a[4,3]*a[3,2]*a[3,1]-4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+a[3,1]*a[4,2]*a[2,1]+a[4,3]*a[3,1]^2-4*a[4,3]*a[...
{w[2] = 1/24*(a[4,3]*a[3,2]^2+12*a[4,3]*a[3,2]^2*a[2,1]^2-a[3,2]*a[2,1]*a[4,1]-a[4,3]*a[3,2]*a[2,1]+2*a[4,3]*a[3,2]*a[3,1]-4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+a[3,1]*a[4,2]*a[2,1]+a[4,3]*a[3,1]^2-4*a[4,3]*a[...
{w[2] = 1/24*(a[4,3]*a[3,2]^2+12*a[4,3]*a[3,2]^2*a[2,1]^2-a[3,2]*a[2,1]*a[4,1]-a[4,3]*a[3,2]*a[2,1]+2*a[4,3]*a[3,2]*a[3,1]-4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+a[3,1]*a[4,2]*a[2,1]+a[4,3]*a[3,1]^2-4*a[4,3]*a[...

>    assign(%);

Note the need to assume a[2,1] , a[3,2] , a[4,3]  all nonzero. Using the above values we reduce to 4 equations in the 6 a's. Simplifying a bit we need the following 4 quantities to vanish:

>    z1:=numer(simplify(op(1,e3)))-denom(simplify(op(1,e3)))*op(2,e3);

z1 := 2*a[4,3]*a[3,2]*a[2,1]*a[3,1]-12*a[4,3]*a[3,2]^2*a[2,1]^2+a[4,3]*a[3,2]^2*a[2,1]-a[4,3]*a[3,2]*a[2,1]^2+12*a[3,2]^2*a[2,1]^3*a[4,3]-a[4,3]*a[3,2]^3-a[4,3]*a[3,1]^3-4*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]...
z1 := 2*a[4,3]*a[3,2]*a[2,1]*a[3,1]-12*a[4,3]*a[3,2]^2*a[2,1]^2+a[4,3]*a[3,2]^2*a[2,1]-a[4,3]*a[3,2]*a[2,1]^2+12*a[3,2]^2*a[2,1]^3*a[4,3]-a[4,3]*a[3,2]^3-a[4,3]*a[3,1]^3-4*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]...
z1 := 2*a[4,3]*a[3,2]*a[2,1]*a[3,1]-12*a[4,3]*a[3,2]^2*a[2,1]^2+a[4,3]*a[3,2]^2*a[2,1]-a[4,3]*a[3,2]*a[2,1]^2+12*a[3,2]^2*a[2,1]^3*a[4,3]-a[4,3]*a[3,2]^3-a[4,3]*a[3,1]^3-4*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]...
z1 := 2*a[4,3]*a[3,2]*a[2,1]*a[3,1]-12*a[4,3]*a[3,2]^2*a[2,1]^2+a[4,3]*a[3,2]^2*a[2,1]-a[4,3]*a[3,2]*a[2,1]^2+12*a[3,2]^2*a[2,1]^3*a[4,3]-a[4,3]*a[3,2]^3-a[4,3]*a[3,1]^3-4*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]...

>    z2:=numer(simplify(op(1,e5)))-denom(simplify(op(1,e5)))*op(2,e5);

z2 := -5*a[4,3]*a[3,2]^2*a[2,1]^2-4*a[3,2]^2*a[2,1]^3*a[4,3]+2*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]+6*a[3,2]*a[2,1]*a[4,1]*a[4,2]*a[4,3]+12*a[2,1]^4*a[4,3]*a[3,2]^2-a[2,1]^3*a[3,2]*a[4,1]-a[2,1]^3*a[4,3]*a[3,...
z2 := -5*a[4,3]*a[3,2]^2*a[2,1]^2-4*a[3,2]^2*a[2,1]^3*a[4,3]+2*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]+6*a[3,2]*a[2,1]*a[4,1]*a[4,2]*a[4,3]+12*a[2,1]^4*a[4,3]*a[3,2]^2-a[2,1]^3*a[3,2]*a[4,1]-a[2,1]^3*a[4,3]*a[3,...
z2 := -5*a[4,3]*a[3,2]^2*a[2,1]^2-4*a[3,2]^2*a[2,1]^3*a[4,3]+2*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]+6*a[3,2]*a[2,1]*a[4,1]*a[4,2]*a[4,3]+12*a[2,1]^4*a[4,3]*a[3,2]^2-a[2,1]^3*a[3,2]*a[4,1]-a[2,1]^3*a[4,3]*a[3,...
z2 := -5*a[4,3]*a[3,2]^2*a[2,1]^2-4*a[3,2]^2*a[2,1]^3*a[4,3]+2*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]+6*a[3,2]*a[2,1]*a[4,1]*a[4,2]*a[4,3]+12*a[2,1]^4*a[4,3]*a[3,2]^2-a[2,1]^3*a[3,2]*a[4,1]-a[2,1]^3*a[4,3]*a[3,...
z2 := -5*a[4,3]*a[3,2]^2*a[2,1]^2-4*a[3,2]^2*a[2,1]^3*a[4,3]+2*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]+6*a[3,2]*a[2,1]*a[4,1]*a[4,2]*a[4,3]+12*a[2,1]^4*a[4,3]*a[3,2]^2-a[2,1]^3*a[3,2]*a[4,1]-a[2,1]^3*a[4,3]*a[3,...
z2 := -5*a[4,3]*a[3,2]^2*a[2,1]^2-4*a[3,2]^2*a[2,1]^3*a[4,3]+2*a[4,3]*a[3,2]*a[2,1]^2*a[3,1]+6*a[3,2]*a[2,1]*a[4,1]*a[4,2]*a[4,3]+12*a[2,1]^4*a[4,3]*a[3,2]^2-a[2,1]^3*a[3,2]*a[4,1]-a[2,1]^3*a[4,3]*a[3,...

>    z3:=numer(simplify(op(1,e6)))-denom(simplify(op(1,e6)))*op(2,e6);

z3 := -2*a[4,3]*a[3,2]*a[3,1]-a[4,3]*a[3,2]^2+4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+4*a[4,3]*a[3,2]^2*a[2,1]-a[3,1]*a[4,2]*a[2,1]-a[4,2]*a[2,1]*a[3,2]-a[4,3]*a[3,1]^2+a[4,1]*a[4,2]*a[2,1]+a[4,1]*a[4,3]*a[3,1]+...
z3 := -2*a[4,3]*a[3,2]*a[3,1]-a[4,3]*a[3,2]^2+4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+4*a[4,3]*a[3,2]^2*a[2,1]-a[3,1]*a[4,2]*a[2,1]-a[4,2]*a[2,1]*a[3,2]-a[4,3]*a[3,1]^2+a[4,1]*a[4,2]*a[2,1]+a[4,1]*a[4,3]*a[3,1]+...
z3 := -2*a[4,3]*a[3,2]*a[3,1]-a[4,3]*a[3,2]^2+4*a[4,3]*a[3,2]*a[2,1]*a[3,1]+4*a[4,3]*a[3,2]^2*a[2,1]-a[3,1]*a[4,2]*a[2,1]-a[4,2]*a[2,1]*a[3,2]-a[4,3]*a[3,1]^2+a[4,1]*a[4,2]*a[2,1]+a[4,1]*a[4,3]*a[3,1]+...

>    z4:=numer(simplify(op(1,e7)))-denom(simplify(op(1,e7)))*op(2,e7);

z4 := -3*a[3,2]*a[2,1]+4*a[3,2]*a[2,1]^2-a[2,1]*a[3,1]+a[3,1]^2+2*a[3,1]*a[3,2]+a[3,2]^2

Check usual cases work:

>    sol1:= {a[3,1]=0,a[4,1]=0,a[4,2]=0,a[2,1]=1/2,a[3,2]=1/2,a[4,3]=1} ;

sol1 := {a[3,1] = 0, a[4,1] = 0, a[3,2] = 1/2, a[4,3] = 1, a[4,2] = 0, a[2,1] = 1/2}

>    factor(subs(sol1, z1));  factor(subs( sol1, z2));  factor(subs( sol1, z3));  factor(subs( sol1, z4));

0

0

0

0

>    sol2:={a[3,1]=-1/3,a[4,1]=1,a[4,2]=-1,a[2,1]=1/3,a[3,2]=1,a[4,3]=1};

sol2 := {a[4,3] = 1, a[3,2] = 1, a[4,2] = -1, a[2,1] = 1/3, a[4,1] = 1, a[3,1] = -1/3}

>    factor(subs( sol2, z1));   factor(subs( sol2, z2));   factor(subs( sol2, z3));   factor(subs( sol2, z4));

0

0

0

0

I have searched for other solutions (e.g. there with a[2,1]=a[3,2]=a[4,3]  which is the right number of constraints), but with no success.