Холеская факторизация
возвращает верхнюю треугольную матрицу 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.