Geomi
LagrangeInterpolation.hpp
1 #ifndef DEF_COMMON_LEGENDREINTERPOLATION
2 #define DEF_COMMON_LEGENDREINTERPOLATION
3 
4 #include <vector>
5 
7 {
8 protected:
9  std::vector<double> m_dates;
10  int m_degree;
11  bool m_computed;
12  std::vector<std::vector<double>> m_polynomials;
13  std::vector<std::vector<double>> m_polynomials_derivatives;
14 
15 public:
17  {
18  m_degree = 0;
19  m_dates.clear();
20  m_computed = false;
21  }
22 
23  std::vector<double>
24  chebyshev (int degree)
25  {
26  double den = 1.0/double(degree);
27  std::vector<double> ret;
28  for (int i=0;i<=degree;i++) {
29  ret.push_back(double(i)*den);
30  }
31  return ret;
32  }
33 
34  void
35  check_computed (int s, std::vector<double> dates)
36  {
37  if (s!=m_degree) {
38  m_degree = s;
39  m_computed = false;
40  }
41  if (dates!=m_dates) {
42  m_dates = dates;
43  m_computed = false;
44  }
45  if (!m_computed) {
48  m_computed = true;
49  }
50  }
51 
52  std::vector<std::vector<double>>
53  polynomials (int s, std::vector<double> dates)
54  {
55  check_computed(s, dates);
56  return m_polynomials;
57  }
58 
59  std::vector<std::vector<double>>
60  polynomials_derivatives (int s, std::vector<double> dates)
61  {
62  check_computed(s, dates);
63  return m_polynomials_derivatives;
64  }
65 
66  // méthode brutale, peut-être un peu d'optimisation serait bienvenue...
76  void
78  {
79  int i; // index date
80  int j; // index polynome
81  int k; // index produit
82  //std::vector<std::vector<double>> ret;
83  std::vector<double> tmp;
84  std::vector<double> coeffs = chebyshev(m_degree);
85  double prod;
86  double t;
87 
88  m_polynomials.clear();
89  for (i=0; i<m_dates.size(); i++) {
90  t = m_dates[i];
91  tmp.clear();
92  for (j=0; j<=m_degree; j++) {
93  prod = 1.0;
94  for (k=0; k<=m_degree; k++) {
95  if (j!=k)
96  prod *= (t-coeffs[k])/(coeffs[j]-coeffs[k]);
97  }
98  tmp.push_back(prod);
99  }
100  m_polynomials.push_back(tmp);
101  }
102  }
103 
104  // méthode brutale, peut-être un peu d'optimisation serait bienvenue...
113  void
115  {
116  int i; // index date
117  int j; // index polynome
118  int k; // index somme
119  int l; // index produit
120  //std::vector<std::vector<double>> ret;
121  std::vector<double> tmp;
122  std::vector<double> coeffs = chebyshev(m_degree);
123  double somme;
124  double prod;
125  double t;
126 
127  m_polynomials_derivatives.clear();
128  for (i=0; i<m_dates.size(); i++) {
129  t = m_dates[i];
130  tmp.clear();
131  for (j=0; j<=m_degree; j++) {
132  somme = 0.0;
133  for (k=0; k<=m_degree; k++) {
134  if (j!=k) {
135  prod = 1.0;
136  for (l=0; l<=m_degree; l++) {
137  if ((l!=k) && (l!=j))
138  prod *= (t-coeffs[l])/(coeffs[j]-coeffs[l]);
139  }
140  prod = prod/(coeffs[j]-coeffs[k]);
141  somme += prod;
142  }
143  }
144  tmp.push_back(somme);
145  }
146  m_polynomials_derivatives.push_back(tmp);
147  }
148  }
149 };
150 
151 template <typename T_Q>
153 {
154 public:
155  std::vector<T_Q>
156  pos_interp (int s, std::vector<double> dates, std::vector<T_Q> configs)
157  {
158  check_computed(s, dates);
159 
160  int i,j;
161  std::vector<T_Q> ret;
162  T_Q tmp;
163 
164  for (j=0; j<this->m_dates.size(); j++) {
165  tmp = T_Q::Zero();
166  for (i=0;i<=this->m_degree;i++) {
167  tmp += m_polynomials[j][i]*configs[i];
168  }
169  ret.push_back(tmp);
170  }
171 
172  return ret;
173  }
174 
175  std::vector<T_Q>
176  vel_interp (int s, std::vector<double> dates, std::vector<T_Q> configs, double h)
177  {
178  check_computed(s, dates);
179 
180  int i,j;
181  std::vector<T_Q> ret;
182  T_Q tmp;
183 
184  for (j=0; j<this->m_dates.size(); j++) {
185  tmp = T_Q::Zero();
186  for (i=0;i<=this->m_degree;i++) {
187  tmp += m_polynomials_derivatives[j][i]*configs[i];
188  }
189  ret.push_back(tmp/h);
190  }
191 
192  return ret;
193  }
194 };
195 
196 #endif
void compute_polynomials_derivatives()
Definition: LagrangeInterpolation.hpp:114
void compute_polynomials()
Definition: LagrangeInterpolation.hpp:77
Definition: LagrangeInterpolation.hpp:6
Definition: LagrangeInterpolation.hpp:152