Одной из самых важных проблем в техническом вычислении является решение систем одновременных линейных уравнений.
В матричном обозначении общая проблема принимает следующую форму: Учитывая две матрицы 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- 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