/** @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
#include <ginac/ginac.h>
+#ifndef NO_GINAC_NAMESPACE
+using namespace GiNaC;
+#endif // ndef NO_GINAC_NAMESPACE
+
static unsigned check_diff(const ex &e, const symbol &x,
const ex &d, unsigned nth=1)
{
ex ed = e.diff(x, nth);
- if ((ed - d).compare(exZERO()) != 0) {
+ if ((ed - d).compare(ex(0)) != 0) {
switch (nth) {
case 0:
clog << "zeroth ";
return result;
}
-// Trigonometric and transcendental functions
+// Trigonometric functions
static unsigned differentiation2(void)
{
unsigned result = 0;
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;
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;
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);
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;
- e = sin(x).series(x, exZERO(), 8);
- d = cos(x).series(x, exZERO(), 7);
+ e = sin(x).series(x, 0, 8);
+ d = cos(x).series(x, 0, 7);
ed = e.diff(x);
ed = static_cast<series *>(ed.bp)->convert_to_poly();
d = static_cast<series *>(d.bp)->convert_to_poly();
- if ((ed - d).compare(exZERO()) != 0) {
+ if ((ed - d).compare(ex(0)) != 0) {
clog << "derivative of " << e << " by " << x << " returned "
<< ed << " instead of " << d << ")" << endl;
return 1;
result += differentiation1();
result += differentiation2();
result += differentiation3();
+ result += differentiation4();
+ result += differentiation5();
+ result += differentiation6();
if (!result) {
cout << " passed ";