44 #ifndef GNSSTK_MISCMATH_HPP
45 #define GNSSTK_MISCMATH_HPP
67 const std::vector<T>& Y,
70 if(
Y.size() < X.size()) {
75 for(i=0; i<X.size(); i++) {
76 if(x==X[i])
return Y[i];
79 for(j=0; j<X.size(); j++)
80 if(i!=j) Li *= (x-X[j])/(X[i]-X[j]);
101 if(
Y.size() < X.size() || X.size() < 4) {
111 if(x == X[k])
return Y[k];
112 if(x == X[k-1])
return Y[k-1];
113 if(
ABS(x-X[k-1]) <
ABS(x-X[k])) k=k-1;
114 for(i=0; i<X.size(); i++) {
119 for(j=1; j<X.size(); j++) {
120 for(i=0; i<X.size()-j; i++) {
121 del = (Q[i+1]-D[i])/(X[i]-X[i+j]);
122 D[i] = (X[i+j]-x)*del;
125 err = (2*(k+1) < X.size()-j ? Q[k+1] : D[k--]);
155 const T& x, T&
y, T& dydx)
157 if(
Y.size() < X.size() || X.size() < 4) {
161 std::size_t i,j,k,N=X.size(),M;
163 std::vector<T>
P(N,T(1)),Q(M,T(1)),D(N,T(1));
171 if(k == i || k == j)
continue;
172 Q[i+(j*(j+1))/2] *= (x-X[k]);
180 y +=
Y[i]*(
P[i]/D[i]);
182 for(k=0; k<N; k++)
if(i != k) {
183 if(k<i) S += Q[k+(i*(i+1))/2]/D[i];
184 else S += Q[i+(k*(k+1))/2]/D[i];
194 const std::vector<T>& val,
197 int degree(
pos.size());
201 typedef std::vector< T > vectorType;
202 std::vector< vectorType > delta(degree, vectorType(degree, 0.0));
204 for(i=0; i < degree; ++i) {
205 for(j=0; j < degree; ++j) {
207 delta[i][j] = ((desiredPos -
pos[j])/(
pos[i] -
pos[j]));
213 for(i=0; i < degree; ++i) {
216 for(m=0; m < degree; ++m) {
218 double weight1(1.0/(
pos[i]-
pos[m]));
221 for(j=0; j < degree; ++j) {
222 if((j != i) && (j != m)) {
223 double weight2(1.0/(
pos[i]-
pos[j]));
224 for(n=0; n < degree; ++n) {
225 if((n != j) && (n != m) && (n != i)) {
226 weight2 *= delta[i][n];
235 retVal += val[i] *
sum;
242 #define tswap(x,y) { T tmp; tmp = x; x = y; y = tmp; }
249 if(a < b)
tswap(a,b);
250 if(a < c)
tswap(a,c);
251 if(a == T(0))
return T(0);
252 return a *
SQRT(1 + (b/a)*(b/a) + (c/a)*(c/a));
259 return RSS(aa,bb,T(0));
264 T
RSS (T aa, T bb, T cc, T dd)
268 if(a < b)
tswap(a,b);
269 if(a < c)
tswap(a,c);
270 if(a < d)
tswap(a,d);
271 if(a == T(0))
return T(0);
272 return a *
SQRT(1 + (b/a)*(b/a) + (c/a)*(c/a) + (d/a)*(d/a));
279 return double(std::floor(x+0.5));