schur.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { factory } from '../../../utils/factory.js';
  2. var name = 'schur';
  3. var dependencies = ['typed', 'matrix', 'identity', 'multiply', 'qr', 'norm', 'subtract'];
  4. export var createSchur = /* #__PURE__ */factory(name, dependencies, _ref => {
  5. var {
  6. typed,
  7. matrix,
  8. identity,
  9. multiply,
  10. qr,
  11. norm,
  12. subtract
  13. } = _ref;
  14. /**
  15. *
  16. * Performs a real Schur decomposition of the real matrix A = UTU' where U is orthogonal
  17. * and T is upper quasi-triangular.
  18. * https://en.wikipedia.org/wiki/Schur_decomposition
  19. *
  20. * Syntax:
  21. *
  22. * math.schur(A)
  23. *
  24. * Examples:
  25. *
  26. * const A = [[1, 0], [-4, 3]]
  27. * math.schur(A) // returns {T: [[3, 4], [0, 1]], R: [[0, 1], [-1, 0]]}
  28. *
  29. * See also:
  30. *
  31. * sylvester, lyap, qr
  32. *
  33. * @param {Array | Matrix} A Matrix A
  34. * @return {{U: Array | Matrix, T: Array | Matrix}} Object containing both matrix U and T of the Schur Decomposition A=UTU'
  35. */
  36. return typed(name, {
  37. Array: function Array(X) {
  38. var r = _schur(matrix(X));
  39. return {
  40. U: r.U.valueOf(),
  41. T: r.T.valueOf()
  42. };
  43. },
  44. Matrix: function Matrix(X) {
  45. return _schur(X);
  46. }
  47. });
  48. function _schur(X) {
  49. var n = X.size()[0];
  50. var A = X;
  51. var U = identity(n);
  52. var k = 0;
  53. var A0;
  54. do {
  55. A0 = A;
  56. var QR = qr(A);
  57. var Q = QR.Q;
  58. var R = QR.R;
  59. A = multiply(R, Q);
  60. U = multiply(U, Q);
  61. if (k++ > 100) {
  62. break;
  63. }
  64. } while (norm(subtract(A, A0)) > 1e-4);
  65. return {
  66. U,
  67. T: A
  68. };
  69. }
  70. });