The patch is as following or see the attachment.
This code only solves the case like
%iint(x,c1*%iint(c2*%iint(c3*%iint(...)/f3(x))/f2(x))/f1(x))
Which is the case we encountered.
I'm not aware about other integrals it can't handle, yet.
- Qian
diff --git a/src/algebra/integrat.spad b/src/algebra/integrat.spad
index bfcc8e0a..7d5e68d8 100644
--- a/src/algebra/integrat.spad
+++ b/src/algebra/integrat.spad
@@ -245,6 +245,33 @@
not(member?(k, (tf := tower f))) then
k := find_int(k, tf)
f := eval(f, [k], [v])
+ -- liint is a list of untranslated '%iint kernels. If they are
+ -- parts of ekers, then we may solve them by recursion.
+ liint : List K := [k for k in otf | is?(operator k, '%iint) and
not member?(k, ekers)]
+ for k in reverse liint repeat
+ pos := position(ek +-> member?(k, tower(ek::F)), ekers)
+ if zero? pos then
+ error "integrate: untranslated %iint kernels"
+ ek := ekers.pos
+ ev := evals.pos
+ repeat
+ dek := D(ek::F, x)
+ -- assert the numerator of dek is a single kernel of '%iint
+ numKers := kernels numerator dek
+ if # numKers = 1 and is?(operator first numKers, '%iint) then
+ dev := D(ev, x)
+ coeff := 1/(first coefficients numer dek)::F
+ v := coeff * dev * denominator dek
+ if k::F = coeff * numerator dek then
+ f := eval(f, [k], [v])
+ break
+ else
+ ek := first numKers
+ ev := v
+ if not member?(k, tower(ek::F)) then break
+ else
+ -- print("currently can't handle this '%iint
kernel"::OutputForm)
+ break
if not(empty? ltan) then
ltemp := [tan2temp k for k in ltan]
f := eval(f, ltan, [k::F for k in ltemp])
--
You received this message because you are subscribed to the Google Groups
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/fricas-devel/0700bb7c-d403-6cc5-5f55-cfb692a61835%40gmail.com.
diff --git a/src/algebra/integrat.spad b/src/algebra/integrat.spad
index bfcc8e0a..7d5e68d8 100644
--- a/src/algebra/integrat.spad
+++ b/src/algebra/integrat.spad
@@ -245,6 +245,33 @@ FunctionSpaceIntegration(R, F) : Exports == Implementation where
not(member?(k, (tf := tower f))) then
k := find_int(k, tf)
f := eval(f, [k], [v])
+ -- liint is a list of untranslated '%iint kernels. If they are
+ -- parts of ekers, then we may solve them by recursion.
+ liint : List K := [k for k in otf | is?(operator k, '%iint) and not member?(k, ekers)]
+ for k in reverse liint repeat
+ pos := position(ek +-> member?(k, tower(ek::F)), ekers)
+ if zero? pos then
+ error "integrate: untranslated %iint kernels"
+ ek := ekers.pos
+ ev := evals.pos
+ repeat
+ dek := D(ek::F, x)
+ -- assert the numerator of dek is a single kernel of '%iint
+ numKers := kernels numerator dek
+ if # numKers = 1 and is?(operator first numKers, '%iint) then
+ dev := D(ev, x)
+ coeff := 1/(first coefficients numer dek)::F
+ v := coeff * dev * denominator dek
+ if k::F = coeff * numerator dek then
+ f := eval(f, [k], [v])
+ break
+ else
+ ek := first numKers
+ ev := v
+ if not member?(k, tower(ek::F)) then break
+ else
+ -- print("currently can't handle this '%iint kernel"::OutputForm)
+ break
if not(empty? ltan) then
ltemp := [tan2temp k for k in ltan]
f := eval(f, ltan, [k::F for k in ltemp])