Факторизация QR
возвращает R-часть QR-разложения R = qr(A)A = Q*R. Здесь, A - матрица m-на-n, R является m-на-n верхней треугольной матрицей, и Q является m-по-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') возвращает разложение «economy size». Если A является mоколо-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около-4 Матрица теста собственных значений Уилкинсона.
Создать 4около-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около-3 Матрица Паскаля.
Создать 3около-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около-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около-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 выдает ошибку.
Матричные вычисления, включающие множество символьных переменных, могут быть медленными. Чтобы увеличить вычислительную скорость, уменьшите число символьных переменных, подставив заданные значения для некоторых переменных.