Как решить систему уравнений в матлабе
Перейти к содержимому

Как решить систему уравнений в матлабе

  • автор:

РЕШЕНИЕ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ В MATLAB Текст научной статьи по специальности «Математика»

Аннотация научной статьи по математике, автор научной работы — М.Н.Урманов, Н.Д.Нуритдинов, А.Алиева

Для Решение систем нелинейных уравнений в Matlabе. Для решения СНАУ, необходимо воспользоваться итеративными методами. Это методы, которые за определенное количество шагов получают решение с определенной точностью. Также очень важно при решении задать достаточно близкое начальное приближение , то есть такой набор переменных, которые близки к решению. Если решается система из 2 уравнений, то приближение находится с помощью построение графика двух функций.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по математике , автор научной работы — М.Н.Урманов, Н.Д.Нуритдинов, А.Алиева

Аналитическое решение задачи распространения волны в длинной линии, нагруженной на сопротивление, индуктивность и емкость

Модификация метода Ньютона безусловной минимизации функций повышенной сходимости

О построении периодических решений одного класса неавтономных систем дифференциальных уравнений в распределенной компьютерной среде

Метод гармонического баланса для отыскания приближённых периодических решений системы Лоренца
Моделирование дифференциальных уравнений в среде matlab & Simulink
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

SOLVING SYSTEMS OF NONLINEAR EQUATIONS IN MATLAB

For Solving systems of nonlinear equations in Matlab. To solve SNAU, iterative methods must be used. These are methods that, in a certain number of steps, obtain a solution with a certain accuracy. It is also very important when solving to set a sufficiently close initial approximation , that is, such a set of variables that are close to the solution. If a system of 2 equations is being solved, then the approximation is found by plotting two functions .

Текст научной работы на тему «РЕШЕНИЕ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ В MATLAB»

РЕШЕНИЕ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ В MATLAB

НамМСИ Учитель Н.Д.Нуритдинов НамМСИ Учитель

А.Алиева НамМСИ студент https://doi.org/10.5281/zenodo.6762248

Аннотация. Для Решение систем нелинейных уравнений в Matlabе. Для решения СНАУ, необходимо воспользоваться итеративными методами. Это методы, которые за определенное количество шагов получают решение с определенной точностью. Также очень важно при решении задать достаточно близкое начальное приближение, то есть такой набор переменных, которые близки к решению. Если решается система из 2 уравнений, то приближение находится с помощью построение графика двух функций.

Ключевые слова: начальное, приближение, итерация, нелинейный, Ньютона, функции, diff.

Abstract. For Solving systems of nonlinear equations in Matlab. To solve SNAU, iterative methods must be used. These are methods that, in a certain number of steps, obtain a solution with a certain accuracy. It is also very important when solving to set a sufficiently close initial approximation, that is, such a set of variables that are close to the solution. If a system of 2 equations is being solved, then the approximation is found by plotting two functions.

Keywords: initial, approximation, iteration, non-linear, Newtonian, functions, diff.

Система представляет собой набор нелинейных уравнений (их может быть два или более), для которых иногда возможно найти решение, которое будет подходить ко всем уравнениям в системе.

В стандартном виде, количество неизвестных переменных равно количеству уравнений в системе. Необходимо найти набор неизвестных переменных, которые при подставлении в уравнения будут приближать значение уравнения к 0. Иногда таких наборов может быть несколько, даже бесконечно много, а иногда решений не существует.

Чтобы решить СНАУ, необходимо воспользоваться итеративными методами. Это методы, которые за определенное количество шагов получают решение с определенной точностью. Также очень важно при решении задать достаточно близкое начальное приближение, то есть такой набор переменных, которые близки к решению. Если решается система из 2 уравнений, то приближение находится с помощью построение графика двух функций.

SOLVING SYSTEMS OF NONLINEAR EQUATIONS IN MATLAB

Fn(x) = FH(xu x2. xn) — 0.

INTERNATIONAL SCIENTIFIC JOURNAL

Далее, мы рассмотрим стандартный оператор Matlab для решения систем нелинейных алгебраических уравнений, а также напишем метод простых итераций и метод Ньютона.

Оператор Matlab для решения СНАУ

