Advertisement
Guest User

Untitled

a guest
Jun 29th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. template<typename Hessenberg, typename Scalar, typename Destination>
  2. void shifted_hessenberg_solve(const Hessenberg& hess, const Scalar& shift, Destination& result)
  3. {
  4. JacobiRotation<typename Hessenberg::Scalar> rotation;
  5. typename Hessenberg::PlainObject solver = hess;
  6.  
  7. solver.diagonal().array() += shift;
  8.  
  9. for (typename Hessenberg::Index k = 1; k < hess.cols(); ++k) {
  10. rotation.makeGivens(solver.coeff(k-1, k-1), solver.coeff(k, k-1), &solver.coeffRef(k-1, k-1));
  11. solver.rightCols(hess.cols() - k).applyOnTheLeft(k-1, k, rotation);
  12. result.applyOnTheLeft(k-1, k, rotation);
  13. }
  14.  
  15. solver.template triangularView<Upper>().solveInPlace(result);
  16. }
  17.  
  18. template<typename Hessenberg, typename Triangular>
  19. void hessenberg_solve_triangular(const Hessenberg& hess, Triangular& result)
  20. {
  21. JacobiRotation<typename Hessenberg::Scalar> rotation;
  22. typename Hessenberg::PlainObject solver = hess;
  23.  
  24. for (typename Hessenberg::Index k = 1; k < hess.cols(); ++k) {
  25. rotation.makeGivens(solver.coeff(k-1, k-1), solver.coeff(k, k-1), &solver.coeffRef(k-1, k-1));
  26. solver.rightCols(hess.cols() - k).applyOnTheLeft(k-1, k, rotation);
  27. result.rightCols(hess.cols() - k + 1).applyOnTheLeft(k-1, k, rotation);
  28. }
  29.  
  30. solver.template triangularView<Upper>().solveInPlace(result);
  31. }
  32.  
  33. template<typename Hessenberg, typename UnitVector>
  34. typename UnitVector::Scalar hessenberg_update_eigenvalue(const Hessenberg& matrix, const UnitVector& eigenvector)
  35. {
  36. typename UnitVector::PlainObject vector = eigenvector;
  37. hessenberg_matrix_vector(matrix, vector);
  38. return eigenvector.dot(vector);
  39. }
  40.  
  41. template<typename Hessenberg, typename UnitVector>
  42. typename UnitVector::Scalar rayleigh_quotient_iteration(const Hessenberg& matrix, UnitVector& vector)
  43. {
  44. typedef typename UnitVector::Scalar Scalar;
  45. Scalar eigenvalue = hessenberg_update_eigenvalue(matrix, vector);
  46.  
  47. for (int k = 0; k < 40; ++k) {
  48. shifted_hessenberg_solve(matrix.template cast<Scalar>(), -eigenvalue, vector);
  49. vector.normalize();
  50.  
  51. Scalar candidate = hessenberg_update_eigenvalue(matrix, vector);
  52.  
  53. if (isApprox(eigenvalue, candidate))
  54. return candidate;
  55.  
  56. eigenvalue = candidate;
  57. }
  58.  
  59. return eigenvalue;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement