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