В среде Matlab существует оператор fsolve, который позволяет решить систему нелинейных уравнений. Сразу рассмотрим задачу, которую, забегая вперед, решим и другими методами для проверки.

Решить систему нелинейных уравнений с точность 10″ : cos(x-l) + y = 0.5 x-cos(y) = 3

МАТЕРИАЛЫ И МЕТОДЫ

Нам дана система из 2 нелинейных уравнений и сначала лучше всего построить график. Воспользуемся командой ezplot в Matlab, только не забудем преобразовать уравнения к стандартному виду, где правая часть равна 0: y1 = ezplot(‘cos(x-1) + y — 0.5′); set(y1,’Color’,’b’,’LineWidth’,2); hold on;

y2 = ezplot(‘x — cos(y) — 3′); set(y2,’Color’,’b’,’LineWidth’,2); grid on;

Функция ezplot строит график, принимая символьную запись уравнения, а для задания цвета и толщины линии воспользуемся функцией set. Посмотрим на вывод:

Как видно из графика, есть одно пересечение функций — то есть одно единственное решение данной системы нелинейных уравнений. И, как было сказано, по графику найдем приближение. Возьмем его как (3.0, 1.0). Теперь найдем решение с его помощью:

Создадим функцию m-файлом Шп^ и поместим туда следующий код:

INTERNATIONAL SCIENTIFIC JOURNAL

function f = fun( x )

f(1)= cos(x(1)-1) + x(2) — 0.5; f(2)= x(1) — cos(x(2)) — 3; end

Заметьте, что эта функция принимает вектор приближений и возвращает вектор значений функции. То есть, вместо x здесь x(1), а вместо y — x(2). Это необходимо, потому что fsolve работает с векторами, а не с отдельными переменными. И наконец, допишем функцию fsolve к коду построения графика таким образом: %построение графика y1 = ezplot(‘cos(x-1) + y — 0.5′); set(y1,’Color’,’b’,’LineWidth’,2); hold on;

y2 = ezplot(‘x — cos(y) — 3′); set(y2,’Color’,’b’,’LineWidth’,2); grid on;

[xr, fr, ex] = fsolve(@fun,[3.0, 1.0],optimset(‘TolX’,1.0e-2)) hold on;

Таким образом у нас образуется два m-файла. Первый строит график и вызывает функцию fsolve, а второй необходим для расчета самих значений функций И в конце, приведем результаты: xr (это вектор решений) = 3.3559 1.2069

fr (это значения функций при таких xr, они должны быть близки к 0) = 1.0e-09 * 0.5420 0.6829

ex (параметр сходимости, если он равен 1, то все сошлось) = 1 И, как же без графика с ответом:

INTERNATIONAL SCIENTIFIC JOURNAL

Теперь переходим к методам, которые запрограммируем сами. Первый из них — метод простых итераций. Он заключается в том, что итеративно приближается к решению, конечно же, с заданной точностью. Алгоритм метода достаточно прост:

1. Если возможно, строим график.

2. Из каждого уравнения выражаем неизвестную переменную след. образом: из 1 уравнения выражаем x1, из второго — x2, и т.д.

3. Выбираем начальное приближение X0, например (3.0 1.0)

4. Рассчитываем значение x1, x2. xn, которые получили на шаге 2, подставив значения из приближения X0.

5. Проверяем условие сходимости, (X-X0) должно быть меньше точности

6. Если 5 пункт не выполнился, то повторяем 4 пункт. И перейдем к практике, тут станет все понятнее.

Решить систему нелинейных уравнений методом простых итераций с точность 10″ : cos(x-l) + y = 0.5 x-cos(y) = 3

График мы уже строили в предыдущем пункте, поэтому переходим к преобразованию. Увидим, что x из первого уравнения выразить сложно, поэтому поменяем местами уравнения, это не повлияет на решение: x-cos(y) = 3 cos(x-1) + y = 0.5

Далее приведем код в Matlab: x0 = 3.0; %точки полученные графически y0 = 1.0; %возьмем их за начальное приближение x = cos(y0) + 3; y = 0.5 — cos(x — 1);

e = 0.01; %точность k = 0; %счетчик итераций

