void testGonioFunctions(const MatrixType& A) { typedef typename MatrixType::Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar; typedef std::complex<RealScalar> ComplexScalar; typedef Matrix<ComplexScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime, MatrixType::Options> ComplexMatrix; ComplexScalar imagUnit(0,1); ComplexScalar two(2,0); ComplexMatrix Ac = A.template cast<ComplexScalar>(); ComplexMatrix exp_iA = (imagUnit * Ac).exp(); ComplexMatrix exp_miA = (-imagUnit * Ac).exp(); ComplexMatrix sinAc = A.sin().template cast<ComplexScalar>(); VERIFY_IS_APPROX_ABS(sinAc, (exp_iA - exp_miA) / (two*imagUnit)); ComplexMatrix cosAc = A.cos().template cast<ComplexScalar>(); VERIFY_IS_APPROX_ABS(cosAc, (exp_iA + exp_miA) / 2); }
void test2dHyperbolicRotation(double tol) { Matrix<std::complex<T>,2,2> A, B, C; std::complex<T> imagUnit(0,1); T angle, ch, sh; for (int i=0; i<=20; i++) { angle = static_cast<T>((i-10) / 2.0); ch = std::cosh(angle); sh = std::sinh(angle); A << 0, angle*imagUnit, -angle*imagUnit, 0; B << ch, sh*imagUnit, -sh*imagUnit, ch; C = A.matrixFunction(expfn); std::cout << "test2dHyperbolicRotation: i = " << i << " error funm = " << relerr(C, B); VERIFY(C.isApprox(B, static_cast<T>(tol))); C = A.exp(); std::cout << " error expm = " << relerr(C, B) << "\n"; VERIFY(C.isApprox(B, static_cast<T>(tol))); } }