FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
AzimuthCurve.h
1#ifndef AzimuthCurve_h__
2#define AzimuthCurve_h__
3
4#include <vector>
5#include <cstddef>
6#include <Eigen/Eigen>
7
8template <class T>
10public:
11 AzimuthCurve( std::vector<T> coeff, std::vector<double> aziAngle ){
12 MakeCofficients(coeff, aziAngle);
13 }
14
15 AzimuthCurve( std::vector<T> coeff ){
16 size_t size = coeff.size();
17 m_coeff_size = size;
18 m_coeff.resize(size);
19 for (size_t i =0; i < size; i++){
20 m_coeff[i] = coeff[i];
21 }
22 }
23
24 T eval( double angle ){
25 T retval = m_coeff[0];
26 for( size_t j=1; j < ((m_coeff_size - 1) / 2 + 1); j++)
27 retval += m_coeff[j]*cos( j * angle);
28 for( size_t j=((m_coeff_size - 1) / 2 + 1); j < m_coeff_size; j++)
29 retval += m_coeff[j]*sin( (j-(m_coeff_size - 1) / 2) * angle);
30 return retval;
31 }
32
33 std::vector<T> eval( std::vector<T> angle ){
34 std::vector<T> retval; retval.resize(angle.size());
35 for( size_t i=0; i < angle.size(); i++)
36 retval[i] = eval( angle[i] );
37 return retval;
38 }
39
40private:
41 std::vector<T> m_coeff;
42 size_t m_coeff_size;
43
44 void MakeCofficients(std::vector<T> values, std::vector<double> aziAngle){
45
46 size_t size = values.size();
47
48 // Solve 2*N + 1 unknown (A0 + A1..AN + B1..BN
49 size_t N = static_cast<size_t>(std::floor((size - 1) / 2));
50 m_coeff_size = 2*N+1;
51 m_coeff.resize(m_coeff_size);
52
53 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> A = Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>::Zero(m_coeff_size, m_coeff_size);
54 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> B = Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>::Zero(m_coeff_size, 1);
55 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> x = Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>::Zero(m_coeff_size, 1);
56
57 // right hand side of equation system
58 for(size_t k=0; k < m_coeff_size; k++)
59 B(k) = values[k];
60
61 // build system matrix, left hand side. A0, A1..AN and B1..BN
62 // build for each B value.
63 for(size_t k=0; k < m_coeff_size; k++){
64 A(k, 0) = 1;
65 for (size_t j = 1; j < N + 1; j++) {
66 A(k, j + 0) = cos(j * aziAngle[k]);
67 A(k, j + N) = sin(j * aziAngle[k]);
68 }
69 }
70
71 for(size_t k=0; k < size; k++)
72 for(size_t j=0; j < size; j++){
73 if( (std::abs(A(k,j)) < 1e-6) )
74 A(k,j) = 0;
75 }
76
77 x = A.colPivHouseholderQr().solve(B);
78 for(size_t k=0; k < size; k++)
79 m_coeff[k] = x(k);
80 }
81};
82
83#endif // AzimuthCurve_h__
Definition AzimuthCurve.h:9