В этой части мы выразили x1 и x2 (у нас это ‘x’ и ‘у’) и задали точность. while or((abs(x — x0 ) > e), (abs(y — y0) > e)) %пока точность не будет достигнута x0 = x;

x = cos(y0) + 3; y = 0.5 — cos(x — 1); k = k + 1; end;

В этой части в цикле выполняются пункты 4-6. То есть итеративно меняются значения x и y, пока отличия от предыдущего значения не станет меньше заданной точности. Далее, выведем: %вывод

INTERNATIONAL SCIENTIFIC JOURNAL

к %количество итераций х %решения У

к = 10 х = 3.3587 у = 1.2088

Как видно, результаты немного отличаются от предыдущего пункта. Это связано с заданной точностью, можете попробовать поменять точность и увидите, что результаты станут такими же, как и при решении стандартным методом Ма^аЬ. Метод Ньютона в Matlab для решения СНАУ

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

1. Если возможно, строим график.

2. Выбираем начальное приближение Х0, например (3.0 1.0)

3. Рассчитываем матрицу Якоби w, это матрица частных производных каждого уравнения, считаем ее определитель для Х0.

4. Находим вектор приращений, который рассчитывается как dx = * Г(Х0)

5. Находим вектор решения X = Х0 + dx

6. Проверяем условие сходимости, (Х-Х0) должно быть меньше точности Далее, решим тот же пример, что и в предыдущих пунктах. Его график мы уже

строили и начальное приближение останется таким же.

Решить систему нелинейных уравнений методом Ньютона с точность 10″ : С08(х-1) + у = 0.5 х-со8(у) = 3

Перейдем к коду: х0 = [3; 1];

syms xs ys; %создаем символьные переменные, чтобы вычислить производную

ёПхБ = ШГТ(‘со8(х8-1) + уБ — 0.5’, xs); %производная 1 функции по х

ёПуБ = ШГГ(‘сов(х8-1) + уБ — 0.5’, ys); %производная 1 функции по у

ёЕхБ = ШЩ’хв — соб(уб) — 3′, xs); %производная 2 функции по х

ёЕуБ = ШГ^’хб — соб(уб) — 3′, ys); %производная 2 функции по у

Сначала зададим начальное приближение. Затем необходимо просчитать матрицу Якоби, то есть частные производные по всем переменным. Воспользуемся символьным дифференцированием в Ма^аЬ, а именно командой diff с использованием символьных переменных.

Далее, сделаем первую итерацию метода, чтобы получить вектор выходных значений X, а потом уже сравнивать его с приближением в цикле.

ГО=[со8(х0(1)-1) + х0(2) — 0.5; х0(1) — соз(х0(2)) — 3]; %помещаем функции в вектор столбец df1x = double(subs(subs(df1xs, xs, х0(1)), ys, х0(2))); %определяем значение производных подставляя значение из начального приближения ёПу = ёоиЬ1е(8иЬ8(8иЬ8(ёАу8, хб, х0(1)), уБ, х0(2))); ёЙх = ёоиЬ1е(8иЬ8(8иЬ8(ёЙх8, хб, х0(1)), уБ, х0(2)));

ёйу = ёоиЬ1е(8иЬ8(8иЬ8(ёйу8, хб, х0(1)), ув, х0(2)));

w = [ёАх ёАу; df2x df2y]; %матрица Якоби det(w); % определитель, не должен быть равен 0 х = х0 — inv(w) * ГО; %решение после первой итерации

е = 0.01; %точность

В этой части кода выполняем первую итерацию, чтобы получить вектор решения и сравнивать его с вектором начального приближения. Отметим, чтобы посчитать значение символьной функции в Matlab, необходимо воспользоваться функцией subs. Эта функция заменяет переменную на числовое значение. Затем функция double рассчитает это числовое значение.

Все действия, которые были выполнены для расчета производных, на самом деле можно было не производить, а сразу же задать производные. Именно так мы и поступим в цикле.

while or((abs(x(1) — x0(1)) > e), (abs(x(2) — x0(2)) > e)) %пока точность не будет достигнута x0(1) = x(1); x0(2) = x(2);

