Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/symbolic/integration/external.py
4069 views
1
from sage.symbolic.expression import Expression
2
from sage.symbolic.ring import SR
3
4
def maxima_integrator(expression, v, a=None, b=None):
5
"""
6
sage: from sage.symbolic.integration.external import maxima_integrator
7
sage: maxima_integrator(sin(x), x)
8
-cos(x)
9
sage: maxima_integrator(cos(x), x)
10
sin(x)
11
sage: f(x) = function('f', x)
12
sage: maxima_integrator(f(x), x)
13
integrate(f(x), x)
14
"""
15
from sage.calculus.calculus import maxima
16
if not isinstance(expression, Expression):
17
expression = SR(expression)
18
if a is None:
19
result = maxima.sr_integral(expression,v)
20
else:
21
result = maxima.sr_integral(expression, v, a, b)
22
return result._sage_()
23
24
def sympy_integrator(expression, v, a=None, b=None):
25
"""
26
sage: from sage.symbolic.integration.external import sympy_integrator
27
sage: sympy_integrator(sin(x), x)
28
-cos(x)
29
sage: sympy_integrator(cos(x), x)
30
sin(x)
31
"""
32
import sympy
33
ex = expression._sympy_()
34
v = v._sympy_()
35
if a is None:
36
result = sympy.integrate(ex, v)
37
else:
38
result = sympy.integrate(ex, (v, a._sympy_(), b._sympy_()))
39
return result._sage_()
40
41
def mma_free_integrator(expression, v, a=None, b=None):
42
"""
43
sage: from sage.symbolic.integration.external import mma_free_integrator
44
sage: mma_free_integrator(sin(x), x) # optional - requires internet
45
-cos(x)
46
"""
47
import urllib, re
48
# We need to integrate against x
49
vars = [str(x) for x in expression.variables()]
50
if any(len(x)>1 for x in vars):
51
raise NotImplementedError, "Mathematica online integrator can only handle single letter variables."
52
x = SR.var('x')
53
if repr(v) != 'x':
54
for i in range(ord('a'), ord('z')+1):
55
if chr(i) not in vars:
56
shadow_x = SR.var(chr(i))
57
break
58
expression = expression.subs({x:shadow_x}).subs({dvar: x})
59
params = urllib.urlencode({'expr': expression._mathematica_init_(), 'random': 'false'})
60
page = urllib.urlopen("http://integrals.wolfram.com/index.jsp", params).read()
61
page = page[page.index('"inputForm"'):page.index('"outputForm"')]
62
page = re.sub("\s", "", page)
63
mexpr = re.match(r".*Integrate.*==</em><br/>(.*)</p>", page).groups()[0]
64
try:
65
ans = SR(mexpr.lower().replace('[', '(').replace(']', ')'))
66
if repr(v) != 'x':
67
ans = ans.subs({x:v}).subs({shadow_x:x})
68
return ans
69
except TypeError:
70
raise ValueError, "Unable to parse: %s" % mexpr
71
72