Detailed Overview - Maple Help
For the best experience, we recommend viewing online help using Google Chrome or Microsoft Edge.

Online Help

All Products    Maple    MapleSim


solve ordinary differential equations (ODEs)


Calling Sequence



Input and Output


Solving Methods


Calling Sequence


dsolve(ODE, arbitraryconstants = ...)

dsolve(ODE, y(x), extra_args)

dsolve({ODE, ICs}, y(x), extra_args)

dsolve({sysODE, ICs}, {funcs}, extra_args)




ordinary differential equation

arbitraryconstants = ...


optional, the right-hand side can be subscripted (default value starting with Maple 2023) or traditional (previous Maple versions)



indeterminate function of one variable, required if ODE contains derivatives of more than one such function



initial conditions



set with a system of ODEs



set with indeterminate functions



(optional) depends on the type of problem being solved (see below)



As a general ODE solver, dsolve handles different types of ODE problems. These include the following.


- Looking for closed form solutions for a single ODE (see below), or a system of ODEs (see dsolve, system).


- Solving ODEs or a system of them with given initial conditions (boundary value problems). See dsolve, ICs.


- Looking for formal power series solutions to a linear ODE with polynomial coefficients. See dsolve, formal_series.


- Looking for formal solution to a linear ODE with polynomial coefficients. See dsolve, formal_solution.


- Looking for solutions using integral transforms (Laplace, Fourier). See dsolve, integral_transform.


- Looking for numerical (see dsolve, numeric) or series solutions (see dsolve, series) to ODEs or systems of them.


- In the case of one or a system of ODEs without initial conditions, dsolve also works with anticommutative variables set using the Physics package using the approach explained in PerformOnAnticommutativeSystem.


In the case of a single ODE, dsolve tries to solve it using either classification methods or symmetry methods. Using symmetry methods, dsolve first looks for the generators of symmetry groups of the given ODE, and then uses this information to integrate it, or at least reduce its order. Classification methods are used when the ODE matches a recognizable pattern (that is, for which a solving method is already implemented), and symmetry methods are reserved for the non-classifiable cases.


To see what method is being used to solve a given ODE, you can assign the following (see infolevel):

infolevel[dsolve]:= 3;


The ODE Analyzer, a new interactive interface, has been created for numeric and symbolic solutions of ODE and ODE systems. The interface is easy to use, with many common options. In addition to the computation of solutions and solution values, plots can also be generated. The interface is suitable as an educational tool; it can provide the corresponding Maple commands needed to compute the solution or plot. For information on launching the interface (and command-line options), see dsolve/interactive. For an illustrated description of the interface, see worksheet/interactive/dsolve.

Input and Output


Given an ODE, an extra argument indicating the dependent variable is required only when the given ODE involves more than one function being differentiated. When extra arguments are given, they can be placed in any order after the first one. Note that ODEs can also be constructed by applying (differential) operators - see an example at the end of the page.


Caveat: if the first argument ODE is a set or list, even with a single element, or ODE is one of the cases output by the casesplit command, the input is treated as an "ODE system" and the output follows the corresponding conventions described in dsolve,system.


Herein x,yx represent any pair of independent and dependent variables.


Closed form solutions are returned by dsolve as a sequence of explicit yx=Fx,cn or implicit Fyx,x,cn=0 equations, where the cn (n=integer) are arbitrary constants. If no solutions are found, the empty sequence (NULL) is returned.


By default, dsolve returns the answer in explicit form, unless solve is not able to isolate the dependent variable, or its isolation requires the inversion of fractional powers, or the isolation can only be obtained by means of RootOf (as say yx=RootOf... ). Note that dsolve is sensitive to the _EnvExplicit variable used by solve.


In the case of a first order ODE of high degree in dy/dx, the solution may also appear in parametric form as x_T=f_T,y_T=g_T, where _T is the parameter and the right hand sides are explicit expressions of _T.


For high order ODEs, dsolve might succeed in reducing the order of the ODE but not in solving the problem to the end. The answer is then expressed using a scheme for conveying reductions of order (see dsolve,ODESolStruc and the example below). You may then be able to obtain a solution for the reduced ODE by manipulating it using the tools available in DEtools, or as a series expansion, or by other means. When a solution to the reduced ODE is obtained, a solution to the original problem can be built using DEtools[buildsol].


For linear ODEs, when dsolve is not able to find a solution or a reduction of order, an answer using DESol is returned. DESol structures can also appear in answers involving reductions of orders of linear ODEs. Although DESol structures do not contain more information than the ODE itself, they can be useful in further computations since Maple can manipulate them, for example, by expanding in series, or by simplifying. See DESol.


