source: trunk/test_more/erf.cpp @ 3520

Last change on this file since 3520 was 3501, checked in by bradbell, 5 years ago

erf.cpp: fix test of case where compiler has erf.

  • Property svn:keywords set to Id
File size: 2.9 KB
Line 
1/* $Id: erf.cpp 3501 2014-12-25 01:10:32Z bradbell $ */
2/* --------------------------------------------------------------------------
3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-13 Bradley M. Bell
4
5CppAD is distributed under multiple licenses. This distribution is under
6the terms of the
7                    Eclipse Public License Version 1.0.
8
9A copy of this license is included in the COPYING file of this distribution.
10Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
11-------------------------------------------------------------------------- */
12
13/*
14Old example now just used for validation testing
15*/
16
17# include <cppad/cppad.hpp>
18
19bool Erf(void)
20{       bool ok = true;
21        using namespace CppAD;
22        using CppAD::atan;
23        using CppAD::exp;
24        using CppAD::sqrt;
25# if CPPAD_COMPILER_HAS_ERF
26        double eps = 100.0 * std::numeric_limits<double>::epsilon();
27# endif
28        // Construct function object corresponding to erf
29        CPPAD_TESTVECTOR(AD<double>) ax(1);
30        CPPAD_TESTVECTOR(AD<double>) ay(1);
31        ax[0] = 0.;
32        Independent(ax);
33        ay[0] = erf(ax[0]);
34        ADFun<double> f(ax, ay);
35
36        // Construct function object corresponding to derivative of erf
37        Independent(ax);
38        double pi = 4.0 * atan(1.0);
39        ay[0] = exp( - ax[0] * ax[0] ) * 2.0 / sqrt(pi);
40        ADFun<double> df(ax, ay);
41
42        // vectors to use with function object
43        CPPAD_TESTVECTOR(double) x0(1), y0(1), x1(1), y1(1), check(1);
44
45        // check value at zero
46        x0[0]    = 1.5;
47        y0       = f.Forward(0, x0);   
48        check[0] = 0.96611;
49        ok      &= std::fabs(check[0] - y0[0]) <= 4e-4;
50
51        // check the derivative of error function
52        x1[0] = 1.0;
53        y1    = f.Forward(1, x1);
54        check = df.Forward(0, x0);
55        ok   &= NearEqual(check[0], y1[0], 0., 2e-3);
56# if CPPAD_COMPILER_HAS_ERF
57        ok   &= NearEqual(check[0], y1[0], eps, eps);
58# endif
59
60        // check second derivative
61        CPPAD_TESTVECTOR(double) x2(1), y2(1);
62        x2[0] = 0.0;
63        y2    = f.Forward(2, x2);
64        check = df.Forward(1, x1);
65        ok   &= NearEqual(check[0] / 2.0, y2[0], 0., 2e-3);
66# if CPPAD_COMPILER_HAS_ERF
67        ok   &= NearEqual(check[0] / 2.0, y2[0], eps, eps);
68# endif
69
70        // check third derivative
71        CPPAD_TESTVECTOR(double) x3(1), y3(1);
72        x3[0] = 0.0;
73        y3    = f.Forward(3, x3);
74        check = df.Forward(2, x2);
75        ok   &= NearEqual(check[0] / 3.0, y3[0], 0., 2e-3);
76# if CPPAD_COMPILER_HAS_ERF
77        ok   &= NearEqual(check[0] / 3.0, y3[0], eps, eps);
78# endif
79
80        // check 4-th order of reverse mode
81        CPPAD_TESTVECTOR(double) w(1), dy(4), x4(1), y4(1);
82        x4[0] = 0.0;
83        w[0]  = 1.0;
84        dy    = f.Reverse(4, w);
85        y4    = f.Forward(4, x4);
86        //
87        ok  &= NearEqual(dy[0], y1[0], 0., 2e-3);
88# if CPPAD_COMPILER_HAS_ERF
89        ok  &= NearEqual(dy[0], y1[0], eps, eps);
90# endif
91        //
92        ok  &= NearEqual(dy[1], 2.0 * y2[0], 0., 2e-3);
93# if CPPAD_COMPILER_HAS_ERF
94        ok  &= NearEqual(dy[1], 2.0 * y2[0], eps, eps);
95# endif
96        //
97        ok  &= NearEqual(dy[2], 3.0 * y3[0], 0., 2e-3);
98# if CPPAD_COMPILER_HAS_ERF
99        ok  &= NearEqual(dy[2], 3.0 * y3[0], eps, eps);
100# endif
101        //
102        ok  &= NearEqual(dy[3], 4.0 * y4[0], 0., 2e-3);
103# if CPPAD_COMPILER_HAS_ERF
104        ok  &= NearEqual(dy[3], 4.0 * y4[0], eps, eps);
105# endif
106
107        return ok;
108}
Note: See TracBrowser for help on using the repository browser.