64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
|
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):
|
||
|
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
|