QR-факторизация
R = qr(A)
[Q,R] =
qr(A)
[Q,R,P]
= qr(A)
[C,R] =
qr(A,B)
[C,R,P]
= qr(A,B)
[Q,R,p]
= qr(A,'vector')
[C,R,p]
= qr(A,B,'vector')
___ = qr(___,'econ')
___ = qr(___,'real')
возвращает часть 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')
возвращает "разложение" размера экономики. Если 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)]
Верхняя треугольная матрица A
удовлетворяет следующее условие: R = chol(A'*A)
.
Аргументы 'econ'
и 0
только влияют на форму возвращенных матриц.
Вызывание qr
для числовых матриц, которые не являются символьными объектами (не созданный sym
, syms
или vpa
) вызывает функцию MATLAB® qr
.
Если вы используете 'matrix'
вместо 'vector'
, то qr
возвращает матрицы перестановки, как это делает по умолчанию. Если вы используете 'matrix'
и 'econ'
, то qr
выдает ошибку.
Матричные вычисления, включающие много символьных переменных, могут быть медленными. Чтобы увеличить вычислительную скорость, сократите количество символьных переменных путем заменения данными значениями некоторые переменные.