Факторизация Холесского
возвращает верхнюю треугольную матрицу 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'. Эти необязательные аргументы могут появиться в любом порядке.
Вычислите Факторизацию Холесского Гильбертовой матрицы 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. Если матрица не распознана как Hermitian positive definite, то этот синтаксис присваивает пустой символьный объект 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.