Я недавно установил броненосец и попробовал проблему собственных значений для разреженных матриц. К сожалению, разложение не выполняется, если параметр «N» (код ниже) слишком велик, например. 1000. Интересно, что здесь происходит. Матрица не очень сложная - она имеет диагональную структуру.
ОБНОВЛЕНИЕ
У Mathematica тоже есть проблемы с этой матрицей. Это говорит мне, что алгоритм Арнольди не сходится. Может быть, мне нужно вручную указать некоторые параметры в подпрограммах Arnoldi arpack, чтобы обеспечить сходимость?
Вот мой код:
#include <armadillo>
int main ()
{
double N = 1000.0;
// create matrix
int kmin = 0;
int kmax = static_cast<int>( std::floor( N/2.0 ) );
int dim = (kmax - kmin) + 1;
// locations and values in sparse matrices
arma::umat hc_locations (2, 3*dim-2);
arma::vec hc_values (3*dim-2);
// diagonal part
for (int k=0; k<dim; k++)
{
hc_locations (0,k) = k;
hc_locations (1,k) = k;
hc_values (k) = 2.0/N*static_cast<double>(kmin + k)*( 2.0*( N-2.0*static_cast<double>(k + kmin) ) - 1.0 );
}
// upper and lower diagonal
for (int k=0; k<dim-1; k++)
{
hc_locations (0,k+dim) = k;
hc_locations (1,k+dim) = k+1;
hc_values (k+dim) = 2.0/N*std::sqrt( ( static_cast<double>(k+1+kmin) ) *
( static_cast<double>(k+1+kmin) ) *
( N - static_cast<double>(2*(k+1+kmin)) + 1.0 ) *
( N - static_cast<double>(2*(k+1+kmin)) + 2.0 ) );
hc_locations (0, k+2*dim-1) = k+1;
hc_locations (1, k+2*dim-1) = k;
hc_values (k+2*dim-1) = 2.0/N*std::sqrt ( ( static_cast<double>(k+1+kmin) ) *
( static_cast<double>(k+1+kmin) ) *
( N - static_cast<double>(2*(k+kmin)) ) *
( N - static_cast<double>(2*(k+kmin)) - 1.0 ) );
}
arma::sp_mat Ham(hc_locations, hc_values);
// eigenvalue problem
arma::vec eigval;
arma::mat eigvec;
arma::eigs_sym( eigval, eigvec, Ham, 3, "sa");
}