-
Notifications
You must be signed in to change notification settings - Fork 0
Symbolic integration
There is a general method for calculating antiderivatives of elementary functions, called the Risch algorithm. The Risch algorithm is a decision procedure that can determine whether an elementary solution exists, and in that case calculate it. It can be extended to handle many nonelementary functions in addition to the elementary ones.
SymPy currently uses a simplified version of the Risch algorithm, called the Risch-Norman algorithm. This algorithm is much faster, but may fail to find an antiderivative, although it is still very powerful. SymPy also uses pattern matching and heuristics to speed up evaluation of some types of integrals, e.g. polynomials.
See references for relevant literature.
Rational functions can be integrated.
<math>\int \frac{x}{x^2 + 2x + 1} dx = \frac{1}{1+x} + \log(1+x)</math>
>>> integrate(x/(x**2+2*x+1), x)
1
+ log(1 + x)
1 + x
>>> integrate(x/(x**2+3*x+1), x)
⎛ ⎽⎽⎽⎞ ⎛ ⎽⎽⎽⎞ ⎛ ⎽⎽⎽⎞ ⎛ ⎽⎽⎽⎞
⎜ 3*╲╱ 5 ⎟ ⎜ ╲╱ 5 ⎟ ⎜ 3*╲╱ 5 ⎟ ⎜ ╲╱ 5 ⎟
⎜1/2 - ───────⎟*log⎜3/2 + x - ─────⎟ + ⎜1/2 + ───────⎟*log⎜3/2 + x + ─────⎟
âŽ� 10 ⎠âŽ� 2 ⎠âŽ� 10 ⎠âŽ� 2 âŽ
Multiplicative combinations of polynomials and the functions exp, cos and sin can be integrated by hand using repeated integration by parts, which is an extremely tedious process. Happily, SymPy will deal with these integrals.
<math>\int x^2 e^x \cos x \, dx = e^x \left( \, \frac{x^2}{2} \left(\cos x + \sin x\right) + \frac{\sin x - \cos x}{2} - x \sin x \right)</math>
>>> integrate(x**2 * exp(x) * cos(x), x)
x x 2 x 2 x
e *sin(x) cos(x)*e x *cos(x)*e x *e *sin(x) x
- --------- + ------------ + ------------ - x*e *sin(x)
2 2 2 2
A few nonelementary integrals (in particular, some integrals involving the error function) can be evaluated.
>>> integrate(exp(-x**2)*erf(x), x)
____ 2
\/ pi *erf (x)
4
<math>\int \sin(2\sqrt{x}) dx</math>
>>> integrate(sin(2*sqrt(x)), x)
⎛ ⎽⎽⎽⎞
sin�2*╲╱ x ⎠⎽⎽⎽ ⎛ ⎽⎽⎽⎞
──────────── - ╲╱ x *cosâŽ�2*╲╱ x âŽ
2