X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=check%2Fdifferentiation.cpp;h=0d963fed8b0f6d830a56063f71859a9a6786d561;hp=6537eb3f7eb9eb1dfbfba0d4b95e2e0c9ec2d977;hb=be0485a03e9886496eeb7e8cdc2cc5c95b848632;hpb=c10054835b4c63a95b37703a952d663f280aa1ce diff --git a/check/differentiation.cpp b/check/differentiation.cpp index 6537eb3f..0d963fed 100644 --- a/check/differentiation.cpp +++ b/check/differentiation.cpp @@ -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 +#include +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 ";