schur.js 1.8 KB

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