8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 94 95 96 97 98 99 100 ... 177

На языке программирования Mathcad реализовать функцию, вычисляющую обратную матрицу, можно следующим кодом:

bverter(M):3

(N *- rows(M) В «- identity(N))

errorfMatrix must be squarte!") if rows(M) * cols(M)

"Matrix is singular!") if rank(M) * N for i e 0.. N - 1

A:=

r\ 2 2 4 1 -1 ,-2 4 Sj

(1 -0.222 -0.444

ZlujolverM.B )

inverter(A) = -2

2 -0.889 -0.77RJ

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

d<*(M)

стгог("Matrix must be squi U <r- LUtML

•id" ) if rows(M) * cols(M)

0,1

rowj(M)-l

П

i=o

и

( i

4

2>

-]

5

det(A) = 9 A =9

Функция Isolve использует для решения СЛАУ LU-разложение матрицы коэффициентов. Однако существуют и другие матричные разложения, полезные при решении систем линейных уравнений; сингулярное разложение, QR-разложение, разложение Холепкого. Каждое из них предназначено для эффективного решения отдельного типа СЛАУ.

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

Сингулярное разложение заключается в представлении матрицы коэффициентов в виде произведения трех квадратных матриц той же размерности: A"U-diag(S)-VT. Здесь diag(S) — диагональная матрица, ненулевыми элементами которой являются так называемые сингулярные числа разлагаемой матрицы. В Mathcad вектор сингулярных чисел возвращает встроенная функция svds. Матрицы U и V можно найти, используя функцию svd (они возвращаются слитыми в одну матрицу).

Чтобы найти на основании сингулярного разложения решение СЛАУ, нужно последовательно решить три системы линейных уравнений, в качестве матриц коэффициентов которых выступают полученные в результате проведения разложения матрицы U. V и diag(S). Так как обычно данные матрицы обусловлены куда лучше исходной матрицы, то для решения соответствующих систем можно применять стш]дартные методы вроде метода 1.1-разложения. В случае матрицы diag(S) решение можно полу-


чить и проще, поделив элементы вектора правых частей на соответствующие им элементы главной диагонали.

sing solver (А, В):

(m <- svd(A) а «- rowa(m) k * со 1st nil) U ч- submatrixfm.O

V 4- submatrix

(ш..п- t.Q.k-

(zi*-!u wlver<U,B) Z2*~(ZI + svds(A)) Z3 «-lu.eolver,Z2)) Z3

Проверьте эффективность программы sing solver самостоятельно, решив плохо обусловленную систему (например, матрица коэффициентов которой является матрицей Гильберта),

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

В Mathcad имеются функции и других матричных разложений, которые могут быть использованы для повышения эффективности решения специфических видов СЛАУ. Так, если матрица коэффициентов системы линейных уравнений является симметричной (то есть А*АТ) н положительно определенной (все элементы больше или равны нулю), то вместо LU-разложения гораздо техничнее применять так называемое разложение Холецкого. Данное разложение заключается в представлении матрицы коэффициентов А в виде произведения нижней треугольной матрицы L и ее транспонированной формы: A-LLT. Чтобы найти решение СЛАУ на основании разложения Холецкого, нужно решить две системы линейных уравнений, матрицами коэффициентов в которых являются L и LT. Так как данные матрицы являются соответственно нижней треугольной и верхней треугольной, то для этого можно использовать методы прямой и обратной подстановки,

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

В Mathcad разложение Холецкого можно провести, обратившись к встроенпойфуик-ции cholecky. Результатом работы данной функции является матрица L

(

choKA,B):

m «

vizi

cholesky(A) • dtrect(m,B)

- inv

A:=

1 - I

I

2

3

И

I

B:-

2

2

1

4

I

1

1

J

1

5;

choKA.B);

f 27 -192

v 210.


В отдельных случаях может быть полезно так называемое QR-разложение. Данное разложение заключается в предстаилсиин матрицы и виде произведения ортогональной матрицы Q (то есть QT=Q") и верхней треугольной матрицы R. Впрочем, на практике 0 1£-разложенисдпя решения СЛАУ применяется нечасто, так как оно требует почти в два раза больше операций по сравнению с LU-разложеииен. Большее значение QR-разложсние имеет при решении специфических задач (например, определении собственных значений и векторов матрицы).

Все способы решения СЛАУ, которые мы рассмотрели выше, являются прямыми. Это означает, что для них заведомо известно количество действий, которое должен проделать алгоритм, чтобы найти корни. Точность работы таких алгоритмов зависит только от особенностей системы уравнений. В эгом есть свои преимущества, однако есть и недостатки. Так, решая посредством прямых методов СЛАУ, мы не можем задать точность решения, Поэтому, в общем случае, нельзя быть уверенным, что корн и были определены с достаточной точностью. Если система плохо обусловлена, погрешность может быть очень высока. А можно ли создать для решении СЛАУ итеративный алгоритм, в котором бы пспользовались явные критерии сходимости к корню и итерации совершались до тех пор, пока корни не удовлетворят данным критериям? Такие методы есть. Опишем самый простой итеративный алгоритм решения СЛАУ - алгоритм Якоби.

Суть работы алгоритма Якоби заключается в следующем: из каждого уравнения системы выражается по одному неизвестному. На первом шаге находится первое прибли-жепие простой подстановкой определенных пользователем начальных приближений к переменным. На втором круге работы алгоритма п каждое выражение подставляются полученные па шаг ранее приближения. Таким образом вычисляются следующие, более близкие к корням, приближения. Если пол ученные значения не удовлетворяют условиям точности, то цикл повторяется до тех пор, пока нужное приближение достигнуто не будет.

Несложна догадаться, что рабочей формулой метода Якоби будет следующая формула (здесь х - вектор приближений к корню, А - матрица коэффициентов, В — вектор правых частей):

, Bi ~\оЛ-у*1-...-А;,ы-У-\н-ГУ] ..." Ai,0-rVi

Критерием того, что приближения к корню уже достигли нужной точности, может быть то, что подстановка их в уравнения дает величины, отклоняющиеся от соответствующих элементов вектора В не более чем иа T0L

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

Реализовать алгоритм Якоби на языке программирования Mathcad можно следующим кодом (А — матрица коэффициента в, В — вектор правых частей, L — вектор начальных приближений, T0L — точность):



0 ... 94 95 96 97 98 99 100 ... 177