# diofant/diofant

Fetching contributors…
Cannot retrieve contributors at this time
108 lines (77 sloc) 3.45 KB

# Solvers

This section covers equations solving.

Note

Any expression in input, that not in an :class:`~diofant.core.relational.Eq` is automatically assumed to be equal to 0 by the solving functions.

## Algebraic Equations

The main function for solving algebraic equations is :func:`~diofant.solvers.solvers.solve`.

When solving a single equation, the output is a list of the solutions.

```>>> solve(x**2 - x, x)
[{x: 0}, {x: 1}]```

If no solutions are found, an empty list is returned.

```>>> solve(exp(x), x)
[]```

:func:`~diofant.solvers.solvers.solve` can also solve systems of equations.

```>>> solve([x - y + 2, x + y - 3], [x, y])
[{x: 1/2, y: 5/2}]
>>> solve([x*y - 7, x + y - 6], [x, y])
⎡⎧       ___           ___    ⎫  ⎧     ___             ___    ⎫⎤
⎢⎨x: - ╲╱ 2  + 3, y: ╲╱ 2  + 3⎬, ⎨x: ╲╱ 2  + 3, y: - ╲╱ 2  + 3⎬⎥
⎣⎩                            ⎭  ⎩                            ⎭⎦```

:func:`~diofant.solvers.solvers.solve` reports each solution only once.

```>>> solve(x**3 - 6*x**2 + 9*x, x)
[{x: 0}, {x: 3}]```

To get the solutions of a polynomial including multiplicity use :func:`~diofant.polys.polyroots.roots`.

```>>> roots(x**3 - 6*x**2 + 9*x, x)
{0: 1, 3: 2}```

## Differential Equations

To solve differential equations, use :func:`~diofant.solvers.ode.dsolve`. First, create an undefined function by passing `cls=Function` to the :func:`~diofant.core.symbol.symbols` function.

`>>> f, g = symbols('f g', cls=Function)`

`f` and `g` are now undefined functions. We can call `f(x)`, and it will represent an unknown function application. Derivatives of `f(x)` are unevaluated.

```>>> f(x).diff(x)
d
──(f(x))
dx```

To represent the differential equation f''(x) - 2f'(x) + f(x) = sin(x), we would thus use

```>>> Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))
2
d           d
f(x) - 2⋅──(f(x)) + ───(f(x)) = sin(x)
dx           2
dx```

To solve the ODE, pass it and the function to solve for to :func:`~diofant.solvers.ode.dsolve`.

```>>> dsolve(_, f(x))
x               cos(x)
f(x) = ℯ ⋅(C₁ + C₂⋅x) + ──────
2```

:func:`~diofant.solvers.ode.dsolve` returns an instance of :class:`~diofant.core.relational.Eq`. This is because in general, solutions to differential equations cannot be solved explicitly for the function.

```>>> dsolve(f(x).diff(x)*(1 - sin(f(x))), f(x))
f(x) + cos(f(x)) = C₁```

The arbitrary constants in the solutions from dsolve are symbols of the form `C1`, `C2`, `C3`, and so on.

:func:`~diofant.solvers.ode.dsolve` can also solve systems of equations, like :func:`~diofant.solvers.solvers.solve`.

```>>> dsolve([f(x).diff(x) - g(x), g(x).diff(x) - f(x)], [f(x), g(x)])
⎡          ⎛ x    -x⎞      ⎛ x    -x⎞            ⎛ x    -x⎞      ⎛ x    -x⎞⎤
⎢          ⎜ℯ    ℯ  ⎟      ⎜ℯ    ℯ  ⎟            ⎜ℯ    ℯ  ⎟      ⎜ℯ    ℯ  ⎟⎥
⎢f(x) = C₁⋅⎜── + ───⎟ + C₂⋅⎜── - ───⎟, g(x) = C₁⋅⎜── - ───⎟ + C₂⋅⎜── + ───⎟⎥
⎣          ⎝2     2 ⎠      ⎝2     2 ⎠            ⎝2     2 ⎠      ⎝2     2 ⎠⎦```