Path: blob/master/sage/symbolic/integration/external.py
4069 views
from sage.symbolic.expression import Expression1from sage.symbolic.ring import SR23def maxima_integrator(expression, v, a=None, b=None):4"""5sage: from sage.symbolic.integration.external import maxima_integrator6sage: maxima_integrator(sin(x), x)7-cos(x)8sage: maxima_integrator(cos(x), x)9sin(x)10sage: f(x) = function('f', x)11sage: maxima_integrator(f(x), x)12integrate(f(x), x)13"""14from sage.calculus.calculus import maxima15if not isinstance(expression, Expression):16expression = SR(expression)17if a is None:18result = maxima.sr_integral(expression,v)19else:20result = maxima.sr_integral(expression, v, a, b)21return result._sage_()2223def sympy_integrator(expression, v, a=None, b=None):24"""25sage: from sage.symbolic.integration.external import sympy_integrator26sage: sympy_integrator(sin(x), x)27-cos(x)28sage: sympy_integrator(cos(x), x)29sin(x)30"""31import sympy32ex = expression._sympy_()33v = v._sympy_()34if a is None:35result = sympy.integrate(ex, v)36else:37result = sympy.integrate(ex, (v, a._sympy_(), b._sympy_()))38return result._sage_()3940def mma_free_integrator(expression, v, a=None, b=None):41"""42sage: from sage.symbolic.integration.external import mma_free_integrator43sage: mma_free_integrator(sin(x), x) # optional - requires internet44-cos(x)45"""46import urllib, re47# We need to integrate against x48vars = [str(x) for x in expression.variables()]49if any(len(x)>1 for x in vars):50raise NotImplementedError, "Mathematica online integrator can only handle single letter variables."51x = SR.var('x')52if repr(v) != 'x':53for i in range(ord('a'), ord('z')+1):54if chr(i) not in vars:55shadow_x = SR.var(chr(i))56break57expression = expression.subs({x:shadow_x}).subs({dvar: x})58params = urllib.urlencode({'expr': expression._mathematica_init_(), 'random': 'false'})59page = urllib.urlopen("http://integrals.wolfram.com/index.jsp", params).read()60page = page[page.index('"inputForm"'):page.index('"outputForm"')]61page = re.sub("\s", "", page)62mexpr = re.match(r".*Integrate.*==</em><br/>(.*)</p>", page).groups()[0]63try:64ans = SR(mexpr.lower().replace('[', '(').replace(']', ')'))65if repr(v) != 'x':66ans = ans.subs({x:v}).subs({shadow_x:x})67return ans68except TypeError:69raise ValueError, "Unable to parse: %s" % mexpr707172