f0=[cos(x0(1)-1) + x0(2) — 0.5; x0(1) — cos(x0(2)) — 3]; w = [(-sin(x0(1) — 1)) 1; 1 sin(x0(2))]; %матрица Якоби det(w); % определитель, не должен быть равен 0 x = x0 — inv(w) * f0; % новое решение k = k + 1; if ( k > 100)

В этой части кода выполняется цикл по расчету решения с заданной точностью. Еще раз отметим, что если в первой итерации до цикла были использованы функции diff, double и subs для вычисления производной в Matlab, то в самом цикле матрица якоби была явно задана этими частными производными. Это

сделано, чтобы показать возможности среды Matlab.

За 3 итерации достигнут правильный результат. Также важно сказать, что иногда такие методы могут зацикливаться и не закончить расчеты. Чтобы такого не было, мы прописали проверку на количество итераций и запретили выполнение более 100 итераций.

1. Arens V.Zh. Physical and chemical geotechnology. -M .: MGGU, 2001. -656 p.

Вывод: x = 3.3559 1.2069 k = 3

SCIENCE AND INNOVATION

INTERNATIONAL SCIENTIFIC JOURNAL

i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

2. 2. Konovalov A.N. The method of fictitious domains in problems of filtration of a two-phase incompressible fluid taking into account capillary forces // Numerical methods of continuum mechanics. T.3. -Novosibirsk: Computing Center of the Siberian Branch of the USSR Academy of Sciences, 1972. -No5. -S. 52-67.

3. Samarskiy A.A. Introduction to the theory of difference schemes. -M .: Nauka, 1971. -552 p.

Решение СЛАУ и матрицы в Matlab

Решение СЛАУ и матрицы в Matlab

Доброго времени суток, читатели! Сегодня мы поговорим о матрицах в Matlab, об их применении в решении систем линейных алгебраических уравнений. Подробно разберем методы решения, и для этого необходимо знание нескольких базовых алгоритмов. Также стоит отметить, что у каждого алгоритма, которым мы будем искать решение СЛАУ в Matlab, своя скорость нахождения этого решения, наличие или отсутствие условия выполнения алгоритма и т.д. В традициях нашего сайта разберём на примере: Решить систему линейных уравнений: 4*a + b — c = 6
a — b + c = 4
2*a — 3*b — 3*c = 4

Метод обратной матрицы в Matlab

Начнем с достаточно распространенного метода. Его суть состоит в том, что сначала необходимо выписать коэффициенты при a, b и c (то есть те коэффициенты, которые находятся слева) в одну матрицу, а свободный член (то есть то, что справа) в другую. В итоге у нас получится 2 матрицы:

A=[4 1 -1; 1 -1 1; 2 -3 -3]; % коэффициенты B=[6; 4; 4]; 

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

det(A) Вывод: 30 

После проверки условия можем перейти к следующему шагу: нахождение обратной матрицы. В Matlab для этого используется оператор inv .
А само решение СЛАУ в Matlab находится как перемножение найденной обратной матрицы на матрицу свободных членов:

x=inv(A)*B Вывод: 2 -1 1

Мы получили 3 значения, которые и соответствуют нашим коэффициентам: то есть a = 2, b = -1, c = 1 . Можете проверить, подставив полученные ответы в исходную систему, и убедиться, что мы решили СЛАУ правильно. Также следует отметить, что матрицы нужно перемножать именно, как сделали мы, то есть слева обратная матрица, справа матрица свободных членов. Если вы не все поняли, то советую вам почитать нашу статью по основам Matlab.

Метод Гаусса

Метод Гаусса в Matlab реализуется достаточно просто: для этого нам нужно всего лишь изучить один новый оператор.
(\) — левое деление.
При следующей записи:

x = A\B Вывод: 2 -1 1

Мы получим ответы на нашу исходную систему. Только заметьте, мы решили СЛАУ стандартным набором функций в Matlab, и желательно этот оператор использовать когда матрица коэффициентов квадратная, так как оператор приводит эту матрицу к треугольному виду. В других случаях могут возникнуть ошибки.

Метод разложения матрицы

  • разложение Холецкого
  • LU разложение
  • QR разложение

Разберём решение через LU и QR разложение, так как в задачах чаще всего встречается задание на решение именно через такие разложения.

