/usr/share/axiom-20170501/src/algebra/DEFINTRF.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | )abbrev package DEFINTRF RationalFunctionDefiniteIntegration
++ Author: Manuel Bronstein
++ Date Created: 2 October 1989
++ Date Last Updated: 2 February 1993
++ Description:
++ Definite integration of rational functions.
++ \spadtype{RationalFunctionDefiniteIntegration} provides functions to
++ compute definite integrals of rational functions.
RationalFunctionDefiniteIntegration(R) : SIG == CODE where
R : Join(EuclideanDomain, OrderedSet, CharacteristicZero,
RetractableTo Integer, LinearlyExplicitRingOver Integer)
SE ==> Symbol
RF ==> Fraction Polynomial R
FE ==> Expression R
ORF ==> OrderedCompletion RF
OFE ==> OrderedCompletion FE
U ==> Union(f1:OFE, f2:List OFE, fail:"failed", pole:"potentialPole")
SIG ==> with
integrate : (RF, SegmentBinding OFE) -> U
++ integrate(f, x = a..b) returns the integral of
++ \spad{f(x)dx} from a to b.
++ Error: if f has a pole for x between a and b.
integrate : (RF, SegmentBinding OFE, String) -> U
++ integrate(f, x = a..b, "noPole") returns the
++ integral of \spad{f(x)dx} from a to b.
++ If it is not possible to check whether f has a pole for x
++ between a and b (because of parameters), then this function
++ will assume that f has no such pole.
++ Error: if f has a pole for x between a and b or
++ if the last argument is not "noPole".
-- the following two are contained in the above, but they are for the
-- interpreter... DO NOT COMMENT OUT UNTIL THE INTERPRETER IS BETTER!
integrate : (RF, SegmentBinding ORF) -> U
++ integrate(f, x = a..b) returns the integral of
++ \spad{f(x)dx} from a to b.
++ Error: if f has a pole for x between a and b.
integrate : (RF, SegmentBinding ORF, String) -> U
++ integrate(f, x = a..b, "noPole") returns the
++ integral of \spad{f(x)dx} from a to b.
++ If it is not possible to check whether f has a pole for x
++ between a and b (because of parameters), then this function
++ will assume that f has no such pole.
++ Error: if f has a pole for x between a and b or
++ if the last argument is not "noPole".
CODE ==> add
import DefiniteIntegrationTools(R, FE)
import IntegrationResultRFToFunction(R)
import OrderedCompletionFunctions2(RF, FE)
int : (RF, SE, OFE, OFE, Boolean) -> U
nopole: (RF, SE, OFE, OFE) -> U
integrate(f:RF, s:SegmentBinding OFE) ==
int(f, variable s, lo segment s, hi segment s, false)
nopole(f, x, a, b) ==
k := kernel(x)@Kernel(FE)
(u := integrate(f, x)) case FE =>
(v := computeInt(k, u::FE, a, b, true)) case "failed" => ["failed"]
[v::OFE]
ans := empty()$List(OFE)
for g in u::List(FE) repeat
(v := computeInt(k, g, a, b, true)) case "failed" => return ["failed"]
ans := concat_!(ans, [v::OFE])
[ans]
integrate(f:RF, s:SegmentBinding ORF) ==
int(f, variable s, map(x +-> x::FE, lo segment s),
map(x +-> x::FE, hi segment s), false)
integrate(f:RF, s:SegmentBinding ORF, str:String) ==
int(f, variable s, map(x +-> x::FE, lo segment s),
map(x +-> x::FE, hi segment s), ignore? str)
integrate(f:RF, s:SegmentBinding OFE, str:String) ==
int(f, variable s, lo segment s, hi segment s, ignore? str)
int(f, x, a, b, ignor?) ==
a = b => [0::OFE]
(z := checkForZero(denom f, x, a, b, true)) case "failed" =>
ignor? => nopole(f, x, a, b)
["potentialPole"]
z::Boolean => error "integrate: pole in path of integration"
nopole(f, x, a, b)
|