odeToVectorField

Reduce order of differential equations to first-order

Support for character vector or string inputs will be removed in a future release. Instead, use syms to declare variables, and replace inputs such as odeToVectorField('D2y = x') with syms y(x), odeToVectorField(diff(y,x,2) == x).

Description

example

V = odeToVectorField(eqn1,...,eqnN) converts higher-order differential equations eqn1,...,eqnN to a system of first-order differential equations, returned as a symbolic vector.

example

[V,S] = odeToVectorField(eqn1,...,eqnN) converts eqn1,...,eqnN and returns two symbolic vectors. The first vector V is the same as the output of the previous syntax. The second vector S shows the substitutions made to obtain V.

Examples

collapse all

Define a second-order differential equation:

d2ydt2+y2t=3t.

Convert the second-order differential equation to a system of first-order differential equations.

syms y(t)
eqn = diff(y,2) + y^2*t == 3*t;
V = odeToVectorField(eqn)
V = 

(Y23t-tY12)

The elements of V represent the system of first-order differential equations, where V[i] = Yi and Y1=y. Here, the output V represents these equations:

dY1dt=Y2

dY2dt=3t-tY12.

For details on the relation between the input and output, see Algorithms.

When reducing the order of differential equations, return the substitutions that odeToVectorField makes by specifying a second output argument.

syms f(t) g(t)
eqn1 = diff(g) == g-f;
eqn2 = diff(f,2) == g+f;
eqns = [eqn1 eqn2];
[V,S] = odeToVectorField(eqns)
V = 

(Y2Y1+Y3Y3-Y1)

S = 

(fDfg)

The elements of V represent the system of first-order differential equations, where V[i] = Yi. The output S shows the substitutions being made, S[1] = Y1=f, S[2] = Y2 = diff(f), and S[3] = Y3=g.

Solve a higher-order differential equation numerically by reducing the order of the equation, generating a MATLAB® function handle, and then finding the numerical solution using the ode45 function.

Convert the following second-order differential equation to a system of first-order differential equations by using odeToVectorField.

d2ydt2=(1-y2)dydt-y.

syms y(t)
eqn = diff(y,2) == (1-y^2)*diff(y)-y;
V = odeToVectorField(eqn)
V = 

(Y2-Y12-1Y2-Y1)

Generate a MATLAB function handle from V by using matlabFunction.

M = matlabFunction(V,'vars',{'t','Y'})
M = function_handle with value:
    @(t,Y)[Y(2);-(Y(1).^2-1.0).*Y(2)-Y(1)]

Specify the solution interval to be [0 20] and the initial conditions to be y(0)=2 and y(0)=0. Solve the system of first-order differential equations by using ode45.

interval = [0 20];
yInit = [2 0];
ySol = ode45(M,interval,yInit);

Next, plot the solution y(t) within the interval t = [0 20]. Generate the values of t by using linspace. Evaluate the solution for y(t), which is the first index in ySol, by calling the deval function with an index of 1. Plot the solution using plot.

tValues = linspace(0,20,100);
yValues = deval(ySol,tValues,1);
plot(tValues,yValues)

Convert the second-order differential equation y(x)=x with the initial condition y(0)=a to a first-order system.

syms y(x) a
eqn = diff(y,x,2) == x;
cond = y(0) == a;
V = odeToVectorField(eqn,cond)
V = 

(Y2x)

Input Arguments

collapse all

Higher-order differential equations, specified as a symbolic differential equation or an array of symbolic differential equations. Use the == operator to create an equation. Use the diff function to indicate differentiation. For example, represent d2y(t)/dt2 = t y(t) by entering the following command.

syms y(t)
eqn = diff(y,2) == t*y;

Output Arguments

collapse all

First-order differential equations, returned as a symbolic expression or a vector of symbolic expressions. Each element of this vector is the right side of the first-order differential equation Y[i]′ = V[i].

Substitutions in first-order equations, returned as a vector of symbolic expressions. The elements of the vector represent the substitutions, such that S(1) = Y[1], S(2) = Y[2],….

Tips

  • To solve the resulting system of first-order differential equations, generate a MATLAB® function handle using matlabFunction with V as an input. Then, use the generated MATLAB function handle as an input for the MATLAB numerical solver ode23 or ode45.

  • odeToVectorField can convert only quasi-linear differential equations. That is, the highest-order derivatives must appear linearly. For example, odeToVectorField can convert y*y″(t) = –t2 because it can be rewritten as y″(t) = –t2/y. However, it cannot convert y″(t)2 = –t2 or sin(y″(t)) = –t2.

Algorithms

To convert an nth-order differential equation

an(t)y(n)+an1(t)y(n1)++a1(t)y+a0(t)y+r(t)=0

into a system of first-order differential equations, odetovectorfield makes these substitutions.

Y1=yY2=yY3=yYn1=y(n2)Yn=y(n1)

Using the new variables, it rewrites the equation as a system of n first-order differential equations:

Y1=y=Y2Y2=y=Y3Yn1=y(n1)=YnYn=an1(t)an(t)Ynan2(t)an(t)Yn1...a1(t)an(t)Y2a0(t)an(t)Y1+r(t)an(t)

odeToVectorField returns the right sides of these equations as the elements of vector V and the substitutions made as the second output S.

Compatibility Considerations

expand all

Warns starting in R2019b

Introduced in R2012a