Spaces:
Sleeping
Sleeping
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 | |