# dsolve

Solve system of differential equations

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 `dsolve('Dy = y')` with ```syms y(t); dsolve(diff(y,t) == y)```.

## Syntax

``S = dsolve(eqn)``
``S = dsolve(eqn,cond)``
``S = dsolve(___,Name,Value)``
``[y1,...,yN] = dsolve(___)``

## Description

example

````S = dsolve(eqn)` solves the differential equation `eqn`, where `eqn` is a symbolic equation. Use `diff` and `==` to represent differential equations. For example, `diff(y,x) == y` represents the equation dy/dx = y. Solve a system of differential equations by specifying `eqn` as a vector of those equations.```

example

````S = dsolve(eqn,cond)` solves `eqn` with the initial or boundary condition `cond`.```

example

````S = dsolve(___,Name,Value)` uses additional options specified by one or more `Name,Value` pair arguments.```

example

````[y1,...,yN] = dsolve(___)` assigns the solutions to the variables `y1,...,yN`.```

## Examples

collapse all

Solve the first-order differential equation $\frac{\mathit{dy}}{\mathit{dt}}=\mathit{ay}.$

Specify the first-order derivative by using `diff` and the equation by using ==. Then, solve the equation by using `dsolve`.

```syms y(t) a eqn = diff(y,t) == a*y; S = dsolve(eqn)```
`S = ${C}_{1} {\mathrm{e}}^{a t}$`

The solution includes a constant. To eliminate constants, see Solve Differential Equations with Conditions. For a full workflow, see Solving Partial Differential Equations.

Solve the second-order differential equation $\frac{{\mathit{d}}^{2}\mathit{y}}{{\mathit{dt}}^{2}}=\mathit{ay}.$

Specify the second-order derivative of y by using `diff(y,t,2)` and the equation by using `==`. Then, solve the equation by using `dsolve`.

```syms y(t) a eqn = diff(y,t,2) == a*y; ySol(t) = dsolve(eqn)```
`ySol(t) = ${C}_{1} {\mathrm{e}}^{-\sqrt{a} t}+{C}_{2} {\mathrm{e}}^{\sqrt{a} t}$`

Solve the first-order differential equation $\frac{\mathit{dy}}{\mathit{dt}}=\mathit{ay}$ with the initial condition $y\left(0\right)=5$.

Specify the initial condition as the second input to `dsolve` by using the `==` operator. Specifying condition eliminates arbitrary constants, such as `C1`, `C2`, `...`, from the solution.

```syms y(t) a eqn = diff(y,t) == a*y; cond = y(0) == 5; ySol(t) = dsolve(eqn,cond)```
`ySol(t) = $5 {\mathrm{e}}^{a t}$`

Next, solve the second-order differential equation $\frac{{\mathit{d}}^{2}\mathit{y}}{{\mathit{dt}}^{2}}={\mathit{a}}^{2}\mathit{y}$ with the initial conditions $y\left(0\right)=b$ and ${y}^{\prime }\left(0\right)=1$.

Specify the second initial condition by assigning `diff(y,t)` to `Dy` and then using `Dy(0) == 1`.

```syms y(t) a b eqn = diff(y,t,2) == a^2*y; Dy = diff(y,t); cond = [y(0)==b, Dy(0)==1]; ySol(t) = dsolve(eqn,cond)```
```ySol(t) =  $\frac{{\mathrm{e}}^{a t} \left(a b+1\right)}{2 a}+\frac{{\mathrm{e}}^{-a t} \left(a b-1\right)}{2 a}$```

This second-order differential equation has two specified conditions, so constants are eliminated from the solution. In general, to eliminate constants from the solution, the number of conditions must equal the order of the equation.

Solve the system of differential equations

`$\begin{array}{l}\frac{\mathit{dy}}{\mathit{dt}}=\mathit{z}\\ \frac{\mathit{dz}}{\mathit{dt}}=-\mathit{y}.\end{array}$`

Specify the system of equations as a vector. `dsolve` returns a structure containing the solutions.

```syms y(t) z(t) eqns = [diff(y,t) == z, diff(z,t) == -y]; S = dsolve(eqns)```
```S = struct with fields: z: [1x1 sym] y: [1x1 sym] ```

Access the solutions by addressing the elements of the structure.

`ySol(t) = S.y`
`ySol(t) = ${C}_{1} \mathrm{cos}\left(t\right)+{C}_{2} \mathrm{sin}\left(t\right)$`
`zSol(t) = S.z`
`zSol(t) = ${C}_{2} \mathrm{cos}\left(t\right)-{C}_{1} \mathrm{sin}\left(t\right)$`

