ODE_Systems.mw

Solving Systems of ODEs 

Conversion to a First-Order System 

If a given system of ordinary differential equations (ODEs) involves derivatives higher than first order, then in order to apply a numerical solution method the ODEs must be converted to a system of first-order ODEs. 

 

In Maple, the conversion of higher-order ODEs to a first-order system is handled automatically when a numerical solution is requested. In Matlab or any other purely numerical computation environment, the conversion to a first-order system must be done manually by the user. 

Example 1: A 2nd-order ODE 

 

Consider the following initial-value problem (IVP) appearing in Example 9.3 of the CS 370 Course Notes. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(diff(diff(y(t), t), t), `-`(`*`(t, `*`(diff(y(t), t)))), `*`(a, `*`(y(t)))) = sin(t) (1)
 

with initial conditions 

 

> Typesetting:-mrow(Typesetting:-mi(
 

y(0) = y[0], (D(y))(0) = 3 (2)
 

>
 

 

This 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) (3)
 

>
 

 

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, where the last equation involves isolating the highest-order derivative on the left hand side of the original equation. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

diff(y[1](t), t) = y[2](t)
diff(y[2](t), t) = `+`(`*`(t, `*`(y[2](t))), `-`(`*`(a, `*`(y[1](t)))), sin(t)) (4)
 

with initial conditions 

 

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

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

>
 

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

diff(Y(t), t) = F(t, Y)
Y(0) = Y0 (6)
 

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

Typesetting:-mrow(Typesetting:-mverbatim( (7)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

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

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

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

>
 

Example 2: A 4th-order ODE 

 

> Typesetting:-mrow(Typesetting:-mi(
 

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

with initial conditions 

 

> Typesetting:-mrow(Typesetting:-mi(
 

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

>
 

 

This 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) (12)
 

>
 

 

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, where the last equation involves isolating the highest-order derivative on the left hand side of the original equation. 

 

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

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

>
 

 

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

 

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

Typesetting:-mrow(Typesetting:-mverbatim( (16)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

Typesetting:-mrow(Typesetting:-mverbatim( (17)
 

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

Typesetting:-mrow(Typesetting:-mverbatim( (18)
 

>
 

Example 3: Novelty Golf Driving Range 

 

Consider the following system of ODEs introduced in the CS 370 Course Notes (section 8.2) for the Novelty Golf Driving Range. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

 

diff(x(t), t) = V[x]
diff(diff(y(t), t), t) = `+`(`-`(g)) (19)
 

with initial conditions 

 

> Typesetting:-mrow(Typesetting:-mi(
 

x(0) = 0, y(0) = 0, (D(y))(0) = V[y] (20)
 

>
 

 

This 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) = x(t)
y[2](t) = y(t)
y[3](t) = diff(y(t), t) (21)
 

>
 

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

 

diff(y[1](t), t) = V[x]
diff(y[2](t), t) = y[3](t)
diff(y[3](t), t) = `+`(`-`(g)) (22)
 

with initial conditions 

 

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

y[1](0) = 0, y[2](0) = 0, y[3](0) = V[y] (23)
 

>
 

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

diff(Y(t), t) = F(t, Y)
Y(0) = Y0 (24)
 

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

Typesetting:-mrow(Typesetting:-mverbatim( (25)
 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

Typesetting:-mrow(Typesetting:-mverbatim( (26)
 

 

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

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

Typesetting:-mrow(Typesetting:-mverbatim( (27)
 

>
 

Forward Euler Method for a System 

The Forward Euler Method we developed for a single first-order ODE is easily adapted for solving a system of first-order ODEs. 

 

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

>
 

 

Let us apply this procedure to solve the IVP of Example 1 above. 

 

 

Define the system dynamics function. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mo(
 

Typesetting:-mrow(Typesetting:-mverbatim( (28)
 

 

Values must be specified for the two parameters Typesetting:-mrow(Typesetting:-mi( and Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

 

0.1e-1
1.5 (29)
 

 

The vector Typesetting:-mrow(Typesetting:-mi( of initial conditions is 

 

> Typesetting:-mrow(Typesetting:-mi(
 

Typesetting:-mrow(Typesetting:-mverbatim( (30)
 

 

Specify the range of integration and the stepsize Typesetting:-mrow(Typesetting:-mi( . 

 

> Typesetting:-mrow(Typesetting:-mi(
 

0, .5 (31)
 

> Typesetting:-mrow(Typesetting:-mi(
 

.1 (32)
 

> Typesetting:-mrow(Typesetting:-mi(
 

 

 

 

 

 

Typesetting:-mrow(Typesetting:-mverbatim(
Typesetting:-mrow(Typesetting:-mverbatim(
Typesetting:-mrow(Typesetting:-mverbatim(
Typesetting:-mrow(Typesetting:-mverbatim(
Typesetting:-mrow(Typesetting:-mverbatim(
Typesetting:-mrow(Typesetting:-mverbatim( (33)
 

>
 

 

Compare with the solution obtained by Maple for the original Typesetting:-mrow(Typesetting:-msup(Typesetting:-mn(-order system. 

 

> Typesetting:-mrow(Typesetting:-mi(
 

> Typesetting:-mrow(Typesetting:-mi(
 

`+`(diff(diff(y(t), t), t), `-`(`*`(t, `*`(diff(y(t), t)))), `*`(0.1e-1, `*`(y(t)))) = sin(t) (34)
 

> Typesetting:-mrow(Typesetting:-mi(
 

y(0) = 1.5, (D(y))(0) = 3 (35)
 

> 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... (36)
 

 

> Typesetting:-mrow(Typesetting:-mo(
 

 

 

 

 

 

[t = 0., y(t) = 1.5000000000000, diff(y(t), t) = 3.]
[t = .1, y(t) = 1.80058674872662250, diff(y(t), t) = 3.01839096496880277]
[t = .2, y(t) = 2.10501902494109405, diff(y(t), t) = 3.07708952857193818]
[t = .3, y(t) = 2.41740231225606994, diff(y(t), t) = 3.17774046402749110]
[t = .4, y(t) = 2.74205768881001699, diff(y(t), t) = 3.32318812064085822]
[t = .5, y(t) = 3.08367207249168728, diff(y(t), t) = 3.51764253769968782] (37)
 

>