Одной из самых важных проблем в техническом вычислении является решение систем одновременных линейных уравнений.
В матричном обозначении общая проблема принимает следующую форму: Учитывая две матрицы A и b, действительно там существует уникальный матричный x, так, чтобы A x = b или x A = b?
Это поучительно, чтобы рассмотреть пример 1 на 1. Например, делает уравнение
7x = 21
имеет уникальное решение?
Ответ, конечно, является да. Уравнение имеет уникальное решение x = 3. Решение легко получено делением:
x = 21/7 = 3.
Решение обычно не получается путем вычисления инверсии 7, который является 7–1 = 0.142857..., и затем умножение 7–1 21. Это было бы, больше работают и, если 7–1 представлен конечному числу цифр, менее точных. Подобные факторы применяются к наборам линейных уравнений с больше чем одним неизвестным; MATLAB® решает такие уравнения, не вычисляя инверсию матрицы.
Несмотря на то, что это не стандартное математическое обозначение, MATLAB использует терминологию деления, знакомую в скалярном случае, чтобы описать решение общей системы одновременных уравнений. Два символа деления, наклонная черта,/, и наклонная черта влево, \, соответствуют этим двум функциям MATLAB mrdivide
и mldivide
. Эти операторы используются для двух ситуаций, где неизвестная матрица появляется слева или право на матрицу коэффициентов:
| Обозначает решение матричного уравнения xA = b, полученное использование |
| Обозначает решение матричного уравнения Ax = b, полученное использование |
Думайте о “делении” обеих сторон уравнения Ax = b или xA = b A. Матрица коэффициентов A
всегда находится в “знаменателе”.
Условия совместимости размерности для x = A\b
требуют, чтобы эти две матрицы A
и b
имели одинаковое число строк. Решение x
затем имеет одинаковое число столбцов как b
и его размерность строки, равно размерности столбца A
. Для x = b/A
обмениваются ролями строк и столбцов.
На практике линейные уравнения формы Ax = b происходят более часто, чем те из формы xA = b. Следовательно, наклонная черта влево используется намного более часто, чем наклонная черта. Остаток от этого раздела концентрируется на операторе наклонной черты влево; соответствующие свойства оператора наклонной черты могут быть выведены из идентичности:
(b/A)' = (A'\b').
Матрица коэффициентов A
не должна быть квадратной. Если A
имеет размер m-by-n, то существует три случая:
m = n | Квадратная система. Ищите точное решение. |
m> n | Сверхрешительная система, с большим количеством уравнений, чем неизвестные. Найдите решение методом наименьших квадратов. |
m <n | Недоопределенная система, с меньшим количеством уравнений, чем неизвестные. Найдите основное решение с в большей части m ненулевые компоненты. |
Оператор mldivide
использует другие решатели, чтобы обработать различные виды содействующих матриц. Различные случаи диагностированы автоматически путем исследования матрицы коэффициентов. Для получения дополнительной информации смотрите раздел “Algorithms” страницы с описанием mldivide
.
Общее решение системы линейных уравнений Ax = b описывает все возможные решения. Можно найти общее решение:
Решение соответствующей гомогенной системы Ax = 0. Сделайте это использование команды null
путем ввода null(A)
. Это возвращает основание для пробела решения к Ax = 0. Любое решение является линейной комбинацией базисных векторов.
Нахождение конкретного решения неоднородной системы Ax =b.
Можно затем записать любое решение Ax = b как сумма конкретного решения Ax =b, от шага 2, плюс линейная комбинация базисных векторов от шага 1.
Остальная часть этого раздела описывает, как использовать MATLAB, чтобы найти конкретное решение Ax =b, как на шаге 2.
Наиболее распространенная ситуация включает квадратную матрицу коэффициентов A
и один правый вектор-столбец стороны b
.
Если матричный A
несингулярен, то решение, x = A\b
, одного размера как b
. Например:
A = pascal(3); u = [3; 1; 4]; x = A\u x = 10 -12 5
Можно подтвердить, что A*x
точно равен u
.
Если A
и b
являются квадратными и тот же размер, x= A\b
также что размер:
b = magic(3); X = A\b X = 19 -3 -1 -17 4 13 6 0 -6
Можно подтвердить, что A*x
точно равен b
.
Оба из этих примеров имеют точные, целочисленные решения. Это вызвано тем, что матрица коэффициентов была выбрана, чтобы быть pascal(3)
, который является (несингулярной) матрицей полного ранга.
A квадратной матрицы сингулярен, если он не имеет линейно независимых столбцов. Если A сингулярен, решение Ax = b или не существует или не уникален. Оператор наклонной черты влево, A\b
, выдает предупреждение, если A
почти сингулярен или если это обнаруживает точную особенность.
Если A сингулярен и Ax =, b имеет решение, можно найти конкретное решение, которое не уникально путем ввода
P = pinv(A)*b
pinv(A)
является псевдоинверсией A. Если Ax = b не имеет точного решения, то pinv(A)
возвращает решение методом наименьших квадратов.
Например:
A = [ 1 3 7 -1 4 4 1 10 18 ]
сингулярно, когда можно проверить путем ввода
rank(A) ans = 2
Поскольку A не является полным рангом, он имеет некоторые равные нулю сингулярные значения.
Точные решения. Для b =[5;2;12]
уравнение Ax = b имеет точное решение, данное
pinv(A)*b ans = 0.3850 -0.1103 0.7066
Проверьте, что pinv(A)*b
является точным решением путем ввода
A*pinv(A)*b ans = 5.0000 2.0000 12.0000
Решения методом наименьших квадратов. Однако, если b = [3;6;0]
, Ax = b не имеет точного решения. В этом случае pinv(A)*b
возвращает решение методом наименьших квадратов. Если вы вводите
A*pinv(A)*b ans = -1.0000 4.0000 2.0000
вы не возвращаете исходный вектор b
.
Можно определить, имеет ли Ax =b точное решение путем нахождения, что строка уменьшала форму эшелона расширенной матрицы [A b]
. Чтобы сделать так для этого примера, войти
rref([A b]) ans = 1.0000 0 2.2857 0 0 1.0000 1.5714 0 0 0 0 1.0000
Поскольку нижний ряд содержит все нули за исключением последней записи, уравнение не имеет решения. В этом случае pinv(A)
возвращает решение методом наименьших квадратов.
Этот пример показывает, как со сверхрешительными системами часто сталкиваются в различных видах аппроксимирования кривыми к экспериментальным данным.
Количество, y
, измеряется в нескольких различных значениях времени, t
, чтобы произвести следующие наблюдения. Можно ввести данные и просмотреть их в таблице со следующими операторами.
t = [0 .3 .8 1.1 1.6 2.3]'; y = [.82 .72 .63 .60 .55 .50]'; B = table(t,y)
B=6×2 table
t y
___ ____
0 0.82
0.3 0.72
0.8 0.63
1.1 0.6
1.6 0.55
2.3 0.5
Попытайтесь моделировать данные с затухающей показательной функцией
.
Предыдущее уравнение говорит, что векторный y
должен быть аппроксимирован линейной комбинацией двух других векторов. Каждый - постоянный вектор, содержащий все единицы, и другой вектор с компонентами exp(-t)
. Неизвестные коэффициенты, и , может быть вычислен путем выполнения подгонки наименьших квадратов, которая минимизирует сумму квадратов отклонений данных из модели. Существует шесть уравнений в двух неизвестных, представленных 6 2 матрица.
E = [ones(size(t)) exp(-t)]
E = 6×2
1.0000 1.0000
1.0000 0.7408
1.0000 0.4493
1.0000 0.3329
1.0000 0.2019
1.0000 0.1003
Используйте оператор наклонной черты влево, чтобы получить решение методом наименьших квадратов.
c = E\y
c = 2×1
0.4760
0.3413
Другими словами, подгонка наименьших квадратов к данным
Следующие операторы оценивают модель в расположенном с равными интервалами шаге в t
, и затем строят результат вместе с исходными данными:
T = (0:0.1:2.5)'; Y = [ones(size(T)) exp(-T)]*c; plot(T,Y,'-',t,y,'o')
E*c
не точно равен y
, но различием могут хорошо быть меньше, чем погрешности измерения в исходных данных.
Прямоугольный матричный A
имеет неполный ранг, если он не имеет линейно независимых столбцов. Если A
имеет неполный ранг, то решение методом наименьших квадратов к AX = B
не уникально. A\B
выдает предупреждение, если A
имеет неполный ранг и производит решение методом наименьших квадратов. Можно использовать lsqminnorm
, чтобы найти решение X
, который имеет минимальную норму среди всех решений.
Этот пример показывает, как решение недоопределенных систем не уникально. Недоопределенные линейные системы включают больше неизвестных, чем уравнения. Матрица уехала, операция деления в MATLAB находит основное решение методом наименьших квадратов, которое имеет в большей части m
ненулевые компоненты для m
-by-n
матрица коэффициентов.
Вот небольшой, случайный пример:
R = [6 8 7 3; 3 5 4 1] rng(0); b = randi(8,2,1)
R = 6 8 7 3 3 5 4 1 b = 7 8
Линейная система Rp = b
вовлекает два уравнения в четыре неизвестные. Поскольку матрица коэффициентов содержит маленькие целые числа, уместно использовать команду format
, чтобы отобразить решение в рациональном формате. Конкретное решение получено с
format rat
p = R\b
p = 0 17/7 0 -29/7
Одним из ненулевых компонентов является p(2)
, потому что R(:,2)
является столбцом R
с самой большой нормой. Другим ненулевым компонентом является p(4)
, потому что R(:,4)
доминирует после того, как R(:,2)
устраняется.
Полное общее решение недоопределенной системы может быть охарактеризовано путем добавления p
в произвольную линейную комбинацию пустых векторов пробела, которые могут быть найдены с помощью функции null
с опцией, запрашивающей рациональное основание.
Z = null(R,'r')
Z = -1/2 -7/6 -1/2 1/2 1 0 0 1
Можно подтвердить, что R*Z
является нулем и что остаточный R*x - b
является маленьким для любого векторного x
, где
x = p + Z*q
Поскольку столбцы Z
являются пустыми векторами пробела, продукт, Z*q
является линейной комбинацией тех векторов:
Чтобы проиллюстрировать, выберите произвольный q
и создайте x
.
q = [-2; 1]; x = p + Z*q;
Вычислите норму невязки.
format short
norm(R*x - b)
ans = 2.6645e-15
Когда бесконечно много решений доступны, решение с минимальной нормой особенно интересно. Можно использовать lsqminnorm
, чтобы вычислить решение методом наименьших квадратов минимальной нормы. Это решение имеет наименьшее значение для norm(p)
.
p = lsqminnorm(R,b)
p = -207/137 365/137 79/137 -424/137
Некоторые проблемы касаются решения линейных систем, которые имеют ту же матрицу коэффициентов A
, но различные правые стороны b
. Когда различные значения b
доступны одновременно, можно создать b
как матрицу с несколькими столбцами и решить все системы уравнений одновременно с помощью одной команды наклонной черты влево: X = A\[b1 b2 b3 …]
.
Однако иногда различные значения b
не все доступны одновременно, что означает, что необходимо решить несколько систем уравнений последовательно. Когда вы решаете одну из этих систем уравнений с помощью наклонной черты (/) или наклонная черта влево (\), оператор разлагает на множители матрицу коэффициентов A
и использует это матричное разложение, чтобы вычислить решение. Однако в каждый последующий раз, когда вы решаете аналогичную систему уравнений с различным b
, оператор вычисляет то же разложение A
, который является избыточным вычислением.
Решение этой проблемы состоит в том, чтобы предварительно вычислить разложение A
, и затем снова использовать факторы, чтобы решить для различных значений b
. На практике, однако, предварительное вычисление разложения этим способом может быть трудным, поскольку необходимо знать, какое разложение вычислить (LU, LDL, Холесский, и так далее), а также как умножить факторы, чтобы решить проблему. Например, с разложением LU необходимо решить две линейных системы, чтобы решить исходную систему Ax = b:
[L,U] = lu(A); x = U \ (L \ b);
Вместо этого рекомендуемый метод для решения линейных систем с несколькими последовательными правыми сторонами должен использовать объекты decomposition
. Эти объекты позволяют вам усилить выигрыши в производительности предварительного вычисления матричного разложения, но они не требуют знания того, как использовать матричные факторы. Можно заменить предыдущее разложение LU на:
dA = decomposition(A,'lu');
x = dA\b;
Если вы не уверены, какое разложение использовать, decomposition(A)
выбирает правильный тип на основе свойств A
, подобного тому, что делает наклонная черта влево.
Вот простой тест возможных выигрышей в производительности этого подхода. Тест решает ту же разреженную линейную систему 100 раз с помощью и наклонной черты влево (\) и decomposition
.
n = 1e3; A = sprand(n,n,0.2) + speye(n); b = ones(n,1); % Backslash solution tic for k = 1:100 x = A\b; end toc
Elapsed time is 9.006156 seconds.
% decomposition solution tic dA = decomposition(A); for k = 1:100 x = dA\b; end toc
Elapsed time is 0.374347 seconds.
Для этой проблемы решение decomposition
намного быстрее, чем использование одной только наклонной черты влево, все же синтаксис остается простым.
Если матрица коэффициентов A является большой и разреженной, методы факторизации обычно не эффективны. Iterative methods генерирует серию приближенных решений. MATLAB обеспечивает несколько итерационных методов, чтобы обработать большие, разреженные входные матрицы.
Функция | Описание |
---|---|
pcg | Предобусловленный метод сопряженных градиентов. Этот метод подходит для Эрмитовой положительной определенной матрицы коэффициентов A. |
bicg | Метод градиентов BiConjugate |
bicgstab | Градиенты BiConjugate стабилизированный метод |
bicgstabl | BiCGStab (l) метод |
cgs | Методы сопряженных градиентов придали методу квадратную форму |
gmres | Обобщенный метод минимальных невязок |
lsqr | Метод LSQR |
minres | Метод минимальных невязок. Этот метод подходит для Эрмитовой матрицы коэффициентов A. |
qmr | Метод квази-минимальных невязок |
symmlq | Симметричный метод LQ |
tfqmr | Метод QMR без транспонирования |
MATLAB поддерживает многопоточное вычисление во многой линейной алгебре и поэлементных числовых функциях. Эти функции автоматически выполняются на нескольких потоках. Для функции или выражения, чтобы выполниться быстрее на нескольких центральных процессорах, много условий должны быть верными:
Функция выполняет операции, что легко раздел в разделы, которые выполняются одновременно. Эти разделы должны смочь выполниться с небольшой связью между процессами. Они должны потребовать немногих последовательных операций.
Размер данных является достаточно большим так, чтобы любые преимущества параллельного выполнения перевесили время, требуемое разделить данные и управлять отдельными потоками выполнения. Например, большинство функций убыстряется только, когда массив содержит несколько тысяч элементов или больше.
Операция не ограничена памятью; время вычислений не во власти времени доступа к памяти. Как правило сложные функции ускоряют больше, чем простые функции.
inv
, lscov
, linsolve
и mldivide
показывают значительное увеличение скорости на больших массивах с двойной точностью (на порядке 10 000 элементов или больше), когда многопоточность включена.
decomposition
| lsqminnorm
| mldivide
| mrdivide
| pinv