When solving for multiple functions, `dsolve` returns a structure by default. Alternatively, you can assign solutions to functions or variables directly by explicitly specifying the outputs as a vector. `dsolve` sorts the outputs in alphabetical order using `symvar`.

Solve a system of differential equations and assign the outputs to functions.

```syms y(t) z(t) eqns = [diff(y,t)==z, diff(z,t)==-y]; [ySol(t),zSol(t)] = dsolve(eqns)```
`ySol(t) = ${C}_{1} \mathrm{cos}\left(t\right)+{C}_{2} \mathrm{sin}\left(t\right)$`
`zSol(t) = ${C}_{2} \mathrm{cos}\left(t\right)-{C}_{1} \mathrm{sin}\left(t\right)$`

Solve the differential equation $\frac{\partial }{\partial t}y\left(t\right)={e}^{-y\left(t\right)}+y\left(t\right)$. `dsolve` returns an explicit solution in terms of a Lambert W function that has a constant value.

```syms y(t) eqn = diff(y) == y+exp(-y)```
```eqn(t) =  ```
`sol = dsolve(eqn)`
`sol = ${\mathrm{W}\text{lambertw}}_{0}\left(-1\right)$`

To return implicit solutions of the differential equation, set the `'Implicit'` option to `true`. An implicit solution has the form $F\left(y\left(t\right)\right)=g\left(t\right)$.

`sol = dsolve(eqn,'Implicit',true)`
```sol =  $\left(\begin{array}{c}\left({\int \frac{{\mathrm{e}}^{y}}{y {\mathrm{e}}^{y}+1}\mathrm{d}y|}_{y=y\left(t\right)}\right)={C}_{1}+t\\ {\mathrm{e}}^{-y\left(t\right)} \left({\mathrm{e}}^{y\left(t\right)} y\left(t\right)+1\right)=0\end{array}\right)$```

If `dsolve` cannot find an explicit solution of a differential equation analytically, then it returns an empty symbolic array. You can solve the differential equation by using MATLAB® numerical solver, such as `ode45`. For more information, see Solve a Second-Order Differential Equation Numerically.

```syms y(x) eqn = diff(y) == (x-exp(-x))/(y(x)+exp(y(x))); S = dsolve(eqn)```
```Warning: Unable to find symbolic solution. ```
``` S = [ empty sym ] ```

Alternatively, you can try finding an implicit solution of the differential equation by specifying the `'Implicit'` option to `true`. An implicit solution has the form $F\left(y\left(x\right)\right)=g\left(x\right)$.

`S = dsolve(eqn,'Implicit',true)`
```S =  ${\mathrm{e}}^{y\left(x\right)}+\frac{{y\left(x\right)}^{2}}{2}={C}_{1}+{\mathrm{e}}^{-x}+\frac{{x}^{2}}{2}$```

Solve the differential equation $\frac{\mathit{dy}}{\mathit{dt}}=\frac{\mathit{a}}{\sqrt{\mathit{y}}}+\mathit{y}$ with condition $y\left(a\right)=1$. By default, `dsolve` applies simplifications that are not generally correct, but produce simpler solutions. For more details, see Algorithms.

```syms a y(t) eqn = diff(y) == a/sqrt(y) + y; cond = y(a) == 1; ySimplified = dsolve(eqn, cond)```
```ySimplified =  ${\left({\mathrm{e}}^{\frac{3 t}{2}-\frac{3 a}{2}+\mathrm{log}\left(a+1\right)}-a\right)}^{2/3}$```

To return the solutions that include all possible values of the parameter $a$, turn off simplifications by setting `'IgnoreAnalyticConstraints'` to `false`.

`yNotSimplified = dsolve(eqn,cond,'IgnoreAnalyticConstraints',false)`
```yNotSimplified =  ```

Solve the second-order differential equation $\left({x}^{2}-1{\right)}^{2}\frac{{\partial }^{2}}{\partial {x}^{2}}y\left(x\right)+\left(x+1\right)\frac{\partial }{\partial x}y\left(x\right)-y\left(x\right)=0$. `dsolve` returns a solution that contains a term with unevaluated integral.

```syms y(x) eqn = (x^2-1)^2*diff(y,2) + (x+1)*diff(y) - y == 0; S = dsolve(eqn)```
```S =  ${C}_{2} \left(x+1\right)+{C}_{1} \left(x+1\right) \int \frac{{\mathrm{e}}^{\frac{1}{2 \left(x-1\right)}} {\left(1-x\right)}^{1/4}}{{\left(x+1\right)}^{9/4}}\mathrm{d}x$```

