00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include <iostream>
00049
00050 #include "Sacado.hpp"
00051
00052
00053 template <typename ScalarT>
00054 void func(ScalarT& f, const ScalarT& x) {
00055 f = 1.0 + x*x;
00056 }
00057
00058 int main(int argc, char **argv)
00059 {
00060 double x0 = 1.0;
00061 unsigned int deg = 40;
00062
00063 Sacado::Tay::Taylor<double> x = x0;
00064 Sacado::Tay::Taylor<double> f;
00065
00066
00067 x.reserve(deg);
00068
00069
00070 for (unsigned int k=0; k<deg; k++) {
00071 func(f, x);
00072
00073
00074 x.resize(k+1, true);
00075
00076
00077 x.fastAccessCoeff(k+1) = f.coeff(k) / (k+1);
00078 }
00079
00080
00081 Sacado::Fad::DFad< Sacado::Tay::Taylor<double> > x_fad(1, 0, x);
00082 Sacado::Fad::DFad< Sacado::Tay::Taylor<double> > f_fad;
00083 func(f_fad, x_fad);
00084 Sacado::Tay::Taylor<double> dxdx0(deg);
00085 dxdx0.fastAccessCoeff(0) = 1.0;
00086 for (unsigned int k=0; k<deg; k++) {
00087 dxdx0.fastAccessCoeff(k+1) = 0.0;
00088 for (unsigned int j=0; j<=k; j++)
00089 dxdx0.fastAccessCoeff(k+1) += f_fad.dx(0).coeff(k-j) * dxdx0.coeff(j);
00090 dxdx0.fastAccessCoeff(k+1) /= k+1;
00091 }
00092
00093
00094 std::cout << "Taylor series solution = " << std::endl
00095 << x << std::endl;
00096
00097
00098 std::cout << "Taylor series solution derivative= " << std::endl
00099 << dxdx0 << std::endl;
00100
00101
00102 double pi = std::atan(1.0)*4.0;
00103 Sacado::Tay::Taylor<double> t(deg);
00104 t.fastAccessCoeff(0) = pi/4.0;
00105 t.fastAccessCoeff(1) = 1.0;
00106 Sacado::Tay::Taylor<double> u = std::tan(t);
00107
00108
00109 Sacado::Tay::Taylor<double> dudx0 = 0.5*(1.0+u*u);
00110
00111
00112 std::cout << "Exact expansion = " << std::endl
00113 << u << std::endl;
00114
00115
00116 std::cout << "Exact expansion derivative = " << std::endl
00117 << dudx0 << std::endl;
00118
00119
00120 double max_err = 0.0;
00121 double err = 0.0;
00122 for (unsigned int k=0; k<=deg; k++) {
00123 err = std::fabs(x.coeff(k) - u.coeff(k)) / (1.0 + fabs(u.coeff(k)));
00124 if (err > max_err) max_err = err;
00125 }
00126 std::cout << "Maximum relative error = " << max_err << std::endl;
00127
00128
00129 double deriv_max_err = 0.0;
00130 double deriv_err = 0.0;
00131 for (unsigned int k=0; k<=deg; k++) {
00132 deriv_err = std::fabs(dxdx0.coeff(k) - dudx0.coeff(k)) /
00133 (1.0 + fabs(dudx0.coeff(k)));
00134 if (deriv_err > deriv_max_err) deriv_max_err = deriv_err;
00135 }
00136 std::cout << "Maximum derivative relative error = " << deriv_max_err
00137 << std::endl;
00138
00139 double tol = 1.0e-12;
00140 if ((max_err < tol) && (deriv_max_err < tol)) {
00141 std::cout << "\nExample passed!" << std::endl;
00142 return 0;
00143 }
00144 else {
00145 std::cout <<"\nSomething is wrong, example failed!" << std::endl;
00146 return 1;
00147 }
00148
00149 return 0;
00150 }
00151
00152
00153