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 fricas-devel+unsubscr...@googlegroups.com.
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])

Reply via email to