QR-факторизация
возвращает R-часть QR-разложения R
= qr(A
)A = Q*R
. Здесь, A
является m -by- n матрицей, R
является m -by n верхней треугольной матрицей и Q
является m -by m унитарной матрицей.
[
возвращает верхнюю треугольную матрицу Q
,R
,P
]
= qr(A
)R
, унитарная матрица Q
и матрицу сочетаний P
, таким образом A*P = Q*R
. Если все элементы A
можно аппроксимировать числами с плавающей запятой, тогда этот синтаксис выбирает сочетание столбца P
так что abs(diag(R))
уменьшается. В противном случае возвращается P = eye(n)
.
[
возвращает верхнюю треугольную матрицу C
,R
,P
]
= qr(A
,B
)R
, матрица C
, таким образом C = Q'*B
и матрицу сочетаний P
, таким образом A*P = Q*R
. Если все элементы A
можно аппроксимировать числами с плавающей запятой, тогда этот синтаксис выбирает матрицу сочетания P
так что abs(diag(R))
уменьшается. В противном случае возвращается P = eye(n)
. Здесь, A
и B
должно иметь одинаковое число строк.
C
, R
, и P
представляют решение матричного уравнения A*X = B
как X = P*(R\C)
.
___ = qr(___,'econ')
возвращает разложение «economic size». Если A
является m
-by- n
матрица с m > n
, затем qr
вычисляет только первое n
столбцы Q
и первый n
строки R
. Для m <= n
, синтаксисы с 'econ'
эквивалентны соответствующим синтаксисам без 'econ'
.
Когда вы используете 'econ'
, qr
всегда возвращает сочетание информацию как вектор p
.
Можно использовать 0
вместо 'econ'
. Для примера, [Q,R] = qr(A,0)
эквивалентно [Q,R] = qr(A,'econ')
.
___ = qr(___,'real')
принимает, что входные параметры и промежуточные результаты являются вещественными, и, следовательно, подавляет вызовы к abs
и conj
. Когда вы используете этот флаг, qr
принимает, что все символьные переменные представляют вещественные числа. При использовании этого флага убедитесь, что все числовые аргументы являются вещественными числами.
Использование 'real'
чтобы избежать сложных сопряженных в результате.
Вычислите R-часть QR-разложения 4
-by- 4
Матрица теста собственного значения Уилкинсона.
Создайте 4
-by- 4
Матрица теста собственного значения Уилкинсона:
A = sym(wilkinson(4))
A = [ 3/2, 1, 0, 0] [ 1, 1/2, 1, 0] [ 0, 1, 1/2, 1] [ 0, 0, 1, 3/2]
Используйте синтаксис с одним выходным аргументом, чтобы вернуть R-часть QR-разложения, не возвращая Q-часть:
R = qr(A)
R = [ 13^(1/2)/2, (4*13^(1/2))/13, (2*13^(1/2))/13, 0] [ 0, (13^(1/2)*53^(1/2))/26, (10*13^(1/2)*53^(1/2))/689, (2*13^(1/2)*53^(1/2))/53] [ 0, 0, (53^(1/2)*381^(1/2))/106, (172*53^(1/2)*381^(1/2))/20193] [ 0, 0, 0, (35*381^(1/2))/762]
Вычислите QR-разложение 3
-by- 3
Паскальская матрица.
Создайте 3
-by- 3
Матрица Паскаля:
A = sym(pascal(3))
A = [ 1, 1, 1] [ 1, 2, 3] [ 1, 3, 6]
Найдите Q
и R
матрицы, представляющие QR-разложение A
:
[Q,R] = qr(A)
Q = [ 3^(1/2)/3, -2^(1/2)/2, 6^(1/2)/6] [ 3^(1/2)/3, 0, -6^(1/2)/3] [ 3^(1/2)/3, 2^(1/2)/2, 6^(1/2)/6] R = [ 3^(1/2), 2*3^(1/2), (10*3^(1/2))/3] [ 0, 2^(1/2), (5*2^(1/2))/2] [ 0, 0, 6^(1/2)/6]
Проверьте, что A = Q*R
использование isAlways
:
isAlways(A == Q*R)
ans = 3×3 logical array 1 1 1 1 1 1 1 1 1
Использование сочетаний помогает увеличить числовую стабильность QR-факторизации для матриц с плавающей точкой. qr
функция возвращает информацию о сочетании либо в виде матрицы, либо в виде вектора.
Установите количество значащих десятичных цифр, используемых для арифметики переменной точности, равным 10. Аппроксимация 3
-by- 3
символьная гильбертова матрица по числам с плавающей запятой:
previoussetting = digits(10); A = vpa(hilb(3))
A = [ 1.0, 0.5, 0.3333333333] [ 0.5, 0.3333333333, 0.25] [ 0.3333333333, 0.25, 0.2]
Во-первых, вычислите QR-разложение A
без сочетаний:
[Q,R] = qr(A)
Q = [ 0.8571428571, -0.5016049166, 0.1170411472] [ 0.4285714286, 0.5684855721, -0.7022468832] [ 0.2857142857, 0.6520863915, 0.7022468832] R = [ 1.166666667, 0.6428571429, 0.45] [ 0, 0.1017143303, 0.1053370325] [ 0, 0, 0.003901371573]
Вычислите различие между A
и Q*R
. Вычисляемая Q
и R
матрицы не удовлетворяют строго равенству A*P = Q*R
из-за ошибок округления.
A - Q*R
ans = [ -1.387778781e-16, -3.989863995e-16, -2.064320936e-16] [ -3.469446952e-18, -8.847089727e-17, -1.084202172e-16] [ -2.602085214e-18, -6.591949209e-17, -6.678685383e-17]
Чтобы увеличить числовую стабильность QR-разложения, используйте сочетания путем определения синтаксиса с тремя выходными аргументами. Для матриц, которые не содержат символьных переменных, выражений или функций, этот синтаксис запускает поворот, так что abs(diag(R))
в возвращенной матрице R
уменьшается.
[Q,R,P] = qr(A)
Q = [ 0.8571428571, -0.4969293466, -0.1355261854] [ 0.4285714286, 0.5421047417, 0.7228063223] [ 0.2857142857, 0.6776309272, -0.6776309272] R = [ 1.166666667, 0.45, 0.6428571429] [ 0, 0.1054092553, 0.1016446391] [ 0, 0, 0.003764616262] P = 1 0 0 0 0 1 0 1 0
Проверяйте равенство A*P = Q*R
снова. QR-факторизация с сочетаниями результатов при меньших ошибках округления.
A*P - Q*R
ans = [ -3.469446952e-18, -4.33680869e-18, -6.938893904e-18] [ 0, -8.67361738e-19, -1.734723476e-18] [ 0, -4.33680869e-19, -1.734723476e-18]
Теперь верните информацию о сочетании как вектор при помощи 'vector'
аргумент:
[Q,R,p] = qr(A,'vector')
Q = [ 0.8571428571, -0.4969293466, -0.1355261854] [ 0.4285714286, 0.5421047417, 0.7228063223] [ 0.2857142857, 0.6776309272, -0.6776309272] R = [ 1.166666667, 0.45, 0.6428571429] [ 0, 0.1054092553, 0.1016446391] [ 0, 0, 0.003764616262] p = 1 3 2
Проверьте, что A(:,p) = Q*R
:
A(:,p) - Q*R
ans = [ -3.469446952e-18, -4.33680869e-18, -6.938893904e-18] [ 0, -8.67361738e-19, -1.734723476e-18] [ 0, -4.33680869e-19, -1.734723476e-18]
Точные символические расчеты позволяют избежать ошибок округления:
A = sym(hilb(3)); [Q,R] = qr(A); A - Q*R
ans = [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0]
Восстановите количество значащих десятичных цифр до значения по умолчанию:
digits(previoussetting)
Вы можете использовать qr
для решения систем уравнений в матричной форме.
Предположим, вам нужно решить систему уравнений A*X = b
, где A
и b
являются следующей матрицей и вектором:
A = sym(invhilb(5)) b = sym([1:5]')
A = [ 25, -300, 1050, -1400, 630] [ -300, 4800, -18900, 26880, -12600] [ 1050, -18900, 79380, -117600, 56700] [ -1400, 26880, -117600, 179200, -88200] [ 630, -12600, 56700, -88200, 44100] b = 1 2 3 4 5
Использовать qr
для поиска матриц C
и R
, таким образом C = Q'*B
и A = Q*R
:
[C,R] = qr(A,b);
Вычислите решение X
:
X = R\C
X = 5 71/20 197/70 657/280 1271/630
Проверьте, что X
является решением системы A*X = b
использование isAlways
:
isAlways(A*X == b)
ans = 5×1 logical array 1 1 1 1 1
При решении систем уравнений, которые содержат числа с плавающей запятой, используйте QR-разложение с матрицей или вектором сочетания.
Предположим, вам нужно решить систему уравнений A*X = b
, где A
и b
являются следующей матрицей и вектором:
previoussetting = digits(10); A = vpa([2 -3 -1; 1 1 -1; 0 1 -1]); b = vpa([2; 0; -1]);
Использовать qr
для поиска матриц C
и R
, таким образом C = Q'*B
и A = Q*R
:
[C,R,P] = qr(A,b)
C = -2.110579412 -0.2132007164 0.7071067812 R = [ 3.31662479, 0.3015113446, -1.507556723] [ 0, 1.705605731, -1.492405014] [ 0, 0, 0.7071067812] P = 0 0 1 1 0 0 0 1 0
Вычислите решение X
:
X = P*(R\C)
X = 1.0 -0.25 0.75
Другой способ - вернуть информацию о сочетании как вектор:
[C,R,p] = qr(A,b,'vector')
C = -2.110579412 -0.2132007164 0.7071067812 R = [ 3.31662479, 0.3015113446, -1.507556723] [ 0, 1.705605731, -1.492405014] [ 0, 0, 0.7071067812] p = 2 3 1
В этом случае вычислите решение X
следующим образом:
X(p,:) = R\C
X = 1.0 -0.25 0.75
Восстановите количество значащих десятичных цифр до значения по умолчанию:
digits(previoussetting)
Использование 'econ'
вычислить «экономичное» QR-разложение.
Создайте матрицу, которая состоит из первых двух столбцов 4
-by- 4
Матрица Паскаля:
A = sym(pascal(4)); A = A(:,1:2)
A = [ 1, 1] [ 1, 2] [ 1, 3] [ 1, 4]
Вычислите QR-разложение для этой матрицы:
[Q,R] = qr(A)
Q = [ 1/2, -(3*5^(1/2))/10, (3^(1/2)*10^(1/2))/10, 0] [ 1/2, -5^(1/2)/10, -(2*3^(1/2)*10^(1/2))/15, 6^(1/2)/6] [ 1/2, 5^(1/2)/10, -(3^(1/2)*10^(1/2))/30, -6^(1/2)/3] [ 1/2, (3*5^(1/2))/10, (3^(1/2)*10^(1/2))/15, 6^(1/2)/6] R = [ 2, 5] [ 0, 5^(1/2)] [ 0, 0] [ 0, 0]
Теперь вычислите QR-разложение «размера экономики» для этой матрицы. Поскольку количество строк превышает количество столбцов, qr
вычисляет только первое 2
столбцы Q
и первый 2
строки R
.
[Q,R] = qr(A,'econ')
Q = [ 1/2, -(3*5^(1/2))/10] [ 1/2, -5^(1/2)/10] [ 1/2, 5^(1/2)/10] [ 1/2, (3*5^(1/2))/10] R = [ 2, 5] [ 0, 5^(1/2)]
Используйте 'real'
флаг, чтобы избежать сложных сопряженных в результате.
Создайте матрицу, одним из элементов которой является переменная:
syms x A = [1 2; 3 x]
A = [ 1, 2] [ 3, x]
Вычислите QR-факторизацию этой матрицы. По умолчанию, qr
принимает, что x
представляет комплексное число, и, следовательно, результат содержит выражения с abs
функция.
[Q,R] = qr(A)
Q = [ 10^(1/2)/10, -((3*x)/10 - 9/5)/(abs(x/10 - 3/5)^2... + abs((3*x)/10 - 9/5)^2)^(1/2)] [ (3*10^(1/2))/10, (x/10 - 3/5)/(abs(x/10 - 3/5)^2... + abs((3*x)/10 - 9/5)^2)^(1/2)] R = [ 10^(1/2), (10^(1/2)*(3*x + 2))/10] [ 0, (abs(x/10 - 3/5)^2 + abs((3*x)/10 - 9/5)^2)^(1/2)]
Когда вы используете 'real'
, qr
принимает, что все символьные переменные представляют вещественные числа и могут возвращать более короткие результаты:
[Q,R] = qr(A,'real')
Q = [ 10^(1/2)/10, -((3*x)/10 - 9/5)/(x^2/10 - (6*x)/5... + 18/5)^(1/2)] [ (3*10^(1/2))/10, (x/10 - 3/5)/(x^2/10 - (6*x)/5... + 18/5)^(1/2)] R = [ 10^(1/2), (10^(1/2)*(3*x + 2))/10] [ 0, (x^2/10 - (6*x)/5 + 18/5)^(1/2)]
Верхняя треугольная матрица R
удовлетворяет следующему условию: R = chol(A'*A)
.
Аргументы 'econ'
и 0
влияют только на форму возвращенных матриц.
Вызывающие qr
для числовых матриц, которые не являются символьными объектами (не созданы sym
, syms
, или vpa
) вызывает MATLAB® qr
функция.
Если вы используете 'matrix'
вместо 'vector'
, затем qr
возвращает матрицы сочетаний, как это происходит по умолчанию. Если вы используете 'matrix'
и 'econ'
, затем qr
выдает ошибку.
Матричные расчеты с участием многих символьных переменных могут быть медленными. Чтобы увеличить вычислительную скорость, уменьшите количество символьных переменных, подставив заданные значения для некоторых переменных.