/usr/share/axiom-20170501/src/algebra/D01TRNS.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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | )abbrev domain D01TRNS d01TransformFunctionType
++ Author: Brian Dupee
++ Date Created: April 1994
++ Date Last Updated: December 1997
++ References:
++ Dupe95 Using Computer Algebra to Choose and Apply Numerical Routines
++ Dewa92 Using Computer Algebra to Select Numerical Algorithms
++ Description:
++ Since an infinite integral cannot be evaluated numerically
++ it is necessary to transform the integral onto finite ranges.
++ \axiomType{d01TransformFunctionType} uses the mapping \spad{x -> 1/x}
++ and contains the functions \axiomFun{measure} and
++ \axiomFun{numericalIntegration}.
d01TransformFunctionType() : SIG == CODE where
EDF ==> Expression DoubleFloat
EEDF ==> Equation Expression DoubleFloat
FI ==> Fraction Integer
EFI ==> Expression Fraction Integer
EEFI ==> Equation Expression Fraction Integer
EF2 ==> ExpressionFunctions2
DF ==> DoubleFloat
F ==> Float
SOCDF ==> Segment OrderedCompletion DoubleFloat
OCDF ==> OrderedCompletion DoubleFloat
NIA ==> Record(var:Symbol,fn:EDF,range:SOCDF,abserr:DF,relerr:DF)
INT ==> Integer
PI ==> PositiveInteger
HINT ==> Record(str:String,fn:EDF,range:SOCDF,ext:Result)
S ==> Symbol
ST ==> String
LST ==> List String
Measure ==> Record(measure:F,explanations:ST,extra:Result)
MS ==> Record(measure:F,name:ST,explanations:LST,extra:Result)
SIG ==> NumericalIntegrationCategory
CODE ==> Result add
Rep:=Result
import d01AgentsPackage,Rep
rec2any(re:Record(str:ST,fn:EDF,range:SOCDF)):Any ==
coerce(re)$AnyFunctions1(Record(str:ST,fn:EDF,range:SOCDF))
changeName(ans:Result,name:ST):Result ==
sy:S := coerce(name "Answer")$S
anyAns:Any := coerce(ans)$AnyFunctions1(Result)
construct([[sy,anyAns]])$Result
getIntegral(args:NIA,hint:HINT) : Result ==
Args := copy args
Args.fn := hint.fn
Args.range := hint.range
integrate(Args::NumericalIntegrationProblem)_
$AnnaNumericalIntegrationPackage
transformFunction(args:NIA) : NIA ==
Args := copy args
Var := Args.var :: EFI -- coerce Symbol to EFI
NewVar:EFI := inv(Var)$EFI -- invert it
VarEqn:EEFI:=equation(Var,NewVar)$EEFI -- turn it into an equation
Afn:EFI := edf2efi(Args.fn)$ExpertSystemToolsPackage
Afn := subst(Afn,VarEqn)$EFI -- substitute into function
Var2:EFI := Var**2
Afn:= simplify(Afn/Var2)$TranscendentalManipulations(FI,EFI)
Args.fn:= map(x+->convert(x)$FI,Afn)$EF2(FI,DF)
Args
doit(seg:SOCDF,args:NIA):MS ==
Args := copy args
Args.range := seg
measure(Args::NumericalIntegrationProblem)_
$AnnaNumericalIntegrationPackage
transform(c:Boolean,args:NIA):Measure ==
if c then
l := coerce(recip(lo(args.range)))@OCDF
Seg:SOCDF := segment(0$OCDF,l)
else
h := coerce(recip(hi(args.range)))@OCDF
Seg:SOCDF := segment(h,0$OCDF)
Args := transformFunction(args)
m:MS := doit(Seg,Args)
out1:ST :=
"The recommendation is to transform the function and use " m.name
out2:List(HINT) := [[m.name,Args.fn,Seg,m.extra]]
out2Any:Any := coerce(out2)$AnyFunctions1(List(HINT))
ex:Record(key:S,entry:Any) := [d01transformextra@S,out2Any]
extr:Result := construct([ex])$Result
[m.measure,out1,extr]
split(c:PI,args:NIA):Measure ==
Args := copy args
Args.relerr := Args.relerr/2
Args.abserr := Args.abserr/2
if (c = 1)@Boolean then
seg1:SOCDF := segment(-1$OCDF,1$OCDF)
else if (c = 2)@Boolean then
seg1 := segment(lo(Args.range),1$OCDF)
else
seg1 := segment(-1$OCDF,hi(Args.range))
m1:MS := doit(seg1,Args)
Args := transformFunction Args
if (c = 2)@Boolean then
seg2:SOCDF := segment(0$OCDF,1$OCDF)
else if (c = 3)@Boolean then
seg2 := segment(-1$OCDF,0$OCDF)
else seg2 := seg1
m2:MS := doit(seg2,Args)
m1m:F := m1.measure
m2m:F := m2.measure
m:F := m1m*m2m/((m1m*m2m)+(1.0-m1m)*(1.0-m2m))
out1:ST := "The recommendation is to transform the function and use "
m1.name " and " m2.name
out2:List(HINT) :=
[[m1.name,args.fn,seg1,m1.extra],[m2.name,Args.fn,seg2,m2.extra]]
out2Any:Any := coerce(out2)$AnyFunctions1(List(HINT))
ex:Record(key:S,entry:Any) := [d01transformextra@S,out2Any]
extr:Result := construct([ex])$Result
[m,out1,extr]
measure(R:RoutinesTable,args:NIA) ==
Range:=rangeIsFinite(args)
Range case bothInfinite => split(1,args)
Range case upperInfinite =>
positive?(lo(args.range))$OCDF =>
transform(true,args)
split(2,args)
Range case lowerInfinite =>
negative?(hi(args.range))$OCDF =>
transform(false,args)
split(3,args)
numericalIntegration(args:NIA,hints:Result) ==
mainResult:DF := mainAbserr:DF := 0$DF
ans:Result := empty()$Result
hla:Any := coerce(search((d01transformextra@S),hints)$Result)@Any
hintList := retract(hla)$AnyFunctions1(List(HINT))
methodName:ST := empty()$ST
repeat
if (empty?(hintList)$(List(HINT)))
then leave
item := first(hintList)$List(HINT)
a:Result := getIntegral(args,item)
anyRes := coerce(search((result@S),a)$Result)@Any
midResult := retract(anyRes)$AnyFunctions1(DF)
anyErr := coerce(search((abserr pretend S),a)$Result)@Any
midAbserr := retract(anyErr)$AnyFunctions1(DF)
mainResult := mainResult+midResult
mainAbserr := mainAbserr+midAbserr
if (methodName = item.str)@Boolean then
methodName := concat([item.str,"1"])$ST
else
methodName := item.str
ans := concat(ans,changeName(a,methodName))$ExpertSystemToolsPackage
hintList := rest(hintList)$(List(HINT))
anyResult := coerce(mainResult)$AnyFunctions1(DF)
anyAbserr := coerce(mainAbserr)$AnyFunctions1(DF)
recResult:Record(key:S,entry:Any):=[result@S,anyResult]
recAbserr:Record(key:S,entry:Any):=[abserr pretend S,anyAbserr]
insert!(recAbserr,insert!(recResult,ans))$Result
|