ORDINARY DIFFERENTIAL EQUATIONS POWERTOOL
Unit 15 -- Improved Euler's Method
Industrial Mathematics Institute
Columbia, SC 29208
URL: http://www.math.sc.edu/~meade/
E-mail: meade@math.sc.edu
Copyright © 2001 by Douglas B. MeadeAll rights reserved
-------------------------------------------------------------------
>
Outline of Unit 15
>
Initialization
> restart;
> with( DEtools ):
> with( plots ):
> with( linalg ):
Warning, the name changecoords has been redefined
Warning, the name adjoint has been redefined
Warning, the protected names norm and trace have been redefined and unprotected
>
15.A Explicit Implementation of Improved Euler's Method
There is some inconsistency in the use of the names Improved Euler's Method and Modified Euler's Method. Typically, the Improved Euler Method is the method also known as the Trapezoid Method or Heun's Method.
The Improved Euler's method for the solution of a first-order IVP
,
can be summarized by the formula
(
)
where h is the stepsize.
By comparison, the Modified Euler's Method is typically defined to be
A simple implementation of Modified Euler's method that accepts the function F, initial time
, initial position
, stepsize
, and number of steps
as input would be
> ImprEuler0 := proc( F, x0, y0, h, N )
> local i, L, X, X1, X2;
> X := evalf( [ x0, y0 ] );
> L := X;
> for i from 1 to N do
> X1 := X + [ h, h*F(op(X)) ];
> X2 := X + [ h, h*F(op(X1)) ];
> X := (X1+X2)/2;
> L := L, X;
> end do;
> return matrix( N+1, 2, [ L ] );
> end proc;
>
As a test, compute the Euler's Method solution to
,
on the interval [ 0, 1 ] with
=0.1.
> ImprEuler0( (x,y)->-2*y, 0, 1, 0.1, 10 ):
>
A more sophisticated implementation of Euler's method would accept as input the ODE, the initial condition, the interval on which the solution should be computed, and the number of steps. In this case, the implementation could appear as
> ImprEuler := proc( ode, ic, domain, N )
> local h, i, t, y, F, L, X, X1, X2;
> t := lhs(domain);
> y := op(0,lhs(ic));
> h := ( op(2,rhs(domain))-op(1,rhs(domain)) )/N;
> F := unapply( subs( y(t)=_y, solve( ode, diff(y(t),t) ) ), (t,_y) );
> X := evalf( [ op(lhs(ic)), rhs(ic) ] );
> L := X;
> for i from 1 to N do
> X1 := X + [ h, h*F(op(X)) ];
> X2 := X + [ h, h*F(op(X1)) ];
> X := (X1 + X2)/2;
> L := L, X;
> end do;
> return matrix(N+2,2,[[t,y],L])
> end proc:
>
The approximate solution to the IVP
> ode1 := diff( y(x), x ) = -2*y(x);
> ic1 := y(0)=1;
>
on the interval [0,1] by Euler's Method with 10 subdivisions would be obtained with the command
> ImprEuler( ode1, ic1, x=0..1, 10 );
>
For a second example, use Euler's Method with
= 2, 4, and 8 subdivisions to find an approximate value for
where
> ode2 := diff( y(t), t )*sin(t) + y(t) = 3;
> ic2 := y(1)=2;
>
> a2 := 1;
> b2 := 2;
> N2 := [ 2, 4, 8 ];
> H2 := map( n->(b2-a2)/n, N2 );
>
> sol2 := ImprEuler( ode2, ic2, t=a2..b2, N2[1] ):
> Y2[1] := sol2[N2[1]+2,2];
>
> sol2 := ImprEuler( ode2, ic2, t=a2..b2, N2[2] ):
> Y2[2] := sol2[N2[2]+2,2];
>
> sol2 := ImprEuler( ode2, ic2, t=a2..b2, N2[3] ):
> Y2[3] := sol2[N2[3]+2,2];
>
These results can be summarized in a table
> v0 := vector( [ 'h', 'N', 'Y(2)' ] ):
> v1 := vector( [ H2[1], N2[1], Y2[1] ] ):
> v2 := vector( [ H2[2], N2[2], Y2[2] ] ):
> v3 := vector( [ H2[3], N2[3], Y2[3] ] ):
> stackmatrix( v0, v1, v2, v3 );
>
Implementations of Modified Euler's Method for a first-order system are not significantly different or more difficult, but will not be considered at this time.
>
15.B dsolve and Improved Euler's Method
To request the use of the Improved Euler Method in Maple's numerical computations, use method=classical[heunform] . The Modified Euler Method, or Improved Polygon Method, is used when method=classical[impoly] .
To illustrate, revisit the two examples considered in the previous section.
When an explicit table of values is needed, it is necessary to provide a list of values of the independent variable at which the approximate solution should be reported.
> x0 := 0:
> h1 := 0.1:
> N1 := 10:
> x_list := vector( N1+1, i -> x0 + (i-1)*h1 );
>
Then, the table of approximate solution values computed using Euler's Method is
> dsolve( { ode1, ic1 }, y(x), type=numeric,
> method=classical[heunform], stepsize=h1,
> value=x_list );
>
If the results are to be plotted, then the dsolve and odeplot commands can be used as follows
> sol := dsolve( { ode1, ic1 }, y(x), type=numeric,
> method=classical[heunform], stepsize=h1 ):
> odeplot( sol, [x,y(x)], 0..1 );
>
The table of results can be constructed using three calls to dsolve as follows:
> sol2 := dsolve( { ode2, ic2 }, y(t), type=numeric,
> method=classical[heunform], stepsize=H2[1] ):
> Y2[1] := eval( y(t), sol2(2) );
>
> sol2 := dsolve( { ode2, ic2 }, y(t), type=numeric,
> method=classical[heunform], stepsize=H2[2] ):
> Y2[2] := eval( y(t), sol2(2) );
>
> sol2 := dsolve( { ode2, ic2 }, y(t), type=numeric,
> method=classical[heunform], stepsize=H2[3] ):
> Y2[3] := eval( y(t), sol2(2) );
>
The resulting table is
> v0 := vector( [ 'h', 'N', 'Y(2)' ] ):
> v1 := vector( [ H2[1], N2[1], Y2[1] ] ):
> v2 := vector( [ H2[2], N2[2], Y2[2] ] ):
> v3 := vector( [ H2[3], N2[3], Y2[3] ] ):
> stackmatrix( v0, v1, v2, v3 );
>
The final example illustrates the use of the full range of Maple tools to obtain, visualize, and analyze an approximate solution to an IVP obtained by the Improved Euler's Method.
Consider the problem of obtaining a solution to the IVP
> ode3 := diff( y(t) , t ) = sin( y(t) ) ;
> ic3 := y(0) = 1;
>
on the interval [0,8].
The Improved Euler's Method with
= 4 subdivisions yields
> sol3ie := dsolve( { ode3, ic3 }, y(t), type=numeric, method=classical[heunform], stepsize=2 ):
> impreuler_plot := odeplot( sol3ie, [t,y(t)], 0..8, style=line,
> color=BLUE, numpoints=4 ):
> display( impreuler_plot );
>
To determine if this approximation is reasonable, superimpose this solution on the slope field.
> slope_field := DEplot( ode3, y(t), t=0..8, y=0..4, arrows=SMALL ):
> display( [ slope_field, impreuler_plot ] );
>
On the interval [0,2] the Improved Euler solution does not look too bad. However, on [2,4] the Euler solution does not follow the slope field and is a much poorer approximation to the true solution. Unlike the Euler Method solution, which crossed the equilibrium solution, the Improved Euler Method solution does not approach the equilibrium solution fast enough. To obtain a reasonable approximation on the entire interval using the Improved Euler's Method, a smaller stepsize is required.
> sol3ie2 := dsolve( { ode3, ic3 }, y(t), type=numeric,
> method=classical[heunform], stepsize=0.8 ):
> impreuler_plot2 := odeplot( sol3ie2, [t,y(t)], 0..8, style=line,
> color=CYAN, numpoints=10 ):
> display( [ slope_field, impreuler_plot2 ] );
>
To complete the evaluation of this approximate solution, the DEplot command is used to include the (Maple-generated approximate) solution curve for this initial condition.
> sol_plot := DEplot( ode3, y(t), t=0..8, [ [ic3] ],
> arrows=NONE, linecolor=GREEN ):
> display( [ slope_field, sol_plot, impreuler_plot, impreuler_plot2 ] );
>
[Back to ODE Powertool Table of Contents]
>