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 выдает ошибку.
Матричные вычисления, включающие много символьных переменных, могут быть медленными. Чтобы увеличить вычислительную скорость, сократите количество символьных переменных путем заменения данными значениями некоторые переменные.