Системы линейных уравнений

Вычислительные факторы

Одной из самых важных проблем в техническом вычислении является решение систем одновременных линейных уравнений.

В матричном обозначении общая проблема принимает следующую форму: Учитывая две матрицы A и b, действительно там существует уникальная матрица x, так, чтобы Ax b или xA 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. Эти операторы используются для двух ситуаций, где неизвестная матрица появляется слева или право на матрицу коэффициентов:

x = b/A

Обозначает решение матричного уравнения xA = b, полученное использование mrdivide.

x = A\b

Обозначает решение матричного уравнения Ax = b, полученное использование mldivide.

Думайте о “делении” обеих сторон уравнения 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 на n размера, то существует три случая:

m = n

Квадратная система. Ищите точное решение.

m> n

Сверхрешительная система, с большим количеством уравнений, чем неизвестные. Найдите решение методом наименьших квадратов.

m <n

Недоопределенная система, с меньшим количеством уравнений, чем неизвестные. Найдите основное решение с в большинстве m ненулевых компонентов.

Mldivide Алгоритм

Оператор mldivide использует различные решатели, чтобы обработать различные виды содействующих матриц. Различные случаи диагностированы автоматически путем исследования матрицы коэффициентов. Для получения дополнительной информации смотрите раздел “Algorithms” страницы с описанием mldivide.

Общее решение

Общее решение системы линейных уравнений Axb описывает все возможные решения. Можно найти общее решение:

  1. Решение соответствующей гомогенной системы Ax = 0. Сделайте это использование команды null путем ввода null(A). Это возвращает основание для пробела решения к Оси = 0. Любое решение является линейной комбинацией базисных векторов.

  2. Нахождение конкретного решения неоднородной системы Ax =b.

Можно затем записать любое решение Осиb как сумма конкретного решения Оси =b, от шага 2, плюс линейная комбинация базисных векторов от шага 1.

Остальная часть этого раздела описывает, как использовать MATLAB, чтобы найти конкретное решение Оси =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 сингулярен, решение Оси = 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 является линейной комбинацией тех векторов:

Zq = (x⇀1x⇀2) (UW) =ux⇀1+wx⇀2   .

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

ФункцияОписание
pcg

Предобусловленный метод сопряженных градиентов. Этот метод подходит для Эрмитовой положительной определенной матрицы коэффициентов A.

bicg

Метод градиентов BiConjugate

bicgstab

Градиенты BiConjugate стабилизированный метод

bicgstabl

BiCGStab (l) метод

cgs

Методы сопряженных градиентов придали методу квадратную форму

gmres

Обобщенный метод минимальных невязок

lsqr

Метод LSQR

minres

Метод минимальных невязок. Этот метод подходит для Эрмитовой матрицы коэффициентов A.

qmr

Метод квази-минимальных невязок

symmlq

Симметричный метод LQ

tfqmr

Метод QMR без транспонирования

Многопоточное вычисление

MATLAB поддерживает многопоточное вычисление для многой линейной алгебры и поэлементных числовых функций. Эти функции автоматически выполняются на нескольких потоках. Для функции или выражения, чтобы выполниться быстрее на нескольких CPUs, много условий должны быть верными:

  1. Функция выполняет операции, что легко раздел в разделы, которые выполняются одновременно. Эти разделы должны смочь выполниться с небольшой связью между процессами. Они должны потребовать немногих последовательных операций.

  2. Размер данных является достаточно большим так, чтобы любые преимущества параллельного выполнения перевесили время, требуемое разделить данные и управлять отдельными потоками выполнения. Например, большинство функций убыстряется только, когда массив содержит несколько тысяч элементов или больше.

  3. Операция не ограничена памятью; время вычислений не во власти времени доступа к памяти. Как правило сложные функции ускоряют больше, чем простые функции.

inv, lscov, linsolve и mldivide показывают значительное увеличение скорости на большом с двойной точностью массивы (на порядке 10 000 элементов или больше), когда многопоточность включена.

Смотрите также

| | | |

Похожие темы

Была ли эта тема полезной?