6 #ifndef NIHU_ND_CHEB_HPP_INCLUDED
7 #define NIHU_ND_CHEB_HPP_INCLUDED
14 #include <boost/math/special_functions/chebyshev.hpp>
15 #include <Eigen/Dense>
31 template <
size_t Dim,
class T =
double>
32 Eigen::Matrix<T, Dim, Eigen::Dynamic>
lintrans(
33 Eigen::Matrix<T, Dim, Eigen::Dynamic>
const &x,
37 Eigen::Matrix<T, Dim, Eigen::Dynamic> y = x;
38 for (
size_t d = 0; d < Dim; ++d)
54 template <
size_t Dim,
class T =
double>
55 Eigen::Matrix<T, Dim, Eigen::Dynamic>
chebnodes(
size_t n,
59 Eigen::Matrix<T, 1, Eigen::Dynamic> x0(1, n);
60 for (
size_t i = 0; i < n; ++i)
64 Eigen::Matrix<T, Dim, Eigen::Dynamic> x(Dim,
Ipow(n, Dim));
65 for (
size_t i = 0; i <
Ipow(n, Dim); ++i)
68 for (
size_t d = 0; d < Dim; ++d)
88 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
89 chebanterp0(
size_t N, Eigen::Matrix<T, Eigen::Dynamic, 1>
const &x,
90 Eigen::Matrix<T, Eigen::Dynamic, 1>
const &y)
92 using boost::math::chebyshev_t;
93 size_t n = x.rows(), m = y.rows();
94 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> S(n, m);
95 Eigen::Matrix<T, Eigen::Dynamic, 1> Sx(n, 1), Sy(m, 1);
97 for (
unsigned l = 1; l < N; ++l)
99 for (
size_t i = 0; i < n; ++i)
100 Sx(i) = chebyshev_t(l, x(i));
101 for (
size_t j = 0; j < m; ++j)
102 Sy(j) = chebyshev_t(l, y(j));
103 S += 2. * (Sx * Sy.transpose());
116 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
118 Eigen::Matrix<T, Eigen::Dynamic, 1>
const &y)
120 using boost::math::chebyshev_t;
121 using boost::math::chebyshev_t_prime;
122 size_t n = x.rows(), m = y.rows();
123 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> S(n, m);
124 Eigen::Matrix<T, Eigen::Dynamic, 1> Sx(n, 1), Sy(m, 1);
126 for (
unsigned l = 1; l < N; ++l)
128 for (
size_t i = 0; i < n; ++i)
129 Sx(i) = chebyshev_t(l, x(i));
130 for (
size_t j = 0; j < m; ++j)
131 Sy(j) = chebyshev_t_prime(l, y(j));
132 S += 2. * (Sx * Sy.transpose());
146 template <
class T,
size_t Dim>
147 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
149 Eigen::Matrix<T, Dim, Eigen::Dynamic>
const &y0)
151 auto x = chebnodes<Dim, T >(N);
153 size_t n = x.cols(), m = y.cols();
154 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> S(n, m);
156 for (
size_t d = 0; d < Dim; ++d)
157 S.array() *= chebanterp0<T>(N, x.row(d).transpose(), y.row(d).transpose()).array();
170 template <
class T,
size_t Dim>
171 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
174 Eigen::Matrix<T, Dim, Eigen::Dynamic>
const &y0,
175 Eigen::Matrix<T, Dim, Eigen::Dynamic>
const &ny0
178 auto x = chebnodes<Dim, T >(N);
180 size_t n = x.cols(), m = y.cols();
183 Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic> dS(n, m);
186 for (
size_t q = 0; q < Dim; ++q)
188 Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic> S(n, m);
190 for (
size_t d = 0; d < Dim; ++d)
193 S *= chebanterp0_dy<T>(N, x.row(d).transpose(), y.row(d).transpose()).array();
195 S *= chebanterp0<T>(N, x.row(d).transpose(), y.row(d).transpose()).array();
197 dS += S.rowwise() * ny0.row(q).array();