Основное отличие этих двух разложений: LU разложение применимо только для квадратных матриц, QR — возможно и для прямоугольных.

LU разложение

Решим выше предложенную задачу через LU разложение:

[L, U] = lu(A); Вывод: L = 1 0 0 0.25 1 0 0.5 2.8 1 U = 4 1 -1 0 -1.25 1.25 0 0 -5 Затем: y = L\B; x = U\y Вывод: 2 -1 1

QR разложение

И через QR разложение соответственно:

[Q, R] = qr(A); x = R\(Q'*B) Вывод: 2.0000 -1.0000 1.0000

Отметим, что апостроф ( ) после Q означает транспонирование.

Стандартные функции Matlab

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

x = linsolve(A,B) Вывод: 2 -1 1

Как видите, ничего сложного тут нет, на то они и стандартные функции Matlab.

Повторение

Итак, сегодня мы с вами изучили несколько методов для решения СЛАУ в Matlab, как с помощью матриц, так и с помощью стандартных функций. Давайте их повторим на другом примере:

Решить систему линейных уравнений:
6*a — b — c = 0
a — 2*b + 3*d = 0
3*a — 4*b — 4*c = -1

A=[6 -1 -1; 1 -2 3; 3 -4 -4]; B=[0; 0; -1]; 
  • Методом обратной матрицы:
x=inv(A)*B Вывод: 0.0476 0.1810 0.1048
x = A\B Вывод: 0.0476 0.1810 0.1048
[L, U] = lu(A); y = L\B; x = U\y Вывод: 0.0476 0.1810 0.1048
[Q, R] = qr(A); x = R\(Q'*B) Вывод: 0.0476 0.1810 0.1048

На этом я с вами попрощаюсь, надеюсь, вы научились применять матрицы в Matlab для решения СЛАУ.

Поделиться ссылкой:

1.11 Решение систем линейных уравнений

MATLAB позволяет работать с объектами линейной алгебры, т. е. векторами и матрицами, настолько просто, насколько это вообще возможно.

Яркий пример этому – решение систем линейных уравнений.

Пусть дана система линейных уравнений

Решить систему с применением оператора обратного деления матриц .

В матричной записи система имеет вид Ах = b, где

A = , b = , х =

– соответственно матрица из коэффициентов при незвестных, вектор-столбец из свободных членов и вектор-столбец из неизвестных.

Введем матрицу А и вектор-столбец свободных членов b:

>> А=[1 3 0;-2 -2 5;1 0 -5]

Известно, что система имеет единственное решение, если определитель матрицы А не равен нулю (│A= det(A) ≠ 0). Вычислим определитель матрицы А:

Определитель не равен нулю. Находим решение системы с помощью оператора обратного деления матриц :

Проверим полученное решение x1 = 1, x2 = -1, x3 = 2 подстановкой в систему уравнений:

В результате проверки получен вектор-столбец свободных членов. Значит, система решена верно.

Найдем теперь решение системы х = A -1 b с помощью обратной матрицы. Вначале вычислим обратную матрицу A -1 :

-2.0000 -3.0000 -3.0000

1.0000 1.0000 1.0000

-0.4000 -0.6000 -0.8000

Находим решение системы:

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

Решить систему линейных уравнений

>> A=[1 3 0;-2 -2 5;1 0 5]

Находим решение системы:

Заметим, что обратное деление произведено на вектор-столбец b, поскольку вектор b введен как вектор-строка. Получили приближенное решение системы. Вычислим обратную матрицу A -1 :

-0.2857 -0.4286 0.4286

0.4286 0.1429 -0.1429

0.0571 0.0857 0.1143

Точное решение системы и точная обратная матрица выражаются через рациональные дроби:

Вопросы для самопроверки

1. Какие окна имеет интерфейс MATLAB и каково их назначение

2. Какова структура командного окна Command Window

3. Как называется отображение в командном окне сеанса работы с системой На какие зоны подразделяется текстовое поле окна Command Window

4. Для чего служат в MATLAB клавиши и 

5. Для чего применяется команда disp

6. Как можно ввести слишком длинную команду в окне Command Window

7. Какая информация сохраняется в окнах Command History и Workspase после применения команды очистки экрана clc

8. Как получить справку по выбранной команде MATLAB

9. В каких форматах представляются в MATLAB вещественные числа

10. Какие форматы отображения вещественных чисел используются в MATLAB

11. Как в в MATLAB осуществляются операции с комплексными числами

12. В чем измеряются аргументы встроенных тригонометрических функций

13. Какая команда осуществляет векторизацию символьного выражения

14. Как MATLAB реагирует на ошибки ввода

15. Как обнаружить и устранить семантическую ошибку ввода

16. Как в MATLAB создаются векторы и матрицы

17. Как осуществляется просмотр и редактирование переменных в окне Workspase

18. Как в MATLAB осуществляются матричные и поэлементные операции над векторами и матрицами

19. Что вычисляют команды dot и cross

20. Как решается система линейных уравнений с помощью оператора обратного деления 

Документация

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

В матричном обозначении общая проблема принимает следующую форму: Учитывая две матрицы A и b, действительно там существует уникальный матричный x, так, чтобы A x = b или x A = b?

Это поучительно, чтобы рассмотреть пример 1 на 1. Например, делает уравнение

имеет уникальное решение?

Ответ, конечно, является да. Уравнение имеет уникальное решение x = 3. Решение легко получено делением:

Решение обычно не получается путем вычисления инверсии 7, который равняется 7 –1 = 0.142857. и затем умножение 7 –1 21. Это было бы, больше работают и, если 7 –1 представлен конечному числу цифр, менее точных. Подобные факторы применяются к наборам линейных уравнений с больше чем одним неизвестным; MATLAB ® решает такие уравнения, не вычисляя инверсию матрицы.

Несмотря на то, что это не стандартное математическое обозначение, MATLAB использует терминологию деления, знакомую в скалярном случае, чтобы описать решение общей системы одновременных уравнений. Два символа деления, наклонная черта ,/, и обратная косая черта , \, соответствуют этим двум функциям MATLAB mrdivide и mldivide . Эти операторы используются для двух ситуаций, где неизвестная матрица появляется слева или право на матрицу коэффициентов:

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

Обозначает решение матричного уравнения 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-by-n, затем существует три случая:

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

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

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

Mldivide Алгоритм

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

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

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

  1. Решение соответствующей гомогенной системы Ax = 0. Сделайте это использование null команда, путем ввода null(A) . Это возвращает базис для пробела решения к Ax = 0. Любое решение является линейной комбинацией базисных векторов.
  2. Нахождение конкретного решения неоднородной системы 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 ( t ) = c 1 + c 2 e — t .

Предыдущее уравнение говорит что векторный y должен быть аппроксимирован линейной комбинацией двух других векторов. Каждый — постоянный вектор, содержащий все единицы, и другой вектор с компонентами exp(-t) . Неизвестные коэффициенты, c 1 и c 2 , может быть вычислен путем выполнения метода наименьших квадратов, который минимизирует сумму квадратов отклонений данных из модели. Существует шесть уравнений в двух неизвестных, представленных 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

Другими словами, метод наименьших квадратов к данным

y ( t ) = 0 . 4 7 6 0 + 0 . 3 4 1 3 e — t .

Следующие операторы оценивают модель в расположенном с равными интервалами шаге в t , и затем постройте результат вместе с исходными данными:

T = (0:0.1:2.5)'; Y = [ones(size(T)) exp(-T)]*c; plot(T,Y,'-',t,y,'o')

Figure contains an axes object. The axes object contains 2 objects of type line.

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 линейная комбинация тех векторов:

Z q = ( x ⇀ 1 x ⇀ 2 ) ( u w ) = u x ⇀ 1 + w x ⇀ 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 является большой и разреженной, методы факторизации обычно не эффективны. Iterative methods генерирует серию приближенных решений. MATLAB обеспечивает несколько итерационных методов, чтобы обработать большие, разреженные входные матрицы.

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

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

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

BiCGStab (l) метод

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

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

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

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

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

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

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

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

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

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

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

Похожие темы

  • Матрицы в среде MATLAB
  • Факторизации
  • Собственные значения
  • Сингулярные значения

Открытый пример

У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *