EulerMethods.mw

Numerical Solution of IVPs 

Define an Initial Value Problem 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

proc (t, y) options operator, arrow; `+`(`*`(`/`(1, 2), `*`(y)), `-`(`*`(sin(`+`(`*`(2, `*`(t)))), `*`(exp(`+`(`*`(`/`(1, 2), `*`(t))))))), `-`(`*`(2, `*`(t))), 3.75) end proc (1)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

{y(0) = 1, diff(y(t), t) = `+`(`*`(`/`(1, 2), `*`(y(t))), `-`(`*`(sin(`+`(`*`(2, `*`(t)))), `*`(exp(`+`(`*`(`/`(1, 2), `*`(t))))))), `-`(`*`(2, `*`(t))), 3.75)} (2)
 

 

The solution is to be computed for the range Typesetting:-mrow(Typesetting:-mi( and define Typesetting:-mrow(Typesetting:-mi( . 

 

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

0., 8.0 (3)
 

> Typesetting:-mrow(Typesetting:-mi(
 

1 (4)
 

 

For this example, the exact solution can be expressed in closed form. This will allow us to compare our numerical solution with the exact result. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

y(t) = `+`(`*`(`/`(1, 2), `*`(exp(`+`(`*`(`/`(1, 2), `*`(t)))), `*`(cos(`+`(`*`(2, `*`(t))))))), `*`(4, `*`(t)), `/`(1, 2)) (5)
 

> Typesetting:-mrow(Typesetting:-mi(
 

proc (t) options operator, arrow; `+`(`*`(`/`(1, 2), `*`(exp(`+`(`*`(`/`(1, 2), `*`(t)))), `*`(cos(`+`(`*`(2, `*`(t))))))), `*`(4, `*`(t)), `/`(1, 2)) end proc (6)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Maple's default numerical solution 

 

> Typesetting:-mrow(Typesetting:-mi(
 

{y(0) = 1, diff(y(t), t) = `+`(`*`(`/`(1, 2), `*`(y(t))), `-`(`*`(sin(`+`(`*`(2, `*`(t)))), `*`(exp(`+`(`*`(`/`(1, 2), `*`(t))))))), `-`(`*`(2, `*`(t))), 3.75)} (7)
 

> Typesetting:-mrow(Typesetting:-mi(
 

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

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[t = 0., y(t) = 1.]
[t = .5, y(t) = 2.84688003514856680]
[t = 1.0, y(t) = 4.15693900420473738]
[t = 1.5, y(t) = 5.45208998206766094]
[t = 2.0, y(t) = 7.61160856693808086]
[t = 2.5, y(t) = 10.9950470149325170]
[t = 3.0, y(t) = 14.6516151895036498]
[t = 3.5, y(t) = 16.6691978752051356]
[t = 4.0, y(t) = 15.9624151708734114]
[t = 4.5, y(t) = 14.1777284577269924]
[t = 5.0, y(t) = 15.3890203724774679]
[t = 5.5, y(t) = 22.5346874399731334]
[t = 6.0, y(t) = 32.9747308455137898]
[t = 6.5, y(t) = 38.2017348585625101]
[t = 7.0, y(t) = 30.7640719817233618]
[t = 7.5, y(t) = 14.3486922558903594]
[t = 8.0, y(t) = 6.35686452032915028] (9)
 

 

Compare with the true solution at Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

6.356782010 (10)
 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Forward Euler Method 

The Forward Euler Method can be derived from the Taylor series expansion of Typesetting:-mrow(Typesetting:-mi( with local truncation error Typesetting:-mrow(Typesetting:-mi(. 

 

This is a method of order 1 because the global truncation error after Typesetting:-mrow(Typesetting:-mi( steps where Typesetting:-mrow(Typesetting:-mi( is:   Typesetting:-mrow(Typesetting:-mi(. 

 

 

> Typesetting:-mrow(Typesetting:-mi(
 

y(`+`(t[n], h)) = series(`+`(y(t[n]), `*`((D(y))(t[n]), `*`(h)))+O(`^`(h, 2)),h,2) (11)
 

 

Here Typesetting:-mrow(Typesetting:-mi( is the differentiation operator so Typesetting:-mrow(Typesetting:-mi(. 

 

The resulting formula for the numerical method is:  Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( where Typesetting:-mrow(Typesetting:-msub(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(
 

>
 

 

First solve the IVP for the range Typesetting:-mrow(Typesetting:-mi( with step size Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

4.0 (12)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.1 (13)
 

> Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compare the computed solution with the true solution at Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

40 (14)
 

> Typesetting:-mrow(Typesetting:-mo(
 

tfinal = 4.0 (15)
 

> Typesetting:-mrow(Typesetting:-mi(
 

16.49568145 (16)
 

> Typesetting:-mrow(Typesetting:-mi(
 

15.96244604 (17)
 

>
 

 

Plot the numerical values and the curve of the true solution. 

 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

 

Note that the numerical values are off the curve near Typesetting:-mrow(Typesetting:-mi( . 

 

 

Next, solve the IVP for the range Typesetting:-mrow(Typesetting:-mi( with the same step size Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

8.0 (18)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.1 (19)
 

> Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compare the computed solution with the true solution at Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

80 (20)
 

> Typesetting:-mrow(Typesetting:-mo(
 

tfinal = 8.0 (21)
 

> Typesetting:-mrow(Typesetting:-mi(
 

8.242183117 (22)
 

> Typesetting:-mrow(Typesetting:-mi(
 

6.356782010 (23)
 

>
 

 

Plot the numerical values and the curve of the true solution. 

 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

 

The numerical solution is not very accurate. 

 

 

This time, solve the IVP for the range Typesetting:-mrow(Typesetting:-mi( with a smaller step size Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

8.0 (24)
 

> Typesetting:-mrow(Typesetting:-mi(
 

0.1e-1 (25)
 

> Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compare the computed solution with the true solution at Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

800 (26)
 

> Typesetting:-mrow(Typesetting:-mo(
 

tfinal = 8.0 (27)
 

> Typesetting:-mrow(Typesetting:-mi(
 

6.549769162 (28)
 

> Typesetting:-mrow(Typesetting:-mi(
 

6.356782010 (29)
 

>
 

 

Plot the numerical values and the curve of the true solution. 

 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Modified Euler Method 

 

For the Modified Euler Method, we start with one more term in the Taylor series expansion of  Typesetting:-mrow(Typesetting:-mi(. This time the local truncation error is Typesetting:-mrow(Typesetting:-mi(. 

 

This is a method of order 2 because the global truncation error after Typesetting:-mrow(Typesetting:-mi( steps where Typesetting:-mrow(Typesetting:-mi( is:   Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

>
 

> 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) (30)
 

>
 

 

With Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( and Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( 

we have the following potential numerical formula:   Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

While we know that, as before, Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( we will have to approximate Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( in some manner. 

 

We will use the divided difference approximation:  Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

This leads to the following formula for the numerical method: 

 

Typesetting:-mrow(Typesetting:-mo( 

 

or, collecting terms 

       Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

From the IVP we know that  Typesetting:-mrow(Typesetting:-mi( so we have developed the following implicit formula for Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( : 

 

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

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

>
 

 

For the Modified Euler Method, we transform this into an explicit formula for Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( via a two-step method. 

 

Apply the Forward Euler Method to compute a first approximation for Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( : 

 

       Typesetting:-mrow(Typesetting:-msubsup(Typesetting:-mi( 

 

and then use this value in formula Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( to get 

 

       Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

>
 

 

The Modified Euler Method is one member of a class of methods known as Runge-Kutta methods. 

 

Specifically, this is a Runge-Kutta method of order 2. 

 

The formulas are often written in the following form. 

 

> 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]))) (32)
 

>
 

> 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(
 

>
 

 

Restore the definition of Typesetting:-mrow(Typesetting:-mi( for our particular IVP. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

proc (t, y) options operator, arrow; `+`(`*`(`/`(1, 2), `*`(y)), `-`(`*`(sin(`+`(`*`(2, `*`(t)))), `*`(exp(`+`(`*`(`/`(1, 2), `*`(t))))))), `-`(`*`(2, `*`(t))), 3.75) end proc (33)
 

>
 

 

Solve the IVP for the range Typesetting:-mrow(Typesetting:-mi( with step size Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

8.0 (34)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.1 (35)
 

> Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compare the computed solution with the true solution at Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

80 (36)
 

> Typesetting:-mrow(Typesetting:-mo(
 

tfinal = 8.0 (37)
 

> Typesetting:-mrow(Typesetting:-mi(
 

6.567795384 (38)
 

> Typesetting:-mrow(Typesetting:-mi(
 

6.356782010 (39)
 

>
 

 

The numerical value at Typesetting:-mrow(Typesetting:-mi( is more accurate than before. 

 

Also, note that the value at the point Typesetting:-mrow(Typesetting:-mi( is accurate to 3 significant figures this time. 

 

> Typesetting:-mrow(Typesetting:-mo(
 

t = 4.000000000 (40)
 

> Typesetting:-mrow(Typesetting:-mi(
 

15.97847341 (41)
 

> Typesetting:-mrow(Typesetting:-mi(
 

15.96244604 (42)
 

>
 

 

Plot the numerical values and the curve of the true solution. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

 

The computed solution follows the curve of the true solution much better with this method. 

 

>
 

 

Now solve the IVP for the range Typesetting:-mrow(Typesetting:-mi( with a smaller step size Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

8.0 (43)
 

> Typesetting:-mrow(Typesetting:-mi(
 

0.1e-1 (44)
 

> Typesetting:-mrow(Typesetting:-mi(
 

>
 

 

Compare the computed solution with the true solution at Typesetting:-mrow(Typesetting:-mi(. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

800 (45)
 

> Typesetting:-mrow(Typesetting:-mo(
 

tfinal = 8.0 (46)
 

> Typesetting:-mrow(Typesetting:-mi(
 

6.358903783 (47)
 

> Typesetting:-mrow(Typesetting:-mi(
 

6.356782010 (48)
 

>
 

 

Plot the numerical values and the curve of the true solution. 

 

>
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

Plot_2d
 

>
 

Test Order of Accuracy: ForwardEuler 

> Typesetting:-mrow(Typesetting:-mi(
 

10 (49)
 

> Typesetting:-mrow(Typesetting:-mi(
 

0., 8.0 (50)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.4 (51)
 

> 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:-mi(
 

0.3906250000e-3 (52)
 

> Typesetting:-mrow(Typesetting:-mi(
 

20480 (53)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 150375956) (54)
 

>
 

Compute successive ratios 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

 

 

.5111365698
.5063045155
.5033402515
.5017185468
.5008668034
.5004497676
.5002140901
.5002181423
.4999349182 (55)
 

>
 

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 ForwardEuler is of order 1. 

>
 

Test Order of Accuracy: ModifiedEuler 

 

> Typesetting:-mrow(Typesetting:-mi(
 

10 (56)
 

> Typesetting:-mrow(Typesetting:-mi(
 

0., 8.0 (57)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.4 (58)
 

> 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:-mi(
 

0.3906250000e-3 (59)
 

> Typesetting:-mrow(Typesetting:-mi(
 

20480 (60)
 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 150485568) (61)
 

>
 

Compute successive ratios 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

 

 

 

.2518735050
.2508342054
.2503909550
.2501801851
.2497060151
.2521544514
.2572185392
.1925920408
1.186037517 (62)
 

>
 

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 ModifiedEuler is of order 2. 

 

Effects of Roundoff Error 

 

Note that the last couple of values of Typesetting:-mrow(Typesetting:-mi( are contaminated by roundoff errors in computing the numerical solution, so they are meaningless. 

 

In fact, recall the number of steps used for computing the numerical solution that determined Typesetting:-mrow(Typesetting:-mi( : 

 

> Typesetting:-mrow(Typesetting:-mi(
 

20480 (63)
 

>
 

 

We know from our study of "Floating Point Arithmetic" that adding Typesetting:-mrow(Typesetting:-mi( numbers can incur a relative error of approximately Typesetting:-mrow(Typesetting:-mi( . (This is in the "best case" where we are adding numbers all of the same sign.) 

 

We are computing with Maple's default number of Digits and therefore Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( is as follows: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

10 (64)
 

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

0.5000000000e-9 (65)
 

 

Therefore, the accumulated roundoff error when computing the numerical method with Typesetting:-mrow(Typesetting:-mi( steps can be expected to be approximately: 

 

> Typesetting:-mrow(Typesetting:-mi(
 

0.1024000000e-4 (66)
 

 

I.e., Typesetting:-mrow(Typesetting:-mi( .  Note that it is precisely at this level of accuracy in the values of Typesetting:-mrow(Typesetting:-mi( that halving Typesetting:-mrow(Typesetting:-mi( fails to yield improved accuracy. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

Vector[column](%id = 150485568) (67)
 

>