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:

$\frac{{\mathit{d}}^{2}\mathit{y}}{{\mathit{dt}}^{2}}+{\mathit{y}}^{2}\mathit{t}=3\mathit{t}.$

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 =

$\left(\begin{array}{c}{Y}_{2}\\ 3 t-t {{Y}_{1}}^{2}\end{array}\right)$

The elements of V represent the system of first-order differential equations, where V[i] = ${{Y}_{i}}^{\prime }$ and ${Y}_{1}=y$. Here, the output V represents these equations:

$\frac{\mathit{d}{\mathit{Y}}_{1}}{\mathit{dt}}={\mathit{Y}}_{2}$

$\frac{{\mathit{dY}}_{2}}{\mathit{dt}}=3\mathit{t}-\mathit{t}{\mathit{Y}}_{1}^{2}.$

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 =

$\left(\begin{array}{c}{Y}_{2}\\ {Y}_{1}+{Y}_{3}\\ {Y}_{3}-{Y}_{1}\end{array}\right)$

S =

$\left(\begin{array}{c}f\\ \mathrm{Df}\\ g\end{array}\right)$

The elements of V represent the system of first-order differential equations, where V[i] = ${{Y}_{i}}^{\prime }$. The output S shows the substitutions being made, S[1] = ${Y}_{1}=f$, S[2] = ${Y}_{2}$ = diff(f), and S[3] = ${Y}_{3}=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.

$\frac{{\mathit{d}}^{2}\mathit{y}}{\mathit{d}{\mathit{t}}^{2}}=\left(1-{\mathit{y}}^{2}\right)\frac{\mathit{dy}}{\mathit{dt}}-\mathit{y}.$

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

$\left(\begin{array}{c}{Y}_{2}\\ -\left({{Y}_{1}}^{2}-1\right) {Y}_{2}-{Y}_{1}\end{array}\right)$

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}^{\prime }\left(0\right)=2$ and ${y}^{\prime \prime }\left(0\right)=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\left(t\right)$ within the interval $t$ = [0 20]. Generate the values of t by using linspace. Evaluate the solution for $y\left(t\right)$, 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}^{\prime \prime }\left(x\right)=x$ with the initial condition $y\left(0\right)=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 =

$\left(\begin{array}{c}{Y}_{2}\\ x\end{array}\right)$

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

${a}_{n}\left(t\right){y}^{\left(n\right)}+{a}_{n-1}\left(t\right){y}^{\left(n-1\right)}+\dots +{a}_{1}\left(t\right){y}^{\prime }+{a}_{0}\left(t\right)y+r\left(t\right)=0$

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

$\begin{array}{l}{Y}_{1}=y\\ {Y}_{2}={y}^{\prime }\\ {Y}_{3}={y}^{″}\\ \dots \\ {Y}_{n-1}={y}^{\left(n-2\right)}\\ {Y}_{n}={y}^{\left(n-1\right)}\end{array}$

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

$\begin{array}{l}{Y}_{1}{}^{\prime }={y}^{\prime }={Y}_{2}\\ {Y}_{2}{}^{\prime }={y}^{″}={Y}_{3}\\ \dots \\ {Y}_{n-1}{}^{\prime }={y}^{\left(n-1\right)}={Y}_{n}\\ {Y}_{n}{}^{\prime }=-\frac{{a}_{n-1}\left(t\right)}{{a}_{n}\left(t\right)}{Y}_{n}-\frac{{a}_{n-2}\left(t\right)}{{a}_{n}\left(t\right)}{Y}_{n-1}-...-\frac{{a}_{1}\left(t\right)}{{a}_{n}\left(t\right)}{Y}_{2}-\frac{{a}_{0}\left(t\right)}{{a}_{n}\left(t\right)}{Y}_{1}+\frac{r\left(t\right)}{{a}_{n}\left(t\right)}\end{array}$

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