]> www.ginac.de Git - ginac.git/commitdiff
Synced to 1.1
authorJens Vollinga <vollinga@thep.physik.uni-mainz.de>
Sat, 27 Mar 2004 14:31:36 +0000 (14:31 +0000)
committerJens Vollinga <vollinga@thep.physik.uni-mainz.de>
Sat, 27 Mar 2004 14:31:36 +0000 (14:31 +0000)
check/exam_pseries.cpp
ginac/pseries.cpp

index a132ea8b82650f567a395fcdbd452bd10ebbf6fb..7ec803f88aa97fcd4d3dfa9c26660507bb475b9b 100644 (file)
@@ -108,13 +108,17 @@ static unsigned exam_series1()
        e = pow(x, 8) * pow(pow(x,3)+ pow(x + pow(x,3), 2), -2);
        d = pow(x, 4) - 2*pow(x, 5) + Order(pow(x, 6));
        result += check_series(e, 0, d, 6);
-
+       
        e = cos(x) * pow(sin(x)*(pow(x, 5) + 4 * pow(x, 2)), -3);
        d = pow(x, -9) / 64 - 3 * pow(x, -6) / 256 - pow(x, -5) / 960 + 535 * pow(x, -3) / 96768
            + pow(x, -2) / 1280 - pow(x, -1) / 14400 - numeric(283, 129024) - 2143 * x / 5322240
            + Order(pow(x, 2));
        result += check_series(e, 0, d, 2);
        
+       e = sqrt(1+x*x) * sqrt(1+2*x*x);
+       d = 1 + Order(pow(x, 2));
+       result += check_series(e, 0, d, 2);
+
        symbol a("a");
        e = pow(x, 4) * sin(a) + pow(x, 2);
        d = pow(x, 2) + Order(pow(x, 3));
index 692bb6f03d105140330a30973efbb74490681ec1..9f6643ed1d7af1d750e78447ecaf987328c5a68c 100644 (file)
@@ -767,10 +767,15 @@ ex mul::series(const relational & r, int order, unsigned options) const
        const epvector::const_iterator itbeg = seq.begin();
        const epvector::const_iterator itend = seq.end();
        for (epvector::const_iterator it=itbeg; it!=itend; ++it) {
-               
+
                ex buf = recombine_pair_to_ex(*it);
-               
-               int real_ldegree = buf.expand().ldegree(sym-r.rhs());
+
+               int real_ldegree = 0;
+               try {
+                       real_ldegree = buf.expand().ldegree(sym-r.rhs());
+               }
+               catch (std::runtime_error) {}
+
                if (real_ldegree == 0) {
                        int orderloop = 0;
                        do {
@@ -783,7 +788,13 @@ ex mul::series(const relational & r, int order, unsigned options) const
        }
 
        int degsum = std::accumulate(ldegrees.begin(), ldegrees.end(), 0);
-               
+
+       if (degsum>order) {
+               epvector epv;
+               epv.push_back(expair(Order(_ex1), order));
+               return (new pseries(r, epv))->setflag(status_flags::dynallocated);
+       }
+
        // Multiply with remaining terms
        std::vector<int>::const_iterator itd = ldegrees.begin();
        for (epvector::const_iterator it=itbeg; it!=itend; ++it, ++itd) {