ODT
Loading...
Searching...
No Matches
interp_linear.h
Go to the documentation of this file.
1/*
2 * @file interp_linear.h
3 * @brief Header file for class Linear_interp
4 */
5
6#ifndef INTERP_LINEAR_H
7#define INTERP_LINEAR_H
8
9#include <vector>
10#include <cstdlib>
11#include <iostream>
12
13using namespace std;
14
16
17 public:
18
19 vector<double> *X;
20 vector<double> *Y;
21
22 int nxy;
23
24 private:
25
26 int ilo;
27 int ihi;
28
30
31 public:
32
33 double interp(double x){
35 return (*Y)[ilo] + (x-(*X)[ilo])*((*Y)[ihi]-(*Y)[ilo])/((*X)[ihi]-(*X)[ilo]);
36 }
37
38 private:
39
40 void set_bounding_indicies(double x){
41 if(x <= (*X)[0])
42 ihi = 1;
43 else if(x >= (*X).back())
44 ihi = nxy-1;
45 else {
46 vector<double>::iterator itHi = lower_bound((*X).begin(), (*X).end(), x); // lower_bound gives values >= x
47 ihi = itHi - (*X).begin();
48 }
49 ilo = ihi-1;
50 }
51
53
54 public:
55
56 //------------- constructors
57
59
60 Linear_interp(vector<double> &X_p, vector<double> &Y_p){
61 X = &X_p;
62 Y = &Y_p;
63 nxy = (*X).size();
64 if((*X).size()!=(*Y).size()){
65 cout << endl << "Error in interp_linear: X, Y need same size" << endl;
66 exit(0);
67 }
68
69 for(int i=1; i<nxy-1; i++)
70 if( ((*X)[i] == (*X)[i-1]) ||
71 ((*X)[i] == (*X)[i+1]) ||
72 ((*X)[i]<(*X)[i-1] && (*X)[i]<(*X)[i+1]) ||
73 ((*X)[i]>(*X)[i-1] && (*X)[i]>(*X)[i+1]) ){
74 cout << endl << "Error in interp_linear: X should be monotonic" << endl;
75 exit(0);
76 }
77 }
78
79};
80
81#endif
Linear_interp(vector< double > &X_p, vector< double > &Y_p)
vector< double > * X
void set_bounding_indicies(double x)
vector< double > * Y
double interp(double x)