To return series solutions of the differential equation around $x=-1$, set the `'ExpansionPoint'` to `-1`. `dsolve` returns two linearly independent solutions in terms of a Puiseux series expansion.

`S = dsolve(eqn,'ExpansionPoint',-1)`
```S =  $\left(\begin{array}{c}x+1\\ \frac{1}{{\left(x+1\right)}^{1/4}}-\frac{5 {\left(x+1\right)}^{3/4}}{4}+\frac{5 {\left(x+1\right)}^{7/4}}{48}+\frac{5 {\left(x+1\right)}^{11/4}}{336}+\frac{115 {\left(x+1\right)}^{15/4}}{33792}+\frac{169 {\left(x+1\right)}^{19/4}}{184320}\end{array}\right)$```

Find other series solutions around the expansion point $\infty$ by setting `'ExpansionPoint'` to `Inf`.

`S = dsolve(eqn,'ExpansionPoint',Inf)`
```S =  $\left(\begin{array}{c}x-\frac{1}{6 {x}^{2}}-\frac{1}{8 {x}^{4}}\\ \frac{1}{6 {x}^{2}}+\frac{1}{8 {x}^{4}}+\frac{1}{90 {x}^{5}}+1\end{array}\right)$```

The default truncation order of the series expansion is 6. To obtain more terms in the Puiseux series solutions, set `'Order'` to 8.

`S = dsolve(eqn,'ExpansionPoint',Inf,'Order',8)`
```S =  $\left(\begin{array}{c}x-\frac{1}{6 {x}^{2}}-\frac{1}{8 {x}^{4}}-\frac{1}{90 {x}^{5}}-\frac{37}{336 {x}^{6}}\\ \frac{1}{6 {x}^{2}}+\frac{1}{8 {x}^{4}}+\frac{1}{90 {x}^{5}}+\frac{37}{336 {x}^{6}}+\frac{37}{1680 {x}^{7}}+1\end{array}\right)$```

Solve the differential equation $\frac{\mathit{dy}}{\mathit{dx}}=\frac{1}{{\mathit{x}}^{2}}{\mathit{e}}^{-\frac{1}{\mathit{x}}}$ without specifying the initial condition.

```syms y(x) eqn = diff(y) == exp(-1/x)/x^2; ySol(x) = dsolve(eqn)```
```ySol(x) =  ${C}_{1}+{\mathrm{e}}^{-\frac{1}{x}}$```

To eliminate constants from the solution, specify the initial condition $\mathit{y}\left(0\right)=1.$

```cond = y(0) == 1; S = dsolve(eqn,cond)```
```S =  ${\mathrm{e}}^{-\frac{1}{x}}+1$```

The function ${\mathit{e}}^{-\frac{1}{\mathit{x}}}$ in the solution `ySol(x)` has different one-sided limits at $x=0$. The function has a right-side limit, $\underset{\mathit{x}\to {0}^{+}}{\mathrm{lim}}\text{\hspace{0.17em}}{\mathit{e}}^{-\frac{1}{\mathit{x}}}=0$, but it has undefined left-side limit, $\underset{\mathit{x}\to {0}^{-}}{\mathrm{lim}}\text{\hspace{0.17em}}{\mathit{e}}^{-\frac{1}{\mathit{x}}}=\infty$.

When you specify the condition `y(x0)` for a function with different one-sided limits at `x0`, `dsolve` treats the condition as a limit from the right, $\mathrm{lim}\text{\hspace{0.17em}}\mathit{x}\to {\mathit{x}}_{0}^{+}$.

## Input Arguments

collapse all

Differential equation or system of equations, specified as a symbolic equation or a vector of symbolic equations. Specify a differential equation by using the `==` operator. If `eqn` is a symbolic expression (without the right side), the solver assumes that the right side is 0, and solves the equation ```eqn == 0```.

In the equation, represent differentiation by using `diff`. For example, `diff(y,x)` differentiates the symbolic function `y(x)` with respect to `x`. Create the symbolic function `y(x)` by using `syms` and solve the equation ```d2y(x)/dx2 = x*y(x)``` using `dsolve`.

```syms y(x) dsolve(diff(y,x,2) == x*y)```

Specify a system of differential equations by using a vector of equations, as in `dsolve([diff(y,t) == z, diff(z,t) == -y])`.

Initial or boundary condition, specified as a symbolic equation or vector of symbolic equations.

