/usr/share/axiom-20170501/src/algebra/ODECONST.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 | )abbrev package ODECONST ConstantLODE
++ Author: Manuel Bronstein
++ Date Created: 18 March 1991
++ Date Last Updated: 3 February 1994
++ References:
++ Bron92 Linear Ordinary Differential Equations: Breaking Through the
++ Order 2 Barrier
++ Description:
++ Solution of linear ordinary differential equations,
++ constant coefficient case.
ConstantLODE(R, F, L) : SIG == CODE where
R : Join(OrderedSet, EuclideanDomain, RetractableTo Integer,
LinearlyExplicitRingOver Integer, CharacteristicZero)
F : Join(AlgebraicallyClosedFunctionSpace R,
TranscendentalFunctionCategory, PrimitiveFunctionCategory)
L : LinearOrdinaryDifferentialOperatorCategory F
Z ==> Integer
SY ==> Symbol
K ==> Kernel F
V ==> Vector F
M ==> Matrix F
SUP ==> SparseUnivariatePolynomial F
SIG ==> with
constDsolve : (L, F, SY) -> Record(particular:F, basis:List F)
++ constDsolve(op, g, x) returns \spad{[f, [y1,...,ym]]}
++ where f is a particular solution of the equation \spad{op y = g},
++ and the \spad{yi}'s form a basis for the solutions of \spad{op y = 0}.
CODE ==> add
import ODETools(F, L)
import ODEIntegration(R, F)
import ElementaryFunctionSign(R, F)
import AlgebraicManipulations(R, F)
import FunctionSpaceIntegration(R, F)
import FunctionSpaceUnivariatePolynomialFactor(R, F, SUP)
homoBasis: (L, F) -> List F
quadSol : (SUP, F) -> List F
basisSqfr: (SUP, F) -> List F
basisSol : (SUP, Z, F) -> List F
constDsolve(op, g, x) ==
b := homoBasis(op, x::F)
[particularSolution(op, g, b, (f1:F):F +-> int(f1, x))::F, b]
homoBasis(op, x) ==
p:SUP := 0
while op ^= 0 repeat
p := p + monomial(leadingCoefficient op, degree op)
op := reductum op
b:List(F) := empty()
for ff in factors ffactor p repeat
b := concat_!(b, basisSol(ff.factor, dec(ff.exponent), x))
b
basisSol(p, n, x) ==
l := basisSqfr(p, x)
zero? n => l
ll := copy l
xn := x::F
for i in 1..n repeat
l := concat_!(l, [xn * f for f in ll])
xn := x * xn
l
basisSqfr(p, x) ==
((d := degree p) = 1) =>
[exp(- coefficient(p, 0) * x / leadingCoefficient p)]
d = 2 => quadSol(p, x)
[exp(a * x) for a in rootsOf p]
quadSol(p, x) ==
(u := sign(delta := (b := coefficient(p, 1))**2 - 4 *
(a := leadingCoefficient p) * (c := coefficient(p, 0))))
case Z and negative?(u::Z) =>
y := x / (2 * a)
r := - b * y
i := rootSimp(sqrt(-delta)) * y
[exp(r) * cos(i), exp(r) * sin(i)]
[exp(a * x) for a in zerosOf p]
|