RKMethods.mw

Runge-Kutta Methods 

An IVP in Standard Form 

The standard form for an IVP is the system of Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn(-order ODEs, with initial conditions: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

 

diff(Y(t), t) = F(t, Y(t))
Y(t[0]) = Y0 (1)
 

where Typesetting:-mrow(Typesetting:-mi( is a vector of functions and Typesetting:-mrow(Typesetting:-mi( is a vector function of the scalar Typesetting:-mrow(Typesetting:-mi( and the vector Typesetting:-mrow(Typesetting:-mi(. 

 

>
 

A 4th-order IVP 

 

Let us use the following problem to test our numerical methods. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(diff(diff(diff(diff(y(t), t), t), t), t), `*`(2, `*`(t, `*`(sin(t), `*`(diff(diff(diff(y(t), t), t), t))))), `-`(`/`(`*`(diff(y(t), t)), `*`(t)))) = `*`(t, `*`(exp(`+`(`-`(`*`(4, `*`(t))))))) (2)
 

with initial conditions 

 

> Typesetting:-mrow(Typesetting:-mi(
 

y(1) = 0, (D(y))(1) = .5, ((`@@`(D, 2))(y))(1) = .1, ((`@@`(D, 3))(y))(1) = 0 (3)
 

>
 

 

The above inital value problem can be converted to a first-order system as follows. Introduce a new set of dependent variables: 

 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

 

 

 

y[1](t) = y(t)
y[2](t) = diff(y(t), t)
y[3](t) = diff(diff(y(t), t), t)
y[4](t) = diff(diff(diff(y(t), t), t), t) (4)
 

>
 

 

In terms of the new functions Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( the original Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn(-order ODE becomes the following first-order system. 

 

> Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
 

 

 

 

diff(y[1](t), t) = y[2](t)
diff(y[2](t), t) = y[3](t)
diff(y[3](t), t) = y[4](t)
diff(y[4](t), t) = `+`(`-`(`*`(2, `*`(t, `*`(sin(t), `*`(y[4](t)))))), `/`(`*`(y[2](t)), `*`(t)), `*`(t, `*`(exp(`+`(`-`(`*`(4, `*`(t)))))))) (5)
 

with initial conditions 

 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

y[1](1) = 0, y[2](1) = .5, y[3](1) = .1, y[4](1) = 0 (6)
 

>
 

 

This now takes the form of a standard first-order system: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

diff(Y(t), t) = F(t, Y)
Y(1) = Y1 (7)
 

 

where Typesetting:-mrow(Typesetting:-mi( is a vector of dimension 4 and Typesetting:-mrow(Typesetting:-mi( is a vector function of dimension 4 taking as arguments Typesetting:-mrow(Typesetting:-mi( and the vector Typesetting:-mrow(Typesetting:-mi(. Specifically, 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Typesetting:-mrow(Typesetting:-mverbatim( (8)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Typesetting:-mrow(Typesetting:-mverbatim( (9)
 

 

The initial conditions are specified by the vector Typesetting:-mrow(Typesetting:-mi( : 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Typesetting:-mrow(Typesetting:-mverbatim( (10)
 

>
 

Comparison Values 

For comparison values when testing our numerical methods, apply the high-order method dverk78 to the original Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn(-order ODE. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(diff(diff(diff(diff(y(t), t), t), t), t), `*`(2, `*`(t, `*`(sin(t), `*`(diff(diff(diff(y(t), t), t), t))))), `-`(`/`(`*`(diff(y(t), t)), `*`(t)))) = `*`(t, `*`(exp(`+`(`-`(`*`(4, `*`(t))))))) (11)
 

> Typesetting:-mrow(Typesetting:-mi(
 

y(1) = 0, (D(y))(1) = .5, ((`@@`(D, 2))(y))(1) = .1, ((`@@`(D, 3))(y))(1) = 0 (12)
 

> Typesetting:-mrow(Typesetting:-mi(
 

proc (x_dverk78) local res, data, vars, solnproc, outpoint, ndsol, i; option `Copyright (c) 2000 by Waterloo Maple Inc. All rights reserved.`; `:=`(_EnvDSNumericSaveDigits, Digits); `:=`(Digits, 14); ... (13)
 

 

For example: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

4.2 (14)
 

> Typesetting:-mrow(Typesetting:-mi(
 

[t = 4.20000000000000016, y(t) = 2.69988538740093586, diff(y(t), t) = 1.72666950368022687, diff(diff(y(t), t), t) = 2.79161521800559286, diff(diff(diff(y(t), t), t), t) = 15.5902337896826674]
[t = 4.20000000000000016, y(t) = 2.69988538740093586, diff(y(t), t) = 1.72666950368022687, diff(diff(y(t), t), t) = 2.79161521800559286, diff(diff(diff(y(t), t), t), t) = 15.5902337896826674]
(15)
 

> Typesetting:-mrow(Typesetting:-mi(
 

2.69988538740093586 (16)
 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Runge-Kutta Method of Order 1 

We have already seen a basic numerical time-stepping method of order 1, namely the Forward Euler Method: 

 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

Y[`+`(n, 1)] = `+`(Y[n], `*`(h, `*`(F(t[n], Y[n])))) (17)
 

 

In the class of Runge-Kutta methods discussed below, the Forward Euler Method is a Runge-Kutta method of order 1. 

 

>
 

 

Recall that the above formula is derived from the Taylor series expansion 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`≈`(Y(`+`(t[n], h)), series(`+`(Y(t[n]), `*`((D(Y))(t[n]), `*`(h)))+O(`^`(h, 2)),h,2)) (18)
 

and by dropping the term Typesetting:-mrow(Typesetting:-mi( we arrive at the Forward Euler Method. 

 

It follows that this method has local truncation error Typesetting:-mrow(Typesetting:-mi( which leads to a global truncation error Typesetting:-mrow(Typesetting:-mi(. Hence the method is order 1. 

 

>
 

Test Order of Accuracy: RK1 

 

The following procedure defines the method RK1 (otherwise known as the Forward Euler Method). 

 

> Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

The IVP to be solved is 

 

> Typesetting:-mrow(Typesetting:-mi(
 

proc (t, Y) options operator, arrow; Vector([Y[2], Y[3], Y[4], `+`(`-`(`*`(2, `*`(t, `*`(sin(t), `*`(Y[4]))))), `/`(`*`(Y[2]), `*`(t)), `*`(t, `*`(exp(`+`(`-`(`*`(4, `*`(t))))))))]) end proc (19)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 151434492) (20)
 

>
 

 

Compute the solution a number of times specified by Typesetting:-mrow(Typesetting:-mi(, dividing the stepsize Typesetting:-mrow(Typesetting:-mi( by 2 each time. 

 

For each stepsize Typesetting:-mrow(Typesetting:-mi(, compare the computed result at Typesetting:-mrow(Typesetting:-mi( of the Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn( component of Typesetting:-mrow(Typesetting:-mi( (which corresponds to the original Typesetting:-mrow(Typesetting:-mi(), with the value Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

10 (21)
 

> Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mi(
 

1.0, 2.0 (22)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.4 (23)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
 

> Typesetting:-mrow(Typesetting:-mi(
 

0.3906250000e-3 (24)
 

> Typesetting:-mrow(Typesetting:-mi(
 

2560 (25)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 150408840) (26)
 

>
 

Compute successive ratios 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

 

 

.5177983051
.5069727623
.5030949137
.5014587289
.5007082322
.5003489405
.5001730487
.5000860883
.5000435240 (27)
 

>
 

The ratio is approximately  Typesetting:-mrow(Typesetting:-mfrac(Typesetting:-mrow(Typesetting:-mn(  . 

Conclusion:  Since  Typesetting:-mrow(Typesetting:-mi(  with  Typesetting:-mrow(Typesetting:-mi(  we conclude that RK1 is of order 1. 

>
 

A Runge-Kutta Method of Order 2 

We have previously developed a numerical time-stepping formula with a higher order, namely the Modified Euler Method which has order 2. 

 

The Modified Euler Method can be stated in the following form, which is a common form for presenting Runge-Kutta formulas. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

 

 

k[1] = `*`(h, `*`(F(t[n], y[n])))
k[2] = `*`(h, `*`(F(`+`(t[n], h), `+`(y[n], k[1]))))
y[`+`(n, 1)] = `+`(y[n], `*`(`/`(1, 2), `*`(k[1])), `*`(`/`(1, 2), `*`(k[2]))) (28)
 

>
 

 

Recall that the above formula is based on the Taylor series expansion 

 

> Typesetting:-mrow(Typesetting:-mi(
 

`≈`(Y(`+`(t[n], h)), series(`+`(Y(t[n]), `*`((D(Y))(t[n]), `*`(h)), `*`(`*`(`/`(1, 2), `*`(((`@@`(D, 2))(Y))(t[n]))), `*`(`^`(h, 2))))+O(`^`(h, 3)),h,3)) (29)
 

by dropping the term Typesetting:-mrow(Typesetting:-mi( 

 

It follows that this method has local truncation error Typesetting:-mrow(Typesetting:-mi( which leads to a global truncation error Typesetting:-mrow(Typesetting:-mi(. Hence the method is order 2. 

 

>
 

Test Order of Accuracy: RK2 

 

 

The following procedure defines the method RK2 (otherwise known as the Modified Euler Method). 

 

> Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compute the solution a number of times specified by Typesetting:-mrow(Typesetting:-mi(, dividing the stepsize Typesetting:-mrow(Typesetting:-mi( by 2 each time. 

 

For each stepsize Typesetting:-mrow(Typesetting:-mi(, compare the computed result at Typesetting:-mrow(Typesetting:-mi( of the Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn( component of Typesetting:-mrow(Typesetting:-mi( (which corresponds to the original Typesetting:-mrow(Typesetting:-mi(), with the value Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

10 (30)
 

> Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mi(
 

1.0, 2.0 (31)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.4 (32)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
 

> Typesetting:-mrow(Typesetting:-mi(
 

0.3906250000e-3 (33)
 

> Typesetting:-mrow(Typesetting:-mi(
 

2560 (34)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 150401424) (35)
 

>
 

Compute successive ratios 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

 

 

.2346818663
.2386455813
.2434862028
.2465327920
.2482316534
.2490353221
.2497020262
.2482100239
.2500000000 (36)
 

>
 

The ratio is approximately  Typesetting:-mrow(Typesetting:-mi( . 

Conclusion:  Since  Typesetting:-mrow(Typesetting:-mi(  with  Typesetting:-mrow(Typesetting:-mi(  we conclude that RK2 is of order 2. 

>
 

A Runge-Kutta Method of Order 3 

For each order greater than Typesetting:-mrow(Typesetting:-mn( there is more than one possible Runge-Kutta method of the specified order. 

 

The following is a Runge-Kutta method of order 3. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

 

 

 

k[1] = `*`(h, `*`(F(t[n], y[n])))
k[2] = `*`(h, `*`(F(`+`(t[n], `*`(`/`(1, 3), `*`(h))), `+`(y[n], `*`(`/`(1, 3), `*`(k[1]))))))
k[3] = `*`(h, `*`(F(`+`(t[n], `*`(`/`(2, 3), `*`(h))), `+`(y[n], `*`(`/`(2, 3), `*`(k[2]))))))
y[`+`(n, 1)] = `+`(y[n], `*`(`/`(1, 4), `*`(k[1])), `*`(`/`(3, 4), `*`(k[3]))) (37)
 

>
 

 

Note that for this particular choice of parameters, the value Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( does not appear in the final formula although it is used in defining Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(. 

The parameters have been chosen to ensure that the local truncation error is Typesetting:-mrow(Typesetting:-mi( and therefore the global truncation error is Typesetting:-mrow(Typesetting:-mi(. 

 

>
 

Test Order of Accuracy: RK3 

 

The following procedure defines the method RK3. 

 

> Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compute the solution a number of times specified by Typesetting:-mrow(Typesetting:-mi(, dividing the stepsize Typesetting:-mrow(Typesetting:-mi( by 2 each time. 

 

For each stepsize Typesetting:-mrow(Typesetting:-mi(, compare the computed result at Typesetting:-mrow(Typesetting:-mi( of the Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn( component of Typesetting:-mrow(Typesetting:-mi( (which corresponds to the original Typesetting:-mrow(Typesetting:-mi(), with the value Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

10 (38)
 

> Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mi(
 

1.0, 2.0 (39)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.4 (40)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
 

> Typesetting:-mrow(Typesetting:-mi(
 

0.3906250000e-3 (41)
 

> Typesetting:-mrow(Typesetting:-mi(
 

2560 (42)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 151466412) (43)
 

>
 

Compute successive ratios 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

.1375376533
.1275768406
.1255042582
.1250000000
.1285714286 (44)
 

>
 

The ratio is approximately Typesetting:-mrow(Typesetting:-mfrac(Typesetting:-mn( . 

(Note that with a higher order method, the computed results stop improving because we reach the maximum accuracy for the given precision of the floating point arithmetic.) 

 

Conclusion:  Since  Typesetting:-mrow(Typesetting:-mi(  with  Typesetting:-mrow(Typesetting:-mi(  we conclude that RK3 is of order 3. 

>
 

A Runge-Kutta Method of Order 4 

The following is the most common Runge-Kutta method of order 4, as stated in the CS 370 Course Notes. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
 

 

 

 

 

k[1] = `*`(h, `*`(F(t[n], y[n])))
k[2] = `*`(h, `*`(F(`+`(t[n], `*`(`/`(1, 2), `*`(h))), `+`(y[n], `*`(`/`(1, 2), `*`(k[1]))))))
k[3] = `*`(h, `*`(F(`+`(t[n], `*`(`/`(1, 2), `*`(h))), `+`(y[n], `*`(`/`(1, 2), `*`(k[2]))))))
k[4] = `*`(h, `*`(F(`+`(t[n], h), `+`(y[n], k[3]))))
y[`+`(n, 1)] = `+`(y[n], `*`(`/`(1, 6), `*`(k[1])), `*`(`/`(1, 3), `*`(k[2])), `*`(`/`(1, 3), `*`(k[3])), `*`(`/`(1, 6), `*`(k[4]))) (45)
 

>
 

 

The parameters have been chosen to ensure that the local truncation error is Typesetting:-mrow(Typesetting:-mi( and therefore the global truncation error is Typesetting:-mrow(Typesetting:-mi(. 

 

>
 

Test Order of Accuracy: RK4 

 

The following procedure defines the method RK4. 

 

> Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compute the solution a number of times specified by Typesetting:-mrow(Typesetting:-mi(, dividing the stepsize Typesetting:-mrow(Typesetting:-mi( by 2 each time. 

 

For each stepsize Typesetting:-mrow(Typesetting:-mi(, compare the computed result at Typesetting:-mrow(Typesetting:-mi( of the Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn( component of Typesetting:-mrow(Typesetting:-mi( (which corresponds to the original Typesetting:-mrow(Typesetting:-mi(), with the value Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

10 (46)
 

> Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mi(
 

1.0, 2.0 (47)
 

 

Start with a larger value of Typesetting:-mrow(Typesetting:-mi( because the errors get very small quickly with this Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn(-order method. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

4.0 (48)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
Typesetting:-mrow(Typesetting:-mo(
 

> Typesetting:-mrow(Typesetting:-mi(
 

0.3906250000e-2 (49)
 

> Typesetting:-mrow(Typesetting:-mi(
 

256 (50)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 150401568) (51)
 

>
 

Compute successive ratios 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

0.4122480535e-1
0.8178463504e-2
0.4566900029e-1
.1041921970
0.7166301969e-1
0.6488549618e-1
0.5882352941e-1 (52)
 

>
 

The ratio is converging to approximately Typesetting:-mrow(Typesetting:-mfrac(Typesetting:-mn( . 

(Note that to get a better measure of the ratios, one would need to compute with higher-precision floating point.) 

 

Conclusion:  Since  Typesetting:-mrow(Typesetting:-mi(  with  Typesetting:-mrow(Typesetting:-mi(  we conclude that RK4 is of order 4. 

>