|
Calling Sequence
|
|
dsolve(ODE)
dsolve(ODE, arbitraryconstants = ...)
dsolve(ODE, y(x), extra_args)
dsolve({ODE, ICs}, y(x), extra_args)
dsolve({sysODE, ICs}, {funcs}, extra_args)
|
|
Parameters
|
|
ODE
|
-
|
ordinary differential equation
|
arbitraryconstants = ...
|
-
|
optional, the right-hand side can be subscripted (default value starting with Maple 2023) or traditional (previous Maple versions)
|
y(x)
|
-
|
indeterminate function of one variable, required if ODE contains derivatives of more than one such function
|
ICs
|
-
|
initial conditions
|
{sysODE}
|
-
|
set with a system of ODEs
|
{funcs}
|
-
|
set with indeterminate functions
|
extra_args
|
-
|
(optional) depends on the type of problem being solved (see below)
|
|
|
|
|
Description
|
|
•
|
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.
|
|
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):
|
•
|
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 represent any pair of independent and dependent variables.
|
•
|
Closed form solutions are returned by dsolve as a sequence of explicit or implicit equations, where the (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 ). Note that dsolve is sensitive to the 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 , where is the parameter and the right hand sides are explicit expressions of .
|
•
|
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 (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 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 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 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 . Note that, depending on the case (for example, take some 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 , with an integer. These are literal subscripts symbols constructed, e.g., as in c__1, displayed as . Optionally, these constants can be displayed 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 . 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 it suffices to do one call to dsolve with the optional argument arbitraryconstants = subscripted. NOTE: when displaying these constands as , an alias is automatically set, so that programs written expecting the traditional display of previous releases work the same way, without requiring any changes.
|
|
|
|
Options
|
|
•
|
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.
|
|
implicit
|
|
|
To avoid dsolve trying to make an answer explicit.
|
|
|
explicit
|
|
|
To request answers in explicit form in all cases, provided that solve succeeds in isolating the dependent variable.
|
|
|
parametric
|
|
|
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.
|
|
|
useInt
|
|
|
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.
|
|
|
useint
|
|
|
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.
|
|
|
class
|
|
|
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.
|
|
|
Lie
|
|
|
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
|
|
|
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 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.
|
| (1) |
>
|
`dsolve/methods`[1,'semiclass'];
|
| (2) |
>
|
`dsolve/methods`[1,'high_degree'];
|
| (3) |
•
|
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.
|
|
|
output=basis
|
|
|
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.
|
|
|
convert_to_exact=false
|
|
|
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.
|
|
|
|
Examples
|
|
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
|
|
>
|
ode[1] := sin(x)*diff(y(x),x) - cos(x)*y(x) = 0;
|
| (4) |
|
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);
|
| (6) |
|
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
|
>
|
DEtools[odeadvisor](ode[1]);
|
>
|
dsolve(ode[1], [separable], useInt);
|
| (9) |
| (10) |
| (11) |
|
Recalling that arbitrary constants can always be redefined, by making the replacement 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]);
|
>
|
ode[2] := diff(y(x),x) - y(x)^2+y(x)*sin(x) - cos(x) = 0;
|
| (14) |
>
|
DEtools[odeadvisor](ode[2]);
|
|
Computing exact solutions for ODEs is about mapping them into as many integration problems as the differential order. The integrals are not always computable
|
| (16) |
>
|
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));
|
| (17) |
|
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]);
|
| (18) |
|
The solution for the related exact ODE using the method for exact ODEs
|
>
|
sol[3] := simplify( dsolve( mu*ode[3], [exact]) );
|
| (19) |
|
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;
|
| (21) |
>
|
ans[4] := dsolve(ode[4]);
|
| (22) |
>
|
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
|
| (24) |
|
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));
|
| (25) |
>
|
DEtools[odeadvisor](ode[5]); # try also: DEtools[odeadvisor](ode[5], help);
|
| (26) |
| (27) |
|
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);
|
| (28) |
| (29) |
|
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;
|
| (30) |
>
|
DEtools[intfactor](ode[7]);
|
| (31) |
|
These integrating factors are automatically computed and used by dsolve to obtain the solution
|
| (32) |
|
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);
|
| |
| (33) |
>
|
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;
|
| (34) |
|
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);
|
| (35) |
|
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 for some function (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);
|
| (36) |
>
|
sol[9] := dsolve(ode[9], _mu = x*f(y(x),diff(y(x),x)), implicit);
|
| (37) |
|
Implicit solutions like this one can also be tested with odetest
|
>
|
odetest(sol[9], ode[9]);
|
>
|
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;
|
| (39) |
|
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;
|
| (41) |
>
|
DEtools[odeadvisor](ode[11]);
|
| (42) |
>
|
sol[11] := dsolve(ode[11]);
|
| (43) |
|
The presence of uncomputed integrals composed with RootOf is not an obstacle for testing the solution
|
>
|
odetest(sol[11],ode[11]);
|
|
|
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;
|
| (45) |
>
|
DEtools[odeadvisor](ode[12]);
|
| (46) |
>
|
sol[12] := dsolve(ode[12]);
|
| (47) |
|
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(y)(x); # returns the dependent variable
|
>
|
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;
|
| (53) |
|
The functional form to be sent to dsolve, with derivatives represented using the D notation, is obtained applying the operator ODE:
|
| (54) |
>
|
functional_form_ODE := simplify(convert((54), diff) , size );# usual representation of derivatives using the diff notation
|
| (55) |
>
|
dsolve( functional_form_ODE ); # the ODE solution
|
| (56) |
•
|
Since Maple 2023, the arbitrary constants are of the form , literal subscripts, that you can input as, e.g., c__1. In previous releasees, these arbitrary constants where of the form , 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 , by calling dsolve once with the optional argument arbitraryconstants = traditional
|
>
|
dsolve(diff(y(x), x) = y(x), arbitraryconstants = traditional);
|
| (57) |
|
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));
|
| (58) |
|
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);
|
| (59) |
>
|
dsolve(diff(y(x), x, x) = y(x));
|
| (60) |
| (61) |
>
|
Setup(anticommutativepre = {theta, Q});
|
| |
| |
| (62) |
•
|
Consider this ordinary differential equation for the anticommutative function of a commutative variable
|
>
|
diff(Q(x), x, x) - Q(x)*diff(Q(x), x) = 0;
|
•
|
Its solution using dsolve involves an anticommutative constant , analogous to the commutative constants
|
| (64) |
|
|
|
|