- changed function::diff() to be more tolerant by checking first if the
[ginac.git] / check / differentiation.cpp
index c6838efdb2c56d4d1d96c2fd53e554f413c2028b..0d963fed8b0f6d830a56063f71859a9a6786d561 100644 (file)
@@ -1,8 +1,27 @@
-// check/differentiation.cpp
+/** @file differentiation.cpp
+ *
+ *  Tests for symbolic differentiation, including various functions. */
 
-/* Tests for symbolic differentiation, including various functions. */
+/*
+ *  GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
 
 #include <ginac/ginac.h>
+using namespace GiNaC;
 
 static unsigned check_diff(const ex &e, const symbol &x,
                            const ex &d, unsigned nth=1)
@@ -88,7 +107,7 @@ static unsigned differentiation1(void)
     return result;
 }
 
-// Trigonometric and transcendental functions
+// Trigonometric functions
 static unsigned differentiation2(void)
 {
     unsigned result = 0;
@@ -133,8 +152,19 @@ static unsigned differentiation2(void)
     d = -2*b*pow(e2,2)*pow(x,4) + 2*b*pow(sin(e1),2)*pow(x,4)
         - 2*sin(e1)*pow(x,2) - y*e2*pow(x,4);
     result += check_diff(e, y, d, 2);
+
+       return result;
+}
     
+// exp function
+static unsigned differentiation3(void)
+{
+    unsigned result = 0;
+    symbol x("x"), y("y"), a("a"), b("b");
+    ex e1, e2, e, d;
+
     // construct expression e to be diff'ed:
+    e1 = y*pow(x, 2) + a*x + b;
     e2 = exp(e1);
     e = b*pow(e2, 2) + y*e2 + a;
     
@@ -150,8 +180,19 @@ static unsigned differentiation2(void)
     
     d = 4*b*pow(e2,2)*pow(x,4) + 2*e2*pow(x,2) + y*e2*pow(x,4);
     result += check_diff(e, y, d, 2);
+
+       return result;
+}
+
+// log functions
+static unsigned differentiation4(void)
+{
+    unsigned result = 0;
+    symbol x("x"), y("y"), a("a"), b("b");
+    ex e1, e2, e, d;
     
     // construct expression e to be diff'ed:
+    e1 = y*pow(x, 2) + a*x + b;
     e2 = log(e1);
     e = b*pow(e2, 2) + y*e2 + a;
     
@@ -169,8 +210,18 @@ static unsigned differentiation2(void)
     d = 2*b*pow(x,4)*pow(e1,-2) - 2*b*e2*pow(e1,-2)*pow(x,4)
         + 2*pow(x,2)/e1 - y*pow(x,4)*pow(e1,-2);
     result += check_diff(e, y, d, 2);
+
+       return result;
+}
+
+// Functions with two variables
+static unsigned differentiation5(void)
+{
+    unsigned result = 0;
+    symbol x("x"), y("y"), a("a"), b("b");
+    ex e1, e2, e, d;
     
-    // test for functions with two variables: atan2
+    // test atan2
     e1 = y*pow(x, 2) + a*x + b;
     e2 = x*pow(y, 2) + b*y + a;
     e = atan2(e1,e2);
@@ -183,17 +234,23 @@ static unsigned differentiation2(void)
          pow(y*b+pow(y,2)*x+a,-2)*pow(y,2))*
         pow(1+pow(a*x+b+y*pow(x,2),2)*pow(y*b+pow(y,2)*x+a,-2),-1);
     */
+    /*
     d = pow(1+pow(a*x+b+y*pow(x,2),2)*pow(y*b+pow(y,2)*x+a,-2),-1)
         *pow(y*b+pow(y,2)*x+a,-1)*(a+2*y*x)
         +pow(y,2)*(-a*x-b-y*pow(x,2))*
         pow(pow(y*b+pow(y,2)*x+a,2)+pow(a*x+b+y*pow(x,2),2),-1);
+    */
+    d = pow(y,2)*pow(pow(b+y*pow(x,2)+x*a,2)+pow(y*b+pow(y,2)*x+a,2),-1)*
+        (-b-y*pow(x,2)-x*a)+
+        pow(pow(b+y*pow(x,2)+x*a,2)+pow(y*b+pow(y,2)*x+a,2),-1)*
+        (y*b+pow(y,2)*x+a)*(2*y*x+a);
     result += check_diff(e, x, d);
     
     return result;
 }
 
 // Series
-static unsigned differentiation3(void)
+static unsigned differentiation6(void)
 {
     symbol x("x");
     ex e, d, ed;
@@ -222,6 +279,9 @@ unsigned differentiation(void)
     result += differentiation1();
     result += differentiation2();
     result += differentiation3();
+    result += differentiation4();
+    result += differentiation5();
+    result += differentiation6();
     
     if (!result) {
         cout << " passed ";