When a condition contains a derivative, represent the derivative with `diff`. Assign the `diff` call to a variable and use the variable to specify the condition. For example, see Solve Differential Equations with Conditions.

Specify multiple conditions by using a vector of equations. If the number of conditions is less than the number of dependent variables, the solutions contain the arbitrary constants `C1`, `C2`,`...`.

### Name-Value Pair Arguments

Specify optional comma-separated pairs of `Name,Value` arguments. `Name` is the argument name and `Value` is the corresponding value. `Name` must appear inside quotes. You can specify several name and value pair arguments in any order as `Name1,Value1,...,NameN,ValueN`.

Example: `'IgnoreAnalyticConstraints',false` does not apply internal simplifications.

Expansion point of a Puiseux series solution, specified as a number, or a symbolic number, variable, function, or expression. Specifying this option returns the solution of a differential equation in terms of a Puiseux series (a power series that allows negative and fractional exponents). The expansion point cannot depend on the series variable. For example, see Find Series Solution of Differential Equation.

Data Types: `single` | `double` | `sym`
Complex Number Support: Yes

Option to use internal simplifications, specified as `true` or `false`.

By default, the solver applies simplifications while solving the differential equation. These simplifications might not be generally valid. Therefore, by default, the solver does not guarantee the completeness of results. If `'IgnoreAnalyticConstraints'` is `true`, always verify results returned by the `dsolve` function. For more details, see Algorithms.

To solve ordinary differential equations without these simplifications, set `'IgnoreAnalyticConstraints'` to `false`. Results obtained with `'IgnoreAnalyticConstraints'` set to `false` are correct for all values of the arguments. For certain equations, `dsolve` might not return an explicit solution if you set `'IgnoreAnalyticConstraints'` to `false`.

Option to return an implicit solution, specified as `false` or `true`. For a differential equation with variables x and y(x), an implicit solution has the form F(y(x)) = g(x).

By default, the solver tries to find an explicit solution y(x) = f(x) analytically when solving a differential equation. If `dsolve` cannot find an explicit solution, then you can try finding a solution in implicit form by specifying the `'Implicit'` option to `true`.

Maximum degree of polynomial equations for which the solver uses explicit formulas, specified as a positive integer smaller than 5. `dsolve` does not use explicit formulas when solving polynomial equations of degrees larger than `'MaxDegree'`.

Truncation order of a Puiseux series solution, specified as a positive integer or a symbolic positive integer. Specifying this option returns the solution of a differential equation in terms of a Puiseux series (a power series that allow negative and fractional exponents). The truncation order n is the exponent in the O-term: .

## Output Arguments

collapse all

Solutions of differential equation, returned as a symbolic expression or a vector of symbolic expressions. The size of `S` is the number of solutions.

Variables storing solutions of differential equations, returned as a vector of symbolic variables. The number of output variables must equal the number of dependent variables in a system of equations. `dsolve` sorts the dependent variables alphabetically, and then assigns the solutions for the variables to output variables or symbolic arrays.

## Tips

• If `dsolve` cannot find an explicit or implicit solution, then it issues a warning and returns the empty `sym`. In this case, try to find a numeric solution using the MATLAB® `ode23` or `ode45` function. Sometimes, the output is an equivalent lower-order differential equation or an integral.

• `dsolve` does not always return complete solutions even if `'IgnoreAnalyticConstraints'` is `false`.

• If `dsolve` returns a function that has different one-sided limits at `x0` and you specify the condition `y(x0)`, then `dsolve` treats the condition as a limit from the right, .

## Algorithms

If you do not set `'IgnoreAnalyticConstraints'` to `false`, then `dsolve` applies these rules while solving the equation:

• log(a) + log(b) = log(a·b) for all values of a and b. In particular, the following equality is applied for all values of a, b, and c:

(a·b)c = ac·bc.

• log(ab) = b·log(a) for all values of a and b. In particular, the following equality is applied for all values of a, b, and c:

(ab)c = ab·c.

• If f and g are standard mathematical functions and f(g(x)) = x for all small positive numbers, f(g(x)) = x is assumed to be valid for all complex x. In particular:

• log(ex) = x

• asin(sin(x)) = x, acos(cos(x)) = x, atan(tan(x)) = x

• asinh(sinh(x)) = x, acosh(cosh(x)) = x, atanh(tanh(x)) = x

• Wk(x·ex) = x for all branch indices k of the Lambert W function.

• The solver can multiply both sides of an equation by any expression except `0`.

• The solutions of polynomial equations must be complete.

## Compatibility Considerations

expand all

Warns starting in R2019b