Факторизация Холесского
T = chol(A)[T,p] =
chol(A)[T,p,S]
= chol(A)[T,p,s]
= chol(A,'vector')___ = chol(A,'lower')___ = chol(A,'nocheck')___ = chol(A,'real')___ = chol(A,'lower','nocheck','real')[T,p,s]
= chol(A,'lower','vector','nocheck','real') возвращает верхнюю треугольную матрицу T = chol(A)T, такой что T'*T = A. A должен быть Эрмитовой положительной определенной матрицей. В противном случае этот синтаксис выдает ошибку.
[ вычисляет факторизацию Холесского T,p] =
chol(A)A. Этот синтаксис не делает ошибки, если A не является Эрмитовой положительной определенной матрицей. Если A является Эрмитовой положительной определенной матрицей, то p 0. В противном случае T является sym([]), и p является положительным целым числом (обычно, p = 1).
___ = chol( пропуски, проверяющие, является ли матричный A,'nocheck')A Эрмитовым положительный определенный. 'nocheck' позволяет вам вычислить факторизацию Холесского матрицы, которая содержит символьные параметры, не устанавливая дополнительные предположения на тех параметрах.
___ = chol( вычисляет факторизацию Холесского A,'real')A с помощью арифметики действительных чисел. В этом случае chol вычисляет симметричную факторизацию A = T.'*T вместо Эрмитовой факторизации A = T'*T. Этот подход основан на том, что, если A действителен и симметричен, то T'*T = T.'*T. Используйте 'real', чтобы избежать сопряженных комплексных чисел в результате.
___ = chol( вычисляет факторизацию Холесского A,'lower','nocheck','real')A с одним или несколькими из этих дополнительных аргументов: 'lower', 'nocheck' и 'real'. Эти дополнительные аргументы могут появиться в любом порядке.
[ вычисляет факторизацию Холесского T,p,s]
= chol(A,'lower','vector','nocheck','real')A и возвращает информацию о перестановке как векторный s. Можно использовать один или несколько из этих дополнительных аргументов: 'lower', 'nocheck' и 'real'. Эти дополнительные аргументы могут появиться в любом порядке.
Вычислите факторизацию Холесского 3х3 Гильбертовой матрицы. Поскольку эти числа не являются символьными объектами, вы получаете результаты с плавающей точкой.
chol(hilb(3))
ans =
1.0000 0.5000 0.3333
0 0.2887 0.2887
0 0 0.0745Теперь преобразуйте эту матрицу в символьный объект и вычислите факторизацию Холесского:
chol(sym(hilb(3)))
ans = [ 1, 1/2, 1/3] [ 0, 3^(1/2)/6, 3^(1/2)/6] [ 0, 0, 5^(1/2)/30]
Вычислите факторизацию Холесского 3х3 матрицы Паскаля возврат нижней треугольной матрицы в результате:
chol(sym(pascal(3)), 'lower')
ans = [ 1, 0, 0] [ 1, 1, 0] [ 1, 2, 1]
Попытайтесь вычислить факторизацию Холесского этой матрицы. Поскольку эта матрица не Эрмитова положительный определенный, chol, используемый без выходных аргументов или с одним выходным аргументом, выдает ошибку:
A = sym([1 1 1; 1 2 3; 1 3 5]);
T = chol(A)
Error using sym/chol (line 132) Cannot prove that input matrix is Hermitian positive definite. Define a Hermitian positive definite matrix by setting appropriate assumptions on matrix components, or use 'nocheck' to skip checking whether the matrix is Hermitian positive definite.
Чтобы подавить ошибку, используйте два выходных аргумента, T и p. Если матрица не распознана Эрмитовой положительный определенный, то этот синтаксис присваивает пустой символьный объект T и значению 1 к p:
[T,p] = chol(A)
T =
[ empty sym ]
p =
1Для Эрмитовой положительной определенной матрицы p 0:
[T,p] = chol(sym(pascal(3)))
T =
[ 1, 1, 1]
[ 0, 1, 2]
[ 0, 0, 1]
p =
0Также 'nocheck' позволяет вам пропустить проверку, является ли A Эрмитовой положительной определенной матрицей. Таким образом этот флаг позволяет вам вычислить факторизацию Холесского символьной матрицы, не устанавливая дополнительные предположения на ее компонентах сделать его Эрмитовым положительный определенный:
syms a A = [a 0; 0 a]; chol(A,'nocheck')
ans = [ a^(1/2), 0] [ 0, a^(1/2)]
Если вы используете 'nocheck' для вычисления факторизации Холесского матрицы, которая не является Эрмитова положительный определенный, chol может возвратить матричный T, для которого идентичность T'*T = A не содержит. Чтобы заставить isAlways возвратить логический 0 (false) для неразрешимых условий, установите Unknown на false.
T = chol(sym([1 1; 2 1]), 'nocheck')
T = [ 1, 2] [ 0, 3^(1/2)*1i]
isAlways(A == T'*T,'Unknown','false')
ans =
2×2 logical array
0 0
0 0Вычислите факторизацию Холесского 3х3 обратной Гильбертовой матрицы, возвращающей матрицу перестановок:
A = sym(invhilb(3)); [T, p, S] = chol(A)
T =
[ 3, -12, 10]
[ 0, 4*3^(1/2), -5*3^(1/2)]
[ 0, 0, 5^(1/2)]
p =
0
S =
1 0 0
0 1 0
0 0 1Вычислите факторизацию Холесского 3х3 обратной Гильбертовой матрицы, возвращающей информацию о перестановке как вектор:
A = sym(invhilb(3)); [T, p, S] = chol(A, 'vector')
T =
[ 3, -12, 10]
[ 0, 4*3^(1/2), -5*3^(1/2)]
[ 0, 0, 5^(1/2)]
p =
0
S =
1 2 3Вычислите факторизацию Холесского матричного A, содержащего символьные параметры. Без дополнительных предположений на параметре a эта матрица не является Эрмитовой. Чтобы заставить isAlways возвратить логический 0 (false) для неразрешимых условий, установите Unknown на false.
syms a A = [a 0; 0 a]; isAlways(A == A','Unknown','false')
ans =
2×2 logical array
0 1
1 0Путем установки предположений на a и b, можно задать A, чтобы быть Эрмитовы положительный определенный. Поэтому можно вычислить факторизацию Холесского A:
assume(a > 0) chol(A)
ans = [ a^(1/2), 0] [ 0, a^(1/2)]
Для дальнейших вычислений удалите предположения на a путем воссоздания его с помощью syms:
syms a
Вычислите факторизацию Холесского этой матрицы. Чтобы пропустить проверку, является ли это Эрмитовым положительный определенный, используйте 'nocheck'. По умолчанию chol вычисляет Эрмитовую факторизацию A = T'*T. Таким образом результат содержит сопряженные комплексные числа.
syms a b A = [a b; b a]; T = chol(A, 'nocheck')
T = [ a^(1/2), conj(b)/conj(a^(1/2))] [ 0, (a*abs(a) - abs(b)^2)^(1/2)/abs(a)^(1/2)]
Чтобы избежать сопряженных комплексных чисел в результате, используйте 'real':
T = chol(A, 'nocheck', 'real')
T = [ a^(1/2), b/a^(1/2)] [ 0, ((a^2 - b^2)/a)^(1/2)]
Когда вы используете этот флаг, chol вычисляет симметричную факторизацию A = T.'*T вместо Эрмитовой факторизации A = T'*T. Чтобы заставить isAlways возвратить логический 0 (false) для неразрешимых условий, установите Unknown на false.
isAlways(A == T.'*T)
ans =
2×2 logical array
1 1
1 1isAlways(A == T'*T,'Unknown','false')
ans =
2×2 logical array
0 0
0 0Матричные вычисления, включающие много символьных переменных, могут быть медленными. Чтобы увеличить вычислительную скорость, сократите количество символьных переменных путем заменения данными значениями некоторые переменные.
Вызов chol для числовых аргументов, которые не являются символьными объектами, вызывает
функцию MATLAB® chol.
Если вы будете использовать 'nocheck', то тождества T'*T = A (для верхней треугольной матрицы T) и T*T' = A (для нижнего треугольного матричного T), как гарантируют, не будут содержать.
Если вы будете использовать 'real', то тождества T'*T = A (для верхней треугольной матрицы T) и T*T' = A (для нижнего треугольного матричного T), как только гарантируют, будут содержать для действительного симметричного положительного определенного A.
Чтобы использовать 'vector', необходимо задать три выходных аргумента. Другие флаги не требуют конкретного количества выходных аргументов.
Если вы используете 'matrix' вместо 'vector', то chol возвращает матрицы перестановки, как это делает по умолчанию.
Если вы используете 'upper' вместо 'lower', то chol возвращает верхнюю треугольную матрицу, как это делает по умолчанию.
Если A не является Эрмитовой положительной определенной матрицей, то синтаксисы, содержащие аргумент p обычно, возвращают p = 1 и пустой символьный объект T.
Чтобы проверять, является ли матрица Эрмитовой, используйте оператор ' (или его функциональная форма ctranspose). Матричный A является Эрмитовым, если и только если A'= A, где A' является сопряженным транспонированием A.