Main Content

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

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 dydt=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 = C1eatC1*exp((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 d2ydt2=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) = C1e-at+C2eatC1*exp((-sqrt(a)*t)) + C2*exp((sqrt(a)*t))

Solve the first-order differential equation dydt=ay with the initial condition y(0)=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) = 5eat5*exp((a*t))

Next, solve the second-order differential equation d2ydt2=a2y with the initial conditions y(0)=b and y(0)=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) = 

eatab+12a+e-atab-12a(exp((a*t))*(a*b + 1))/(2*a) + (exp((-a*t))*(a*b - 1))/(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

dydt=zdzdt=-y.

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) = C1cos(t)+C2sin(t)C1*cos(t) + C2*sin(t)
zSol(t) = S.z
zSol(t) = C2cos(t)-C1sin(t)C2*cos(t) - C1*sin(t)

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) = C1cos(t)+C2sin(t)C1*cos(t) + C2*sin(t)
zSol(t) = C2cos(t)-C1sin(t)C2*cos(t) - C1*sin(t)

Solve the differential equation ty(t)=e-y(t)+y(t). 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) = 

t y(t)=e-y(t)+y(t)diff(y(t), t) == exp((-y(t))) + y(t)

sol = dsolve(eqn)
sol = Wlambertw0(-1)lambertw(sym(0), -1)

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

sol = dsolve(eqn,'Implicit',true)
sol = 

(eyyey+1dy|y=y(t)=C1+te-y(t)ey(t)y(t)+1=0)[(subs(int(exp(y)/(y*exp(y) + 1), y, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true), y, y(t))) == C1 + t; exp((-y(t)))*(exp(y(t))*y(t) + 1) == 0]

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(y(x))=g(x).

S = dsolve(eqn,'Implicit',true)
S = 

ey(x)+y(x)22=C1+e-x+x22exp(y(x)) + y(x)^2/2 == C1 + exp((-x)) + x^2/2

Solve the differential equation dydt=ay+y with condition y(a)=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 = 

e3t2-3a2+log(a+1)-a2/3(exp(((3*t)/2 - (3*a)/2 + log(a + 1))) - a)^sym(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 = 

{{{σ1} if  -π2<σ2{σ1,--a+e3t2-3a2+log(a+-12+σ33/2)+2πC2i2/312+σ3} if  σ2-π2 if  C2Z if  C2Zwhere  σ1=-a+e3t2-3a2+log(a+1)+2πC2i2/3  σ2=angle(e3C12+3t2-a)  σ3=3i2

Solve the second-order differential equation (x2-1)22x2y(x)+(x+1)xy(x)-y(x)=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 = 

C2x+1+C1x+1e12x-11-x1/4x+19/4dxC2*(x + 1) + C1*(x + 1)*int(((exp((1/(2*(x - 1))))*(1 - x)^sym(1/4))/(x + 1)^sym(9/4)), x, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true)

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 = 

(x+11x+11/4-5x+13/44+5x+17/448+5x+111/4336+115x+115/433792+169x+119/4184320)[x + 1; 1/(x + 1)^sym(1/4) - (5*(x + 1)^sym(3/4))/4 + (5*(x + 1)^sym(7/4))/48 + (5*(x + 1)^sym(11/4))/336 + (115*(x + 1)^sym(15/4))/33792 + (169*(x + 1)^sym(19/4))/184320]

Find other series solutions around the expansion point by setting 'ExpansionPoint' to Inf.

S = dsolve(eqn,'ExpansionPoint',Inf)
S = 

(x-16x2-18x416x2+18x4+190x5+1)[x - 1/(6*x^2) - 1/(8*x^4); 1/(6*x^2) + 1/(8*x^4) + 1/(90*x^5) + 1]

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 = 

(x-16x2-18x4-190x5-37336x616x2+18x4+190x5+37336x6+371680x7+1)[x - 1/(6*x^2) - 1/(8*x^4) - 1/(90*x^5) - 37/(336*x^6); 1/(6*x^2) + 1/(8*x^4) + 1/(90*x^5) + 37/(336*x^6) + 37/(1680*x^7) + 1]

Solve the differential equation dydx=1x2e-1x without specifying the initial condition.

syms y(x)
eqn = diff(y) == exp(-1/x)/x^2;
ySol(x) = dsolve(eqn)
ySol(x) = 

C1+e-1xC1 + exp((-1/x))

To eliminate constants from the solution, specify the initial condition y(0)=1.

cond = y(0) == 1;
S = dsolve(eqn,cond)
S = 

e-1x+1exp((-1/x)) + 1

The function e-1x in the solution ySol(x) has different one-sided limits at x=0. The function has a right-side limit, limx0+e-1x=0, but it has undefined left-side limit, limx0-e-1x=.

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, limxx0+.

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, which could lead to results not generally valid. In other words, this option applies mathematical identities that are convenient, but the results might not hold for all possible values of the variables. 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: O(varn) or O(varn).

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, limxx0+ .

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

Introduced before R2006a