def fricas_integrator(expression, v, a=None, b=None, noPole=True): """ Integration using FriCAS EXAMPLES:: sage: from sage.symbolic.integration.external import fricas_integrator # optional - fricas sage: fricas_integrator(sin(x), x) # optional - fricas -cos(x) sage: fricas_integrator(cos(x), x) # optional - fricas sin(x) sage: fricas_integrator(1/(x^2-2), x, 0, 1) # optional - fricas 1/4*sqrt(2)*(log(3*sqrt(2) - 4) - log(sqrt(2))) sage: fricas_integrator(1/(x^2+6), x, -oo, oo) # optional - fricas 1/6*sqrt(6)*pi TESTS: Check that :trac:`25220` is fixed:: sage: integral(sqrt(1-cos(x)), x, 0, 2*pi, algorithm="fricas") # optional - fricas 4*sqrt(2) Check that in case of failure one gets unevaluated integral:: sage: integral(cos(ln(cos(x))), x, 0, pi/8, algorithm='fricas') # optional - fricas integrate(cos(log(cos(x))), x, 0, 1/8*pi) sage: integral(cos(ln(cos(x))), x, algorithm='fricas') # optional - fricas integral(cos(log(cos(x))), x) """ if not isinstance(expression, Expression): expression = SR(expression) from sage.interfaces.fricas import fricas ex = fricas(expression) if a is None: result = ex.integrate(v) else: seg = fricas.equation(v, fricas.segment(a, b)) if noPole: result = ex.integrate(seg, '"noPole"') else: result = ex.integrate(seg) result = result.sage() if result == "failed": return expression.integrate(v, a, b, hold=True) if result == "potentialPole": raise ValueError("The integrand has a potential pole" " in the integration interval") return result
def fricas_integrator(expression, v, a=None, b=None, noPole=True): """ Integration using FriCAS EXAMPLES:: sage: from sage.symbolic.integration.external import fricas_integrator # optional - fricas sage: fricas_integrator(sin(x), x) # optional - fricas -cos(x) sage: fricas_integrator(cos(x), x) # optional - fricas sin(x) sage: fricas_integrator(1/(x^2-2), x, 0, 1) # optional - fricas -1/8*sqrt(2)*(log(2) - log(-24*sqrt(2) + 34)) sage: fricas_integrator(1/(x^2+6), x, -oo, oo) # optional - fricas 1/6*sqrt(6)*pi TESTS: Check that :trac:`25220` is fixed:: sage: integral(sqrt(1-cos(x)), x, 0, 2*pi, algorithm="fricas") # optional - fricas 4*sqrt(2) Check that in case of failure one gets unevaluated integral:: sage: integral(cos(ln(cos(x))), x, 0, pi/8, algorithm='fricas') # optional - fricas integrate(cos(log(cos(x))), x, 0, 1/8*pi) sage: integral(cos(ln(cos(x))), x, algorithm='fricas') # optional - fricas integral(cos(log(cos(x))), x) Check that :trac:`28641` is fixed:: sage: integrate(sqrt(2)*x^2 + 2*x, x, algorithm="fricas") # optional - fricas 1/3*sqrt(2)*x^3 + x^2 sage: integrate(sqrt(2), x, algorithm="fricas") # optional - fricas sqrt(2)*x sage: integrate(1, x, algorithm="fricas") # optional - fricas x Check that :trac:`28630` is fixed:: sage: f = polylog(3, x) sage: f.integral(x, algorithm='fricas') # optional - fricas -x*dilog(x) - (x - 1)*log(-x + 1) + x*polylog(3, x) + x Check that :trac:`29043` is fixed:: sage: var("a c d"); f = (I*a*tan(d*x + c) + a)*sec(d*x + c)^10 (a, c, d) sage: ii = integrate(f, x, algorithm="fricas") # optional - fricas sage: 1/315*(64512*I*a*e^(10*I*d*x + 10*I*c) + 53760*I*a*e^(8*I*d*x + 8*I*c) + 30720*I*a*e^(6*I*d*x + 6*I*c) + 11520*I*a*e^(4*I*d*x + 4*I*c) + 2560*I*a*e^(2*I*d*x + 2*I*c) + 256*I*a)/(d*e^(20*I*d*x + 20*I*c) + 10*d*e^(18*I*d*x + 18*I*c) + 45*d*e^(16*I*d*x + 16*I*c) + 120*d*e^(14*I*d*x + 14*I*c) + 210*d*e^(12*I*d*x + 12*I*c) + 252*d*e^(10*I*d*x + 10*I*c) + 210*d*e^(8*I*d*x + 8*I*c) + 120*d*e^(6*I*d*x + 6*I*c) + 45*d*e^(4*I*d*x + 4*I*c) + 10*d*e^(2*I*d*x + 2*I*c) + d) - ii # optional - fricas 0 """ if not isinstance(expression, Expression): expression = SR(expression) from sage.interfaces.fricas import fricas e_fricas = fricas(expression) v_fricas = fricas(v) if a is None: result = e_fricas.integrate(v_fricas) else: seg = fricas.equation(v_fricas, fricas.segment(a, b)) if noPole: result = e_fricas.integrate(seg, '"noPole"') else: result = e_fricas.integrate(seg) result = result.sage() if result == "failed": result = expression.integrate(v, a, b, hold=True) elif result == "potentialPole": raise ValueError("The integrand has a potential pole" " in the integration interval") return result