78{
81
83
84 unsigned int numberOfEvents;
87 map_type precision;
89
90 precision["spline"] = JPrecision_t(1.0e-3, 1.0e-1, 1.0e-4);
91 precision["hermite"] = JPrecision_t(1.0e-3, 1.0e-1, 1.0e-4);
92 precision["grid"] = JPrecision_t(1.0e-3, 1.0e-1, 1.0e-4);
93 precision["polint"] = JPrecision_t(1.0e-14, 1.0e-12, 1.0e-14);
94
95 try {
96
97 JParser<> zap(
"Example program to test 1D interpolation of a polynome.");
98
104
105 zap(argc, argv);
106 }
107 catch(const exception &error) {
108 FATAL(error.what() << endl);
109 }
110
111
112 const int N = 3;
113
119
120 const double xmin = -1.0;
121 const double xmax = +1.0;
122
127
128 spline .compile();
129 hermite.compile();
130 grid .compile();
131 polint .compile();
132
134
135 Polint.compile();
136
137 if (numberOfEvents != 0) {
138
139 JABC Qspline ("spline");
140 JABC Qhermite("hermite");
141 JABC Qgrid ("grid");
142 JABC Qpolint ("polint");
143
144 for (unsigned int i = 0; i != numberOfEvents; ++i) {
145
146 const double x = gRandom->Uniform(xmin, xmax);
147
151
152 Qspline .f .put(y1 - spline (x).f);
153 Qhermite.f .put(y1 - hermite(x).f);
154 Qgrid .f .put(y1 - grid (x).f);
155 Qpolint .f .put(y1 - polint (x).f);
156
157 Qspline .fp.put(fp - spline (x).fp);
158 Qhermite.fp.put(fp - hermite(x).fp);
159 Qgrid .fp.put(fp - grid (x).fp);
160 Qpolint .fp.put(fp - polint (x).fp);
161
162 Qspline .v .put(F1 - spline (x).v);
163 Qhermite.v .put(F1 - hermite(x).v);
164 Qgrid .v .put(F1 - grid (x).v);
165 Qpolint .v .put(F1 - Polint (x));
166 }
167
168 if (
debug >= debug_t) {
169
170 cout << "RMS: f f' F " << endl;
171 cout << "_________________________________________" << endl;
172
173 cout << "spline "
174 <<
SCIENTIFIC(10,3) << Qspline .f .getSTDev() <<
' '
175 <<
SCIENTIFIC(10,3) << Qspline .fp.getSTDev() <<
' '
176 <<
SCIENTIFIC(10,3) << Qspline .v .getSTDev() << endl;
177
178 cout << "hermite "
179 <<
SCIENTIFIC(10,3) << Qhermite.f .getSTDev() <<
' '
180 <<
SCIENTIFIC(10,3) << Qhermite.fp.getSTDev() <<
' '
181 <<
SCIENTIFIC(10,3) << Qhermite.v .getSTDev() << endl;
182
183 cout << "grid "
184 <<
SCIENTIFIC(10,3) << Qgrid .f .getSTDev() <<
' '
185 <<
SCIENTIFIC(10,3) << Qgrid .fp.getSTDev() <<
' '
186 <<
SCIENTIFIC(10,3) << Qgrid .v .getSTDev() << endl;
187
188 cout << "polint "
189 <<
SCIENTIFIC(10,3) << Qpolint .f .getSTDev() <<
' '
190 <<
SCIENTIFIC(10,3) << Qpolint .fp.getSTDev() <<
' '
191 <<
SCIENTIFIC(10,3) << Qpolint .v .getSTDev() << endl;
192 }
193
194 ASSERT(Qspline .f .getSTDev() <= precision[
"spline"].f);
195 ASSERT(Qspline .fp.getSTDev() <= precision[
"spline"].fp);
196 ASSERT(Qspline .v .getSTDev() <= precision[
"spline"].v);
197
198 ASSERT(Qhermite.f .getSTDev() <= precision[
"hermite"].f);
199 ASSERT(Qhermite.fp.getSTDev() <= precision[
"hermite"].fp);
200 ASSERT(Qhermite.v .getSTDev() <= precision[
"hermite"].v);
201
202 ASSERT(Qgrid .f .getSTDev() <= precision[
"grid"].f);
203 ASSERT(Qgrid .fp.getSTDev() <= precision[
"grid"].fp);
204 ASSERT(Qgrid .v .getSTDev() <= precision[
"grid"].v);
205
206 ASSERT(Qpolint .f .getSTDev() <= precision[
"polint"].f);
207 ASSERT(Qpolint .fp.getSTDev() <= precision[
"polint"].fp);
208 ASSERT(Qpolint .v .getSTDev() <= precision[
"polint"].v);
209
210 } else {
211
212 for ( ; ; ) {
213
214 string buffer;
215
216 cout << "> " << flush;
217
219
220 if (buffer != "") {
221
222 try {
223
225
226 istringstream(buffer) >>
x;
227
228 cout <<
"f1 " <<
f1 (x) << endl;
229 cout << "spline " << spline (x).f << endl;
230 cout << "hermite " << hermite(x).f << endl;
231 cout << "grid spline " << grid (x).f << endl;
232 cout << "polynomial " << polint (x).f << endl;
233 }
235 cout << exception.what() << endl;
236 }
237
238 } else {
239 break;
240 }
241 }
242 }
243
244 return 0;
245}
#define ASSERT(A,...)
Assert macro.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
int numberOfBins
number of bins for average CDF integral of optical module
Utility class to parse command line options.
const JPolynome F1
Integral.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Recursive template class for polynomial function.
double getIntegral(const double x) const
Integral value.
double getValue(const double x) const
Function value.
double getDerivative(const double x) const
Derivative value.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.