Одной из важнейших задач в технических вычислениях является решение систем одновременных линейных уравнений.
В матричном обозначении общая проблема принимает следующую форму: Учитывая две матрицы A и b, действительно там существует уникальная матрица x, так, чтобы <reservedrangesplaceholder5> <reservedrangesplaceholder4> = b или <reservedrangesplaceholder2> <reservedrangesplaceholder1> = b?
Поучительно рассматривать пример 1 на 1. Для примера делает уравнение
7 x = 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
оператор использует другие решатели, чтобы обрабатывать различные виды матриц коэффициентов. Различные случаи диагностируются автоматически путем исследования матрицы коэффициентов. Для получения дополнительной информации смотрите раздел «Алгоритмы» в 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
не все доступны одновременно, что означает, что вам нужно решить несколько систем уравнений последовательно. Когда вы решаете одну из этих систем уравнений, используя slash (/) или backslash (\), оператор факторизирует матрицу коэффициентов A
и использует это матричное разложение, чтобы вычислить решение. Однако каждый последующий раз вы решаете подобную систему уравнений с другим b
оператор вычисляет то же разложение A
, что является избыточным расчетом.
Решение этой задачи состоит в том, чтобы предварительно вычислить разложение A
, а затем повторно используйте факторы для решения различных значений b
. На практике, однако, предварительное вычисление разложения таким образом может оказаться трудным, поскольку вы должны знать, какое разложение вычислить (LU, LDL, Cholesky и так далее), а также как умножить факторы, чтобы решить проблему. Для примера с 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 | BiСопряженный метод градиентов |
bicgstab | BiСопряженный метод стабилизации градиентов |
bicgstabl | BiCGStab (l) Метод |
cgs | Метод аппроксимации сопряженных градиентов в квадрате |
gmres | Обобщенный метод минимальных невязок |
lsqr | Метод LSQR |
minres | Метод минимальных невязок. Этот метод подходит для Эрмитовой матрицы коэффициентов A. |
qmr | Метод квази-минимальных невязок |
symmlq | Симметричный метод LQ |
tfqmr | Метод QMR без транспозиции |
MATLAB поддерживает многопоточные расчеты для ряда линейных алгебр и поэлементных числовых функций. Эти функции автоматически выполняются в нескольких потоках. Чтобы функция или выражение выполнялись быстрее на нескольких центральных процессорах, ряд условий должен быть true:
Функция выполняет операции, которые легко разделяются на разделы, которые выполняются одновременно. Эти разделы должны быть способны выполняться при ограниченной коммуникации между процессами. Они должны потребовать мало последовательных операций.
Размер данных достаточно велик, так что любые преимущества параллельного выполнения перевешивают время, необходимое для разбиения данных и управления отдельными потоками выполнения. Для примера большинство функций ускоряются только тогда, когда массив содержит несколько тысяч элементов и более.
Операция не связана с памятью; время вычислений не определяется временем доступа к памяти. Как общее правило, сложные функции ускоряют больше, чем простые функции.
inv
, lscov
, linsolve
, и mldivide
показать значительное увеличение скорости на больших массивах двойной точности (порядка 10 000 элементов или более), когда включена многопоточность.
decomposition
| lsqminnorm
| mldivide
| mrdivide
| pinv