37 const int n = d.size();
39 if ((
int)e.size() != n)
throw std::runtime_error(
"The size of e must be d.size() for the purpose of this routine.");
40 if ((
int)z.size() != n)
throw std::runtime_error(
"The size of z must be d.size().");
58 prec = std::numeric_limits<T>::epsilon();
64 for (l = 1; l <= n; ++l) {
67 for (m = l; m <= n; ++m) {
69 if (fabs(e[m - 1]) <= prec * (fabs(d[m - 1]) + fabs(d[m])))
break;
77 std::cerr <<
"IMTQLX - Fatal error!\n";
78 std::cerr <<
" Iteration limit exceeded\n";
79 throw std::runtime_error(
"IMTQLX - Fatal error!");
83 g = (d[l] - p) / (2.0 * e[l - 1]);
84 r = sqrt(g * g + 1.0);
85 g = d[m - 1] - p + e[l - 1] / (g + fabs(r) *
sign(g));
91 for (ii = 1; ii <= mml; ++ii) {
96 if (fabs(g) <= fabs(f)) {
98 r = sqrt(c * c + 1.0);
104 r = sqrt(s * s + 1.0);
110 r = (d[i - 1] - g) * s + 2.0 * c * b;
115 z[i] = s * z[i - 1] + c * f;
116 z[i - 1] = c * z[i - 1] - s * f;
118 d[l - 1] = d[l - 1] - p;
125 for (ii = 2; ii <= m; ++ii) {
130 for (j = ii; j <= n; ++j) {
void diagonalize_tridiagonal_symmetric_matrix(std::vector< T > &d, std::vector< T > &e, std::vector< T > &z)
Diagonalizes a symmetric tridiagonal matrix.
Definition diagonalization.hh:35