ktongue's picture
download
raw
5.25 kB
=========
Solvers
=========
>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>> init_printing(use_unicode=True)
A Note about Equations
======================
Recall from the :ref:`gotchas <tutorial_gotchas_equals>` section of this
tutorial that symbolic equations in SymPy are not represented by ``=`` or
``==``, but by ``Eq``.
>>> Eq(x, y)
x = y
However, there is an even easier way. In SymPy, any expression is not in an
``Eq`` is automatically assumed to equal 0 by the solving functions. Since `a
= b` if and only if `a - b = 0`, this means that instead of using ``x == y``,
you can just use ``x - y``. For example
>>> solve(Eq(x**2, 1), x)
[-1, 1]
>>> solve(Eq(x**2 - 1, 0), x)
[-1, 1]
>>> solve(x**2 - 1, x)
[-1, 1]
This is particularly useful if the equation you wish to solve is already equal
to 0. Instead of typing ``solve(Eq(expr, 0), x)``, you can just use
``solve(expr, x)``.
Solving Equations Algebraically
===============================
The main function for solving algebraic equations, as we saw above, is
``solve``. The syntax is ``solve(equations, variables)``, where, as we saw
above, ``equations`` may be in the form of ``Eq`` instances or expressions
that are assumed to be equal to zero.
.. TODO: This is a mess, because solve() has such a complicated interface.
When solving a single equation, the output of ``solve`` is a list of the
solutions.
>>> solve(x**2 - x, x)
[0, 1]
If no solutions are found, an empty list is returned, or
``NotImplementedError`` is raised.
>>> solve(exp(x), x)
[]
.. note::
If ``solve`` returns ``[]`` or raises ``NotImplementedError``, it doesn't
mean that the equation has no solutions. It just means that it couldn't
find any. Often this means that the solutions cannot be represented
symbolically. For example, the equation `x = \cos(x)` has a solution, but
it cannot be represented symbolically using standard functions.
>>> solve(x - cos(x), x)
Traceback (most recent call last):
...
NotImplementedError: multiple generators [x, exp(I*x)]
No algorithms are implemented to solve equation exp(I*x)
In fact, ``solve`` makes *no guarantees whatsoever* about the completeness
of the solutions it finds. Much of ``solve`` is heuristics, which may find
some solutions to an equation or system of equations, but not all of them.
``solve`` can also solve systems of equations. Pass a list of equations and a
list of variables to solve for.
>>> solve([x - y + 2, x + y - 3], [x, y])
{x: 1/2, y: 5/2}
>>> solve([x*y - 7, x + y - 6], [x, y])
⎡⎛ ___ ___ ⎞ ⎛ ___ ___ ⎞⎤
⎣⎝- ╲╱ 2 + 3, ╲╱ 2 + 3⎠, ⎝╲╱ 2 + 3, - ╲╱ 2 + 3⎠⎦
.. note::
The type of the output of ``solve`` when solving systems of equations
varies depending on the type of the input. If you want a consistent
interface, pass ``dict=True``.
>>> solve([x - y + 2, x + y - 3], [x, y], dict=True)
[{x: 1/2, y: 5/2}]
>>> solve([x*y - 7, x + y - 6], [x, y], dict=True)
⎡⎧ ___ ___ ⎫ ⎧ ___ ___ ⎫⎤
⎢⎨x: - ╲╱ 2 + 3, y: ╲╱ 2 + 3⎬, ⎨x: ╲╱ 2 + 3, y: - ╲╱ 2 + 3⎬⎥
⎣⎩ ⎭ ⎩ ⎭⎦
.. _tutorial-roots:
``solve`` reports each solution only once. To get the solutions of a
polynomial including multiplicity use ``roots``.
>>> solve(x**3 - 6*x**2 + 9*x, x)
[0, 3]
>>> roots(x**3 - 6*x**2 + 9*x, x)
{0: 1, 3: 2}
The output ``{0: 1, 3: 2}`` of ``roots`` means that ``0`` is a root of
multiplicity 1 and ``3`` is a root of multiplicity 2.
.. _tutorial-dsolve:
Solving Differential Equations
==============================
To solve differential equations, use ``dsolve``. First, create an undefined
function by passing ``cls=Function`` to the ``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.
>>> f(x)
f(x)
Derivatives of ``f(x)`` are unevaluated.
>>> f(x).diff(x)
d
──(f(x))
dx
(see the :ref:`Derivatives <tutorial-derivatives>` section for more on
derivatives).
To represent the differential equation `f''(x) - 2f'(x) + f(x) = \sin(x)`, we
would thus use
>>> diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))
>>> diffeq
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 ``dsolve``.
>>> dsolve(diffeq, f(x))
x cos(x)
f(x) = (C₁ + C₂⋅x)⋅ℯ + ──────
2
``dsolve`` returns an instance of ``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.

Xet Storage Details

Size:
5.25 kB
·
Xet hash:
87cddec3f927470b7d639b67e6c6a5b20256a5a7c66752074a4af5b25c7639f3

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.