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])