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(](images/ODE_Systems_1.gif) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_2.gif) |
![`+`(diff(diff(y(t), t), t), `-`(`*`(t, `*`(diff(y(t), t)))), `*`(a, `*`(y(t)))) = sin(t)](images/ODE_Systems_3.gif) |
(1) |
with initial conditions
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_4.gif) |
![y(0) = y[0], (D(y))(0) = 3](images/ODE_Systems_5.gif) |
(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(](images/ODE_Systems_6.gif) |
![y[1](t) = y(t)](images/ODE_Systems_7.gif) |
![y[2](t) = diff(y(t), t)](images/ODE_Systems_8.gif) |
(3) |
In terms of the new functions
the original
-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(](images/ODE_Systems_11.gif) |
![diff(y[1](t), t) = y[2](t)](images/ODE_Systems_12.gif) |
![diff(y[2](t), t) = `+`(`*`(t, `*`(y[2](t))), `-`(`*`(a, `*`(y[1](t)))), sin(t))](images/ODE_Systems_13.gif) |
(4) |
with initial conditions
> |
![Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(](images/ODE_Systems_14.gif) |
![y[1](0) = y[0], y[2](0) = 3](images/ODE_Systems_15.gif) |
(5) |
This now takes the form of a standard first-order system:
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_16.gif) |
![diff(Y(t), t) = F(t, Y)](images/ODE_Systems_17.gif) |
![Y(0) = Y0](images/ODE_Systems_18.gif) |
(6) |
where
is a vector of dimension 2 and
is a vector function of dimension 2 taking as arguments
and the vector
. Specifically,
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_23.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_24.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_25.gif) |
(7) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_26.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_27.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_28.gif) |
(8) |
The initial conditions are specified by the vector
:
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_30.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_31.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_32.gif) |
(9) |
Example 2: A 4th-order ODE
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_33.gif) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_34.gif) |
![`+`(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)))))))](images/ODE_Systems_35.gif) |
(10) |
with initial conditions
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_36.gif) |
![y(1) = 0, (D(y))(1) = .5, ((`@@`(D, 2))(y))(1) = .1, ((`@@`(D, 3))(y))(1) = 0](images/ODE_Systems_37.gif) |
(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(](images/ODE_Systems_38.gif) |
In terms of the new functions
the original
-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(](images/ODE_Systems_45.gif)
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_46.gif) |
with initial conditions
> |
![Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(](images/ODE_Systems_51.gif) |
![y[1](1) = 0, y[2](1) = .5, y[3](1) = .1, y[4](1) = 0](images/ODE_Systems_52.gif) |
(14) |
This now takes the form of a standard first-order system:
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_53.gif) |
![diff(Y(t), t) = F(t, Y)](images/ODE_Systems_54.gif) |
![Y(1) = Y1](images/ODE_Systems_55.gif) |
(15) |
where
is a vector of dimension 4 and
is a vector function of dimension 4 taking as arguments
and the vector
. Specifically,
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_60.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_61.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_62.gif) |
(16) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_63.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_64.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_65.gif) |
(17) |
The initial conditions are specified by the vector
:
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_67.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_68.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_69.gif) |
(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(](images/ODE_Systems_70.gif) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_71.gif) |
![diff(x(t), t) = V[x]](images/ODE_Systems_72.gif) |
![diff(diff(y(t), t), t) = `+`(`-`(g))](images/ODE_Systems_73.gif) |
(19) |
with initial conditions
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_74.gif) |
![x(0) = 0, y(0) = 0, (D(y))(0) = V[y]](images/ODE_Systems_75.gif) |
(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(](images/ODE_Systems_76.gif) |
In terms of the new functions
the original system of ODEs becomes the following first-order system.
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_81.gif) |
with initial conditions
> |
![Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(](images/ODE_Systems_85.gif) |
![y[1](0) = 0, y[2](0) = 0, y[3](0) = V[y]](images/ODE_Systems_86.gif) |
(23) |
This now takes the form of a standard first-order system:
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_87.gif) |
![diff(Y(t), t) = F(t, Y)](images/ODE_Systems_88.gif) |
![Y(0) = Y0](images/ODE_Systems_89.gif) |
(24) |
where
is a vector of dimension 3 and
is a vector function of dimension 3 taking as arguments
and the vector
. Specifically,
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_94.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_95.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_96.gif) |
(25) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_97.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_98.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_99.gif) |
(26) |
The initial conditions are specified by the vector
:
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_101.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_102.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_103.gif) |
(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(](images/ODE_Systems_104.gif) |
Let us apply this procedure to solve the IVP of Example 1 above.
Define the system dynamics function.
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_146.gif) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_147.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_148.gif) |
(28) |
Values must be specified for the two parameters
and
.
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_151.gif) |
![0.1e-1](images/ODE_Systems_152.gif) |
![1.5](images/ODE_Systems_153.gif) |
(29) |
The vector
of initial conditions is
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_155.gif) |
![Typesetting:-mrow(Typesetting:-mverbatim(](images/ODE_Systems_156.gif) |
(30) |
Specify the range of integration and the stepsize
.
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_158.gif) |
![0, .5](images/ODE_Systems_159.gif) |
(31) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_160.gif) |
![.1](images/ODE_Systems_161.gif) |
(32) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_162.gif) |
Compare with the solution obtained by Maple for the original
-order system.
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_170.gif) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_171.gif) |
![`+`(diff(diff(y(t), t), t), `-`(`*`(t, `*`(diff(y(t), t)))), `*`(0.1e-1, `*`(y(t)))) = sin(t)](images/ODE_Systems_172.gif) |
(34) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_173.gif) |
![y(0) = 1.5, (D(y))(0) = 3](images/ODE_Systems_174.gif) |
(35) |
> |
![Typesetting:-mrow(Typesetting:-mi(](images/ODE_Systems_175.gif) |
![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...](images/ODE_Systems_176.gif) |
(36) |
> |
![Typesetting:-mrow(Typesetting:-mo(](images/ODE_Systems_177.gif) |