Rename *ll* and *ul* to ll and ul in in-interval
[maxima.git] / share / integration / antid.mac
blobedb7250b720b74f4e06e496f3a721013529e6f64
1 /*******************************************************************************
2  * File    : antid.mac
3  * License : GNU General Public License (GPL)
4  * 
5  * Implementation of the Maxima user functions:
6  *
7  *   antid (fn, var,unk)
8  *   antidiff (fn, var, unk)
9  *
10  * See the Maxima reference manual for a documentation.
11  *
12  * This file is part of Maxima -- GPL CAS based on DOE-MACSYMA
13  ******************************************************************************/
15 nonzeroandfreeof(xargumentx, eargumente) :=
16   is(eargumente # 0 and freeof(xargumentx, eargumente))$
18 matchdeclare(aargumenta,
19              nonzeroandfreeof(xargumentx),
20              bargumentb,
21              freeof(xargumentx))$
23 defmatch(linear, aargumenta*xargumentx+bargumentb, xargumentx)$
25 antid(fn, var, unk) :=
26   block( [lclvariablelcl,
27           dvariabled,
28           aargumenta,
29           bargumentb,
30           tvariablet,
31           uvariableu,
32           killer,
33           listarith:true],
34     local(killer),          
35     dvariabled : derivdegree(fn, unk, var),
36     if dvariabled = 0 then
37     (
38       tvariablet : integrate(fn, var),
39       if not freeof(nounify(integrate), tvariablet) then 
40         return([0, fn]) 
41       else
42         return([tvariablet, 0])
43     ),
44     uvariableu : diff(unk, var, dvariabled),
45     killer(eargumente) := if hipow(eargumente, uvariableu) <= 1 then
46                             eargumente else 0,
47     if linear(fn, uvariableu) = false then
48     (
49       tvariablet : expand(fn),
50       if part(tvariablet, 0) # "+" then
51         return([0, tvariablet]),
52       aargumenta : map(killer, tvariablet),
53       return (antid(aargumenta, var, unk)+[0, ratsimp(fn-aargumenta)])
54     ),
55     tvariablet : subst(diff(unk, var, dvariabled-1), lclvariablelcl,
56                    integrate(subst(lclvariablelcl, diff(unk, var, dvariabled-1),
57                              expand(aargumenta)), lclvariablelcl)),
58     if not freeof(nounify(integrate), tvariablet) or
59        is(equal(fn,ratsimp(fn-diff(tvariablet,var)))) then
60       return([0, aargumenta*uvariableu]+antid(bargumentb, var, unk)),
61     return([tvariablet, 0]+antid(ratsimp(fn-diff(tvariablet, var)),var,unk))
62   )$
63    
64 antidiff(fn, var, unk) := 
65   block( [tvariablet],
66     tvariablet : antid(fn, var, unk),
67     return(part(tvariablet, 1)+'integrate(part(tvariablet, 2), var))
68   )$