-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathF1P.cpp
74 lines (67 loc) · 1.97 KB
/
F1P.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <nV/Number.h>
#include <nV/utils.h>
#include "F1P.h"
#include <limits>
namespace nV{
namespace Graphics{
//uint times = 0;
//double timetotal = 0.0;
F1P::F1P(Kernel& k, var ep, var pa) : kernel(k) {
param = pa;
expre = ep;
}
void F1P::getData(double* x, double* y, int num) {
//times++;
//timer t;
//t.start();
kernel.beginLocal();
//var expretemp = kernel.eval(expre);
//expretemp.print();
for (int i = 0; i < num; ++i) {
kernel.assign(param, new Real(x[i], 0));
//var temp = kernel.eval(expre);
//if(temp.isSymbol()) {
// y[i] = std::numeric_limits<double>().quiet_NaN();
// continue;
//}
//if (temp.isObject($.Real) || temp.isObject($.Integer)) {
// y[i] = toD(N(kernel, temp).object());
//} else {
// y[i] = 0.0;
//}
//y[i] = toD(N(kernel, kernel.eval(expretemp)).object());
var t = N(kernel, kernel.eval(expre));
y[i] = t.isObject() ? toD(t.object()) : NaN;
}
kernel.endLocal();
//t.end();
//timetotal += t.value;
}
void F1P::getArrayData(double *x, double *y, int num) {
getData(x, y, num);
}
double F1P::getSingleData(double input) {
double x = input;
double y;
getData(&x, &y, 1);
return y;
}
double F1P::getDerivative(double x, double dx) {
double datay[2];
double datax[2];
datax[0] = x;
datax[1] = x + dx;
getData(datax, datay, 2);
return (datay[1] - datay[0]) / dx;
}
double F1P::getSecondDerivative(double x, double dx) {
double datay[3];
double datax[3];
datax[0] = x;
datax[1] = x + dx;
datax[2] = x + 2 * dx;
getData(datax, datay, 3);
return (datay[2] - 2*datay[1] + datay[0]) / (dx*dx);
}
}
}