Integrals appearing in answers returned by dsolve are expressed using the inert Int and Intat (not int or intat). These integrals appear when int is not able to calculate them or when it appears to be convenient not to evaluate them during the solving process. You can request the evaluation of these integrals using the value command.


Floating-point numbers appearing in the given ODE are converted to rational exact numbers before attempting to solve the problem. See optional argument convert_to_exact=false below.


The symbol variables _yn (n=integer) are reserved for use by internal routines and should not be assigned.

Arbitrary Constants, General, Particular and Singular ODE Solutions


The arbitrary constants appearing in the output of dsolve are arbitrary in that they represent any mathematical expression not depending on x, where x is the independent variable. In brief, they satisfy ⅆⅆxc__n=0 and are not restricted to be finite. When an arbitrary constant approaches  the actual form of the resulting solution is obtained by taking limits.


A general solution to an ODE depends on as many arbitrary constants as the differential order, say N. Conversely, any solution depending on N arbitrary constants is a general solution. Depending on N constants here means there is no possible redefinition of the cn in terms of other N independent constants that results in a form of the solution with fewer than N constants.


Because a set of arbitrary constants cn can always be rewritten in terms of other constants, a general ODE solution can be rewritten in infinitely many different manners. In doing so, and with no exceptions, all the particular solutions of an ODE can be obtained from the general solution by specializing the arbitrary constants cn. Note that, depending on the case (for example, take some cn approaching , or approaching a finite value that makes a denominator approach zero), the process of obtaining a particular solution from the general solution may involve taking limits.


The only solutions involving fewer than N arbitrary constants that may not be included in the general solution of an ODE are the so called singular solutions. Only nonlinear ODEs admit singular solutions. For a discussion about singular solutions, see the examples in essential_components. By default, dsolve computes the general and essentially singular solutions of a nonlinear ODE; the latter are the singular solutions that cannot be obtained from the general solution by specializing the integration constants in any way.


The arbitrary constants appearing in the output of dsolve are of the form cn, with n an integer. These are literal subscripts symbols constructed, e.g., as in c__1, displayed as c1. Optionally, these constants can be displayed _Cn as in Maple releases prior to 2023; for that purpose call dsolve once with the extra argument arbitraryconstants = traditional, and all subsequent calls will automatically display the arbitrary constants using the traditional form _Cn. You can also indicate the traditional form to be the default display by adding this line to your maple initialization file: `dsolve/arbitraryconstants` = traditional. After that, to return to the default display fn it suffices to do one call to dsolve with the optional argument arbitraryconstants = subscripted. NOTE: when displaying these constands as cn, an alias cn=_Cn is automatically set, so that programs written expecting the traditional display _Cn of previous releases work the same way, without requiring any changes.



For the optional arguments in the context of IC problems, systems of ODEs, series or numeric solutions, or the use of integral transforms, see the links to the respective help pages in the previous section.


In the case of single ODEs, optional arguments can be given in any order after the first one. A summary of the optional arguments most frequently used is given by the following.





To avoid dsolve trying to make an answer explicit.





To request answers in explicit form in all cases, provided that solve succeeds in isolating the dependent variable.





To request the use of only the parametric solving scheme when solving a single first order ODE, possibly of high degree in dy/dx. Note however that by default dsolve tries to remove the parameter used during the solving process. To keep the parameter, specify the optional argument 'implicit' together with 'parametric'.



'singsol' = ...


The right-hand-side is one of the keywords none, essential or all, to respectively request computing none, only the essentially singular (default behavior), or all the singular solutions; the latter includes singular solutions that can nevertheless be obtained from the general solution by specializing the integration constants.





To request the use of Int (the inert integral) instead of the default integrator during the solving process. This option is useful to speed up the solving process in many cases, and to see the form of the answer before the integrals are performed (pedagogical purposes). To perform the integrals afterwards, apply the value command to the answer returned by dsolve.





To request the use of int instead of the default integrator during the solving process. This option makes dsolve attempt computing any integral present in the solution, regardless of the convenience of doing that. This option is of use when the heuristic procedure for deciding about the convenience of performing an integral does not lead to the simpler ODE solution.





To request the use of only classification methods (see odeadvisor) and avoid using symmetry methods.



solution = ...


To request the use of a specified solution, passed as an equation with the unknown isolated to the left and its value to the right, when adjusting initial conditions to solve an ODE-IVP.



usesolutions = ...


The right hand side can be any of "particular", "particular via integrating factors", "particular via symmetries", "particular via symmetries and general", "general", "general and particular", "general and particular via symmetries", "general and particular via integrating factors", to request the use of different kinds of solutions and try them in different orders when tackling ODE initial value problems.





To request the use of Lie's symmetry methods before trying the classification methods. Additional information about the symmetry scheme and various other related optional arguments is found in dsolve, Lie.

_mu = int_factor_hint


'_mu = int_factor_hint'


To request the search and use of integrating factors of the form suggested in int_factor_hint, which could be either an algebraic expression or a list of them, containing unknowns in the form of functions of x,y,y',... or any symbols whose values are to be determined. When int_factor_hint contains no unknowns only a direct test of it using mutest is performed to validate or discard the hint. When the hint contains unknowns, dsolve uses the Maple intfactor routines to compute integrating factors of the suggested form, then use its own routines to transform this information into a solution to the given ODE when possible. See examples below.

[method1, method2, ...]


'[method1, method2, ...]'


To request the use of only '[method1, method2, ...]' , and in that order, when solving a given ODE. Each method is represented by a related keyword in a list of methods. For first order ODEs, for instance, the methods available are the following.










To see all the subdivisions and the methods available for different orders, you can use the indices and entries commands. Methods under development are not yet in use by dsolve, and can only by tried by explicitly indicating them by using this list of methods ('[method1, method2,...]') option.





Only for linear ODEs, to request the answer as a list of functions that span the solution space. If the differential equation is non-homogeneous, dsolve returns a list containing the list of basis functions followed by a single particular solution.





To avoid converting floating-point numbers to rational exact numbers; although the use of this optional argument does work in most cases, depending on the ODE input the use of the related method may slow down the process - sometimes leading to unsolvable ODE problems.


Other optional parameters involved in the solving scheme used by dsolve are explained in dsolve,setup.

Solving Methods


For tackling linear and nonlinear ODEs of all orders, the present implementation of dsolve makes use of a combination of classification, integrating factor and symmetry methods, equivalence methods (classical invariant theory), as well as a number of decision procedures like Kovacic's algorithm.


Most of the classification methods implemented have a related help page (see odeadvisor). These help pages can be displayed by either following the hyperlinks found in that page, or by using the odeadvisor command itself. The decision algorithms for linear ODEs are explained in dsolve,linear. The implementation of Lie's symmetry method in dsolve is explained in dsolve,Lie. For more details and references about the solving methods and its computational implementations, see dsolve, algorithms and dsolve, references.


Other tools for working with ODEs are available in the DEtools package. These include, for example, routines for plotting ODEs; manipulating linear ODEs and linear differential operators; and performing most of the steps of the symmetry method. For all this, see DEtools. For changing variables, see dchange.

A Note on Solutions with Special Functions versus Solutions Involving Simpler Functions


When using special functions to represent ODE solutions, a difficult mathematical problem is to determine whether the special function admits a representation in terms of simpler functions. For example, you may prefer to see the solution in terms of 2F1 hypergeometric functions instead of HeunC, and prefer a solution in terms of exponentials or sin instead of Kummer or Bessel functions.


To address this problem, when solving first order Riccati and Abel type equations (see references and examples), dsolve's routines have two mechanisms.


When the solution can be written in terms of simpler Liouvillian or hypergeometric functions, the routines automatically detect that, before computing any solution, and return the simpler representation.


By assigning the environment variable _Env_dsolve_Abel_AIR_use_simpler_functions to false or true, you can request to never or always (try to) compute a solution in terms of simpler functions.


The reason for providing the environment variable mechanism is twofold. Through it, you can make the routines return a simpler solution, when it exists, but its existence is difficult to determine a priori, or you can make them return the special function solution form, even when a solution in terms of simpler functions is known to the routines. This is useful for investigating the special cases of the more advanced functions entering alternative forms of the solution.


The following examples illustrate the use of dsolve in solving a single ODE. For examples related to more specific problems see: dsolve,initial_conditions, dsolve,system, dsolve,numeric, dsolve,integral_transform, dsolve,series, and dsolve,formal_series.

First-Order ODEs


A linear equation (see odeadvisor)

ode[1] := sin(x)*diff(y(x),x) - cos(x)*y(x) = 0;






You can indicate to dsolve to use a specific sequence of 'methods' to tackle the ODE. In the following example, the method for 'linear' ODEs is indicated; in addition the optional argument 'useInt' makes dsolve not evaluate the integral appearing in the solution.

dsolve(ode[1], [linear], useInt);



To see the solution before evaluating integrals is useful to understand how it was obtained. Integrals can be evaluated afterwards using value.




This linear ODE is homogeneous (no term independent of y(x)) and so also separable




dsolve(ode[1], [separable], useInt);

cotxⅆx` `yx1_aⅆ_a+c__1=0





isolate((10), y(x));



Recalling that arbitrary constants can always be redefined, by making the replacement ⅇc__1c__1 you re-obtain the form of the solution returned by dsolve(ode[1]).


As a general alternative, you can also look for an integrating factor (see DEtools,intfactor).

mu := DEtools[intfactor](ode[1]);



Integrating factors make ODEs exact. To indicate to dsolve to use the scheme for exact ODEs use

dsolve( mu*ode[1], [exact]);



A Riccati type equation

ode[2] := diff(y(x),x) - y(x)^2+y(x)*sin(x) - cos(x) = 0;






Computing exact solutions for ODEs is about mapping them into as many integration problems as the differential order. The integrals are not always computable




An ODE of Abel type

ode[3] := diff(y(x),x) = x*(-x-1+x^2-2*x^2*y(x)+2*x^4)/((x^2-y(x))*(x+1));



dsolve automatically solves this equation by computing an integrating factor for it. dsolve's internal solving steps can be reproduced at the Maple prompt as follows

mu := DEtools[intfactor](ode[3]);



The solution for the related exact ODE using the method for exact ODEs

sol[3] := simplify( dsolve( mu*ode[3], [exact]) );



Explicit or implicit solutions can be tested, in principle, using odetest.

odetest(sol[3], ode[3]);



ODE of high degree in dy/dx:

ode[4] := x^(n-1)*diff(y(x),x)^n - n*x*diff(y(x),x) + y(x) = 0;



In these cases, dsolve first tries a set of methods for high degree ODEs, including a parametric solving scheme.

ans[4] := dsolve(ode[4]);



odetest(ans[4], ode[4]);



To see the solution in parametric form, use the extra arguments parametric and implicit 'implicit'

dsolve(ode[4], parametric, implicit);  # directly invokes parametric methods, and request a solution in implicit form



High degree ODEs may admit singular solutions, returned together with the general solution. Also, depending on the case dsolve may not be able to remove the parameter introduced in the solving process. For example,

ode[5] := y(x)/x = F(diff(y(x),x));



DEtools[odeadvisor](ode[5]);      # try also: DEtools[odeadvisor](ode[5], help);

_homogeneous,class B,_dAlembert





Note the singular solutions appear first and depend on less arbitrary constants than the differential order.

Second-Order Linear and Nonlinear ODEs


A second order linear homogeneous ODE:

ode[6] := diff(y(x),x,x) = x^n*n*(n-1+x^n*n-cos(x)*x)/x^2*y(x) + cos(x)*diff(y(x),x);






Second and higher order Linear ODEs can also be solved by computing integrating factors. For this linear ODE, two integrating factors are

ode[7] := diff(y(x),x,x) = (y(x)*x+y(x)*ln(x)*x^2 + diff(y(x),x)*ln(x)*x^2)/ln(x)/x^2*exp(x) - y(x)/ln(x)/x^2;






These integrating factors are automatically computed and used by dsolve to obtain the solution




For descriptions of the methods used to solve linear ODEs see dsolve,linear, dsolve,hypergeometric and dsolve,integrating_factors_for_LODEs.


A nonlinear second order example from Kamke's book: to enhance the display on the screen use PDEtools[declare]

PDEtools[declare](y(x), prime=x);

yxwill now be displayed asy

derivatives with respect toxof functions of one variable will now be displayed with '


ode[8] := 2*diff(y(x),x,x)*y(x) - diff(y(x),x)^2 - 6*diff(f(x),x,x)/diff(f(x),x)*y(x)*diff(y(x),x) + 2*(-2*diff(f(x),x,x,x)/diff(f(x),x)+6*diff(f(x),x,x)^2/diff(f(x),x)^2)*y(x)^2-8*y(x)^3 = 0;

ode82y''yy'26f ''yy'f '+22f '''f '+6f ''2f '2y28y3=0


Here the alternative 'useint' option makes dsolve compute the integrals in the solution, in this way leading to the simplest solution possible

dsolve(ode[8], y(x), useint);

y=f '2JacobiSNc__1c__2+fx,2221c__122


To indicate to dsolve the search and use of integrating factors of some predefined form (when they exist) use the _mu = some_mu_form option. For example, dsolve solves the following ODE using integrating factors of the form xfy,y' for some function fy,y' (dsolve's task is to determine it)

ode[9] := diff(y(x),x,x) = (y(x) + x*diff(y(x),x) + 2*x*y(x)*diff(y(x),x) + x^2*diff(y(x),x)^2)*diff(y(x),x)/x/y(x);



sol[9] := dsolve(ode[9], _mu = x*f(y(x),diff(y(x),x)), implicit);



Implicit solutions like this one can also be tested with odetest

odetest(sol[9], ode[9]);



A nonlinear second order example solved using symmetry methods:

ode[10] := diff(y(x),x,x)*diff(y(x),x)*y(x)*x^6 - 2*diff(y(x),x)^3*x^6 + 2*diff(y(x),x)^2*y(x)*x^5 + y(x)^5 = 0;





A nonlinear example with an arbitrary function (F) of its arguments:

ode[11] := diff(y(x),x,x) = F(x*diff(y(x),x)/y(x))*y(x)/x^2;






sol[11] := dsolve(ode[11]);

sol11y=ⅇ` `lnxRootOf` `_Z1_a_a2+F_aⅆ_a_b+c__1ⅆ_b+c__2


The presence of uncomputed integrals composed with RootOf is not an obstacle for testing the solution




For descriptions of the methods used to solve nonlinear ODEs see dsolve,Lie and dsolve,integrating_factors.

Higher-Order Nonlinear ODEs


A reduction of order from 4 to 1 (dsolve,ODESolStruc), using Lie's symmetry methods (see dsolve,Lie), for example, 14 (nonlinear high order) from Kamke's book:

ode[12] := diff(y(x),x)*diff(y(x),x$4) - diff(y(x),x,x)*diff(y(x),x$3) + diff(y(x),x)^3*diff(y(x),x$3) = 0;






sol[12] := dsolve(ode[12]);



In the above, the right-hand side is a structure of two operands, where the first one is the solution in terms of new variables, and the second one is a list with three sets, respectively containing the reduced ODE, the transformation of variables used to solve the problem, and the inverse transformation (see dsolve,ODESolStruc).


These reductions of order can also be tested using odetest.

map(odetest, [sol[12]], ode[12]);



Instead of using the function notation as done in the examples above, ODEs can also be constructed by applying operators. For example, these are operators for the dependent (identity) and independent variables

Y := f -> f;



Y(y)(x);    # returns the dependent variable



X := f -> Y;



X(y)(x);    # returns the independent variable



With Y, X and the D (differential) operator, you can construct an operator representing an ODE. To illustrate the idea, we do that here using also the composition operator @ (see also @@)

ODE := (D/X-Y)@(X*D + 2*D + 17*Y*X) + Y*X;



The functional form to be sent to dsolve, with derivatives represented using the D notation, is obtained applying the operator ODE:




functional_form_ODE := simplify(convert((54), diff) , size );# usual representation of derivatives using the diff notation



dsolve( functional_form_ODE );    # the ODE solution



Since Maple 2023, the arbitrary constants are of the form cn, literal subscripts, that you can input as, e.g., c__1. In previous releasees, these arbitrary constants where of the form _Cn, e.g., _C1. The implementation in Maple 2023 maps both formats of constants into one and the same thing, so both c__1 = _C1, and you can optionally make these arbitrary constants be displayed using the traditional way, as _Cn, by calling dsolve once with the optional argument arbitraryconstants = traditional

dsolve(diff(y(x), x) = y(x), arbitraryconstants = traditional);



You don't need to add this optional argument each time: after the call above, all arbitrary constants returned by dsolve in subsequent calls will be displayed in traditional form.

dsolve(diff(y(x), x, x) = y(x));



If you then want to return to the default display of arbitrary constants using literal subscripts, call dsolve with the optional argument arbitraryconstants = subscripted

dsolve(diff(y(x), x) = y(x), arbitraryconstants = subscripted);



dsolve(diff(y(x), x, x) = y(x));



dsolve can solve ODEs that involve anticommutative variables set using the Physics package using the approach explained in PerformOnAnticommutativeSystem.




Set first θ and Q as suffixes for variables of type/anticommutative (see Setup)

Setup(anticommutativepre = {theta, Q});

* Partial match of 'anticommutativepre' against keyword 'anticommutativeprefix'




Consider this ordinary differential equation for the anticommutative function Q of a commutative variable x

diff(Q(x), x, x) - Q(x)*diff(Q(x), x) = 0;



Its solution using dsolve involves an anticommutative constant _lambda1, analogous to the commutative constants c__1




See Also



















int or Int

intat or Intat