45TEST_CASE(
"solving a rank-one secular equation with laed9",
"[templateLapack]" )
49 std::array<float, 2> eigenvalues{};
50 std::array<float, 4> workspace{};
51 std::array<float, 4> eigenvectors{};
52 std::array<float, 2> poles{ 1.0F, 3.0F };
53 std::array<float, 2> update{ 0.6F, 0.8F };
68 const float tolerance = 64.0F * std::numeric_limits<float>::epsilon();
70 REQUIRE( std::abs( eigenvalues[0] - 1.4F ) <= tolerance );
71 REQUIRE( std::abs( eigenvalues[1] - 4.6F ) <= tolerance );
72 for( std::size_t column = 0; column < 2; ++column )
74 const float first = eigenvectors[2 * column];
75 const float second = eigenvectors[2 * column + 1];
76 const float firstResidual = 1.72F * first + 0.96F * second - eigenvalues[column] * first;
77 const float secondResidual = 0.96F * first + 4.28F * second - eigenvalues[column] * second;
78 CAPTURE( column, firstResidual, secondResidual );
79 REQUIRE( std::hypot( firstResidual, secondResidual ) <= tolerance );
80 REQUIRE( std::abs( std::hypot( first, second ) - 1.0F ) <= tolerance );
82 REQUIRE( std::abs( eigenvectors[0] * eigenvectors[2] + eigenvectors[1] * eigenvectors[3] ) <= tolerance );
87 std::array<double, 2> eigenvalues{};
88 std::array<double, 4> workspace{};
89 std::array<double, 4> eigenvectors{};
90 std::array<double, 2> poles{ 1.0, 3.0 };
91 std::array<double, 2> update{ 0.6, 0.8 };
106 const double tolerance = 64.0 * std::numeric_limits<double>::epsilon();
107 REQUIRE( info == 0 );
108 REQUIRE( std::abs( eigenvalues[0] - 1.4 ) <= tolerance );
109 REQUIRE( std::abs( eigenvalues[1] - 4.6 ) <= tolerance );
110 for( std::size_t column = 0; column < 2; ++column )
112 const double first = eigenvectors[2 * column];
113 const double second = eigenvectors[2 * column + 1];
114 const double firstResidual = 1.72 * first + 0.96 * second - eigenvalues[column] * first;
115 const double secondResidual = 0.96 * first + 4.28 * second - eigenvalues[column] * second;
116 CAPTURE( column, firstResidual, secondResidual );
117 REQUIRE( std::hypot( firstResidual, secondResidual ) <= tolerance );
118 REQUIRE( std::abs( std::hypot( first, second ) - 1.0 ) <= tolerance );
120 REQUIRE( std::abs( eigenvectors[0] * eigenvectors[2] + eigenvectors[1] * eigenvectors[3] ) <= tolerance );
MXLAPACK_INT laed9(dataT *D, dataT *Q, dataT *S, MXLAPACK_INT K, MXLAPACK_INT KSTART, MXLAPACK_INT KSTOP, MXLAPACK_INT N, MXLAPACK_INT LDQ, dataT RHO, dataT *DLAMDA, dataT *W, MXLAPACK_INT LDS)
Solve selected roots of a diagonal-plus-rank-one secular equation and form its eigenvectors.