|
from sympy.functions import SingularityFunction, DiracDelta |
|
from sympy.integrals import integrate |
|
|
|
|
|
def singularityintegrate(f, x): |
|
""" |
|
This function handles the indefinite integrations of Singularity functions. |
|
The ``integrate`` function calls this function internally whenever an |
|
instance of SingularityFunction is passed as argument. |
|
|
|
Explanation |
|
=========== |
|
|
|
The idea for integration is the following: |
|
|
|
- If we are dealing with a SingularityFunction expression, |
|
i.e. ``SingularityFunction(x, a, n)``, we just return |
|
``SingularityFunction(x, a, n + 1)/(n + 1)`` if ``n >= 0`` and |
|
``SingularityFunction(x, a, n + 1)`` if ``n < 0``. |
|
|
|
- If the node is a multiplication or power node having a |
|
SingularityFunction term we rewrite the whole expression in terms of |
|
Heaviside and DiracDelta and then integrate the output. Lastly, we |
|
rewrite the output of integration back in terms of SingularityFunction. |
|
|
|
- If none of the above case arises, we return None. |
|
|
|
Examples |
|
======== |
|
|
|
>>> from sympy.integrals.singularityfunctions import singularityintegrate |
|
>>> from sympy import SingularityFunction, symbols, Function |
|
>>> x, a, n, y = symbols('x a n y') |
|
>>> f = Function('f') |
|
>>> singularityintegrate(SingularityFunction(x, a, 3), x) |
|
SingularityFunction(x, a, 4)/4 |
|
>>> singularityintegrate(5*SingularityFunction(x, 5, -2), x) |
|
5*SingularityFunction(x, 5, -1) |
|
>>> singularityintegrate(6*SingularityFunction(x, 5, -1), x) |
|
6*SingularityFunction(x, 5, 0) |
|
>>> singularityintegrate(x*SingularityFunction(x, 0, -1), x) |
|
0 |
|
>>> singularityintegrate(SingularityFunction(x, 1, -1) * f(x), x) |
|
f(1)*SingularityFunction(x, 1, 0) |
|
|
|
""" |
|
|
|
if not f.has(SingularityFunction): |
|
return None |
|
|
|
if isinstance(f, SingularityFunction): |
|
x, a, n = f.args |
|
if n.is_positive or n.is_zero: |
|
return SingularityFunction(x, a, n + 1)/(n + 1) |
|
elif n in (-1, -2, -3, -4): |
|
return SingularityFunction(x, a, n + 1) |
|
|
|
if f.is_Mul or f.is_Pow: |
|
|
|
expr = f.rewrite(DiracDelta) |
|
expr = integrate(expr, x) |
|
return expr.rewrite(SingularityFunction) |
|
return None |
|
|