31 #include <Eigen/Eigenvalues>
33 #include "gtest/gtest.h"
68 Tsol << -3, -7, 0, -2;
71 Usol << -0.9487, -0.3162, 0.3162, -0.9487;
86 Tsol << -3, -7, 0, -2;
88 Eigen::Matrix2d Usol = Eigen::Matrix2d::Identity();
102 Eigen::Matrix2d Tsol;
103 Tsol << -0.5, -1.6404, 0.6096, -0.5;
105 Eigen::Matrix2d Usol;
106 Usol << 0.7882, 0.6154, -0.6154, 0.7882;
115 T << -0.393678, -0.73017, 0.78598, -0.606322;
120 Eigen::Matrix2d Tsol;
121 Tsol << -0.5000, -0.6482, 0.8680, -0.5000;
123 Eigen::Matrix2d Usol;
124 Usol << 0.7918, 0.6108, -0.6108, 0.7918;
139 Eigen::Matrix2d Tsol;
140 Tsol << 0, -1, 0, -5;
142 Eigen::Matrix2d Usol;
158 Eigen::Matrix2d Tsol;
159 Tsol << -5, -6, 1, -5;
161 Eigen::Matrix2d Usol;
174 Eigen::Matrix2d Rsol = T;
182 Eigen::MatrixXd R = U * T * U.adjoint();
198 T << -1.0000, 5.0000, 0, -2.0000;
203 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::Matrix2d::Identity(), 1e-5);
205 EXPECT_NEAR(T(0, 0), -2, 1e-10);
206 EXPECT_NEAR(T(1, 1), -1, 1e-10);
215 T << -1, -0.8378, 1.3184, 0, -0.5, 2.4397, 0, -0.2306, -0.5;
217 Eigen::MatrixXd Q(3, 3);
220 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::Matrix3d::Identity(), 1e-5);
223 Eigen::VectorXcd eig1 = T.block(0, 0, 2, 2).eigenvalues();
224 EXPECT_TRUE(
essentially_equal(eig1[0], std::complex<double>(-0.5, 0.75), 1e-3) ||
226 <<
"Eigenvalue: " << eig1[0];
227 EXPECT_TRUE(
essentially_equal(eig1[1], std::complex<double>(-0.5, 0.75), 1e-3) ||
229 <<
"Eigenvalue: " << eig1[1];
231 EXPECT_NEAR(T(2, 2), -1, 1e-10);
249 Eigen::MatrixXd T(6, 6);
250 T << -8.0000, 30.7409, -57.5046, -247.0842, -169.7203, 867.0578, 0, -4.0000, 7.0149, 30.1406, 20.7053, -105.7696, 0, 0, -2.0000, -7.5820, -5.1700,
251 26.3801, 0, 0, 0.5276, -2.0000, -1.3243, 6.2260, 0, 0, 0, 0, -0.5000, 3.4406, 0, 0, 0, 0, -0.2906, -0.5000;
253 Eigen::MatrixXd T_original = T;
255 Eigen::MatrixXd Q1 = Eigen::MatrixXd::Identity(6, 6);
257 EXPECT_EQ_MATRIX((Q1.transpose() * Q1).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
259 Eigen::VectorXcd eig1 = T.block(2, 2, 2, 2).eigenvalues();
261 <<
"Eigenvalue: " << eig1[0];
263 <<
"Eigenvalue: " << eig1[1];
265 Eigen::VectorXcd eig2 = T.block(4, 4, 2, 2).eigenvalues();
267 <<
"Eigenvalue: " << eig2[0];
269 <<
"Eigenvalue: " << eig2[1];
276 EXPECT_TRUE(is_standard_form(T.block(2, 2, 2, 2))) <<
"T:\n" << T.block(2, 2, 2, 2);
277 EXPECT_TRUE(is_standard_form(T.block(4, 4, 2, 2))) <<
"T:\n" << T.block(4, 4, 2, 2);
280 Eigen::MatrixXd Q2 = Eigen::MatrixXd::Identity(6, 6);
282 EXPECT_EQ_MATRIX((Q2.transpose() * Q2).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
283 EXPECT_NEAR(T(0, 0), -4, 1e-10);
284 EXPECT_NEAR(T(1, 1), -8, 1e-10);
287 Eigen::MatrixXd Q3 = Eigen::MatrixXd::Identity(6, 6);
290 EXPECT_EQ_MATRIX((Q3.transpose() * Q3).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
292 eig1 = T.block(1, 1, 2, 2).eigenvalues();
294 <<
"Eigenvalue: " << eig1[0];
296 <<
"Eigenvalue: " << eig1[1];
297 EXPECT_NEAR(T(3, 3), -8, 1e-10);
298 EXPECT_TRUE(is_standard_form(T.block(1, 1, 2, 2))) <<
"T:\n" << T.block(1, 1, 2, 2);
301 Eigen::MatrixXd Q4 = Eigen::MatrixXd::Identity(6, 6);
304 EXPECT_EQ_MATRIX((Q4.transpose() * Q4).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
306 eig1 = T.block(2, 2, 2, 2).eigenvalues();
308 <<
"Eigenvalue: " << eig1[0];
310 <<
"Eigenvalue: " << eig1[1];
311 EXPECT_NEAR(T(1, 1), -8, 1e-10);
312 EXPECT_TRUE(is_standard_form(T.block(2, 2, 2, 2))) <<
"T:\n" << T.block(1, 1, 2, 2);
315 Eigen::MatrixXd Tf = Q1 * Q2 * Q3 * Q4 * T * Q4.transpose() * Q3.transpose() * Q2.transpose() * Q1.transpose();
321 Eigen::MatrixXd T(6, 6);
322 T << -8.0000, 30.7409, -57.5046, -247.0842, -169.7203, 867.0578, 0, -4.0000, 7.0149, 30.1406, 20.7053, -105.7696, 0, 0, -2.0000, -7.5820, -5.1700,
323 26.3801, 0, 0, 0.5276, -2.0000, -1.3243, 6.2260, 0, 0, 0, 0, -0.5000, 3.4406, 0, 0, 0, 0, -0.2906, -0.5000;
325 Eigen::MatrixXd T_original = T;
327 Eigen::MatrixXd Q1 = Eigen::MatrixXd::Identity(6, 6);
329 EXPECT_EQ_MATRIX((Q1.transpose() * Q1).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
331 Eigen::VectorXcd eig1 = T.block(2, 2, 2, 2).eigenvalues();
333 <<
"Eigenvalue: " << eig1[0];
335 <<
"Eigenvalue: " << eig1[1];
337 Eigen::VectorXcd eig2 = T.block(4, 4, 2, 2).eigenvalues();
339 <<
"Eigenvalue: " << eig2[0];
341 <<
"Eigenvalue: " << eig2[1];
344 Eigen::MatrixXd Q2 = Eigen::MatrixXd::Identity(6, 6);
346 EXPECT_EQ_MATRIX((Q2.transpose() * Q2).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
347 EXPECT_NEAR(T(0, 0), -4, 1e-10);
348 EXPECT_NEAR(T(1, 1), -8, 1e-10);
351 Eigen::MatrixXd Q3 = Eigen::MatrixXd::Identity(6, 6);
354 EXPECT_EQ_MATRIX((Q3.transpose() * Q3).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
356 eig1 = T.block(1, 1, 2, 2).eigenvalues();
358 <<
"Eigenvalue: " << eig1[0];
360 <<
"Eigenvalue: " << eig1[1];
361 EXPECT_NEAR(T(3, 3), -8, 1e-10);
364 Eigen::MatrixXd Q4 = Eigen::MatrixXd::Identity(6, 6);
367 EXPECT_EQ_MATRIX((Q4.transpose() * Q4).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
369 eig1 = T.block(2, 2, 2, 2).eigenvalues();
371 <<
"Eigenvalue: " << eig1[0];
373 <<
"Eigenvalue: " << eig1[1];
374 EXPECT_NEAR(T(1, 1), -8, 1e-10);
377 Eigen::MatrixXd Tf = Q1 * Q2 * Q3 * Q4 * T * Q4.transpose() * Q3.transpose() * Q2.transpose() * Q1.transpose();
386 Eigen::Matrix2d Q = Eigen::Matrix2d::Identity();
388 int subspace_dim = 0;
393 EXPECT_NEAR(T(0, 0), -4, 1e-10);
394 EXPECT_NEAR(T(1, 1), 8, 1e-10);
396 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::Matrix2d::Identity(), 1e-5);
397 EXPECT_EQ(subspace_dim, 1);
403 EXPECT_NEAR(T(0, 0), 8, 1e-10);
404 EXPECT_NEAR(T(1, 1), -4, 1e-10);
405 EXPECT_EQ(subspace_dim, -10);
410 EXPECT_NEAR(T(0, 0), 8, 1e-10);
411 EXPECT_NEAR(T(1, 1), -4, 1e-10);
416 EXPECT_NEAR(T(0, 0), 8, 1e-10);
417 EXPECT_NEAR(T(1, 1), -4, 1e-10);
422 Eigen::MatrixXd T(6, 6);
423 T << 6, -28.9828, 114.6002, 334.8702, 642.8458, 858.6334, 0, 5, -18.9797, -55.4600, -106.4651, -142.2044, 0, 0, 4, 10.9599, 21.0520, 28.0873, 0,
424 0, 0, -3, -5.1069, -6.8522, 0, 0, 0, 0, -2, -2.3436, 0, 0, 0, 0, 0, -1;
426 Eigen::MatrixXd Q = Eigen::MatrixXd::Identity(6, 6);
428 int subspace_dim = 0;
433 EXPECT_LT(T(0, 0), -1);
434 EXPECT_LT(T(1, 1), -1);
435 EXPECT_GE(T(2, 2), -1);
436 EXPECT_GE(T(3, 3), -1);
437 EXPECT_GE(T(5, 5), -1);
438 EXPECT_GE(T(5, 5), -1);
439 EXPECT_EQ(subspace_dim, 2);
442 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::MatrixXd::Identity(6, 6), 1e-5);
455 T << 2, -5.6559, 4.9142, -29.6122, 0.3978, 2, -1.4659, 8.9097, 0, 0, -1, 5.0024, 0, 0, -0.7996, -1;
457 Eigen::Matrix4d Q = Eigen::Matrix4d::Identity();
459 int subspace_dim = 0;
464 double real1 = T.topLeftCorner(2, 2).eigenvalues()[0].real();
465 double real2 = T.bottomRightCorner(2, 2).eigenvalues()[0].real();
470 EXPECT_EQ(subspace_dim, 2);
473 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::Matrix4d::Identity(), 1e-5);
485 T << 2, -5.7972, 3.4035, 0.3881, 2, -0.8847, 0, 0, -1;
487 Eigen::Matrix3d Q = Eigen::Matrix3d::Identity();
489 int subspace_dim = 0;
494 double real1 = T.bottomRightCorner(2, 2).eigenvalues()[0].real();
496 EXPECT_NEAR(T(0, 0), -1, 1e-10);
497 EXPECT_EQ(subspace_dim, 1);
500 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::Matrix3d::Identity(), 1e-5);
506 real1 = T.topLeftCorner(2, 2).eigenvalues()[0].real();
509 EXPECT_NEAR(T(2, 2), -1, 1e-10);
510 EXPECT_EQ(subspace_dim, 2);
513 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::Matrix3d::Identity(), 1e-5);
530 Eigen::MatrixXd T(8, 8);
531 T << 4, 6.8834, -22.8817, -68.4663, -60.1433, -350.9628, 643.1324, 989.0186, 0, 2.0000, -5.6484, -16.7104, -14.6790, -85.6590, 156.9690, 241.3865,
532 0, 0.3983, 2.0000, 5.0269, 4.4159, 25.7680, -47.2178, -72.6187, 0, 0, 0, -3.0000, -2.3424, -13.6697, 25.0501, 38.5195, 0, 0, 0, 0, -1.0000,
533 -4.8323, 8.5495, 13.1573, 0, 0, 0, 0, 0.8278, -1.0000, 1.4519, 2.2920, 0, 0, 0, 0, 0, 0, -2.0000, -2.5705, 0, 0, 0, 0, 0, 0, 0, -1.0000;
535 Eigen::MatrixXd Q = Eigen::MatrixXd::Identity(8, 8);
537 int subspace_dim = 0;
544 while (
row < T.rows())
548 if (
row + 1 >= T.rows())
558 EXPECT_LT(T(
row,
row), 0);
560 EXPECT_GE(T(
row,
row), 0);
564 double real = T.block(
row,
row, 2, 2).eigenvalues()[0].real();
573 EXPECT_EQ(subspace_dim, 5);
576 EXPECT_EQ_MATRIX((Q.transpose() * Q).eval(), Eigen::MatrixXd::Identity(8, 8), 1e-5);