Thanks for your answers. I was thinking of making a custom class, but wanted to be sure I wasn't reinventing the wheel.
I made a first attempt to define a custom class, but I stumbled upon an issue with eval and simplify. If the integrand is 0 the whole integral can be set to 0.
So I tried the followiung code without success:
import sympy as sp
class LebesgueIntegral(sp.Expr):
def _latex(self, printer, exp=1):
m, n, l = self.args
_m, _n, _l = printer._print(m), printer._print(n), printer._print(l)
return r'\int_{%s} %s \,d%s' % (_m, _n, _l)
@classmethod
def eval(cls, m, n, l):
if n == 0:
return 0
def _eval_simplify(self, **kwargs):
if self.args[1] == 0:
return 0
return self
u = LebesgueIntegral(sp.Symbol('\Omega'), sp.sympify(0),sp.Symbol('x'))
print(sp.latex(u))
print(sp.simplify(u))
print(sp.simplify(2*u))
The above code gives me the output:
\int_{\Omega} 0 \,dx
0
2*LebesgueIntegral(\Omega, 0, x)
Why is the method eval not called in the first print statement?
I had a look at the simplify module but it is very hard for me to understand. Is it intended that the simplify method of the class is not called in the third print statement?
Michael Gfrerer