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
|
nonzeroandfreeof(xargumentx, eargumente)
:= is(eargumente # 0 and freeof(xargumentx, eargumente))$
matchdeclare(aargumenta, nonzeroandfreeof(xargumentx), bargumentb,
freeof(xargumentx))$
defmatch(linear, aargumenta*xargumentx+bargumentb, xargumentx)$
antid(fn, var, unk) := block(
[lclvariablelcl, dvariabled, aargumenta, bargumentb, tvariablet,
uvariableu, killer, lisarith:true],
dvariabled : derivdegree(fn, unk, var),
if dvariabled = 0 then (
tvariablet : integrate(fn, var),
if
not freeof(nounify(integrate), tvariablet)
then return([0, fn]) else
return([tvariablet, 0]) ),
uvariableu : diff(unk, var, dvariabled),
killer(eargumente) := if
hipow(eargumente, uvariableu) <= 1
then eargumente else 0,
if
linear(fn, uvariableu) = false
then (
tvariablet : expand(fn),
if
part(tvariablet, 0) # "+"
then
return([0, tvariablet]),
aargumenta : map(killer, tvariablet),
return(antid(aargumenta, var, unk)+[0, ratsimp(fn-aargumenta)])
),
tvariablet : subst(diff(unk, var, dvariabled-1), lclvariablelcl,
integrate(subst(lclvariablelcl, diff(unk, var, dvariabled-1),
expand(aargumenta)), lclvariablelcl)),
if
not freeof(nounify(integrate), tvariablet)
then
return([0, aargumenta*uvariableu]+antid(bargumentb, var, unk)),
return([tvariablet, 0]+antid(ratsimp(fn-diff(tvariablet, var)),
var, unk)) )$
antidiff(fn, var, unk) := block(
[tvariablet],
tvariablet : antid(fn, var, unk),
return(part(tvariablet, 1)+'integrate(part(tvariablet, 2), var)) )$
|