Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
770
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

Глава 4. Элементы матричной алгебры

вительного в этом ничего нет, поскольку для любой квадратной матрицы ˆ

A

(

 

)

 

(

 

)

 

 

ˆ

2

+

 

ˆ

2

ˆ

имеет место тождество sin(A)

 

cos(A)

 

= E.

На заметку

Операции SinM(A)^2 и CosM(A)^2 имеют смысл, поскольку SinM(A) и CosM(A) – квадратные матрицы, и к ним, как к обычным матрицам, применим оператор ^ возведения в целочисленную степень.

Результат вычислений показан в документе на рис. 4.25.

Рис. 4.25. Вычисление матричного синуса и косинуса

Справедливости ради следует отметить, что приведенный способ вычисления матричного синуса и косинуса далеко не единственный. Существуют и более простые пути. Например, можно воспользоваться формулой Эйлера для экспоненты в комплексной степени: exp(ix) = cos(x) + i sin(x), где i - мнимая единица, для которой по определению i2 = −1 . Таким образом, cos(x) = Re(exp(ix)) и sin(x) = Im(exp(ix)) . Здесь через Re(z)

и Im(z) обозначены соответственно действительная и мнимая части комплексного числа z . Мы могли бы, например, определить матричный синус

181

Самоучитель Matlab

как ˆ = ˆ , а матричный косинус как ˆ = ˆ . sin(A) Im(exp(iA)) cos(A) Re(exp(iA))

Примеры таких вычислений приведены ниже:

>>real(expm(A*i)) ans =

0.1750 -0.5752 -0.4314 -0.6878

>>imag(expm(A*i)) ans =

0.6878 -0.5752 -0.4314 -0.1750

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

На заметку

В вычислениях использовалась встроенная функция expm() для расчета матричной экспоненты. Она справляется с задачей, даже если аргумент комплексный. Действительная часть вычисляется с помощью функции real(), а мнимая – с помощью функции imag().

Окно с результатами вычислений показано на рис. 4.26.

Рис. 4.26. Альтернативный способ вычисления матричного синуса и косинуса

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

= ( , , ), индекс k = 1,2, 3 . Предполагаем также, что эти векторы ak ak1 ak2 ak 3

линейно-независимы и образуют базис. Задача состоит в том, чтобы разло-

жить по этому базису некоторый известный вектор b = (b1,b2,b3).

182

Глава 4. Элементы матричной алгебры

Выражение "разложить по базису" означает, что необходимо представить

 

 

 

 

 

вектор b

в виде линейной комбинации векторов a1

, a2

и a3

. Другими сло-

вами, необходимо найти такие числа x1 , x2 и x3 , чтобы имело место равен-

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ство b = xkak

= x1a1 + x2a2 + x

3a3 . Параметры x1 , x2 и x3

называются

 

 

 

 

k =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

координатами вектора b в базисе из векторов a1 , a2

и a3 . Если компоненты

x

 

, x

 

и x

 

"спрятать" в вектор x

= (x ,x

 

,x

 

), то для этого вектора долж-

 

1

 

2

 

3

 

 

 

 

 

ˆ

1

2

 

3

 

 

 

 

ˆ

 

 

но выполняться соотношение x A

= b , где матрица A формируется век-

 

 

 

 

 

 

 

 

 

 

 

 

ˆ

 

 

 

 

 

 

 

торами a

, a

и a

 

: первая строка матрицы A

- это вектор a , вторая строка

 

 

 

 

1

ˆ

2

 

3

 

 

 

 

 

 

 

 

 

ˆ

1

 

 

матрицы A

- вектор a2 , а третья строка матрицы A

- вектор a3 . Другими

 

 

 

 

 

ˆ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

словами, A - это блочная матрица.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

, то чтобы его найти, необходимо в выражении

Что касается вектора x

 

 

ˆ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ˆ−1

, обрат-

x

A

= b правую и левую части умножить справа на матрицу A

 

 

 

 

 

 

 

ˆ

 

 

 

 

 

 

 

 

ˆ−1

. Именно этим соотно-

ную к матрице A. В результате получим x

= b

A

 

шением и воспользуемся для вычисления координат вектора в новом базисе. Рассмотрим приведенный ниже командный код (жирным шрифтом выделен ввод пользователя):

>>a1=[1 3 1];

>>a2=[-2 1 0];

>>a3=[0 -1 2];

>>b=[1 3 -2];

>>A=[a1;a2;a3]

A =

1

3

1

-2

1

0

0

-1

2

>> x=b/A x =

0.6250 -0.1875 -1.3125 >> x*A

ans =

13 -2

Сначала мы создаем три вектора для нового базиса (значения записываются в переменные a1, a2 и a3), а также вектор (переменная b), который необходимо разложить по базису. Командой A=[a1;a2;a3] на основе векторов нового базиса создается блочная матрица. С помощью этой матрицы, воспользовавшись командой x=b/A, вычисляем вектор координат вектора b в базисе векторов a1, a2 и a3. Проверить, корректно ли вычислен результат, можно, воспользовавшись командой x*A. В результате должны получить вектор b, что, собственно, и происходит (рис. 4.27).

183

Самоучитель Matlab

Рис. 4.27. Вычисление координат вектора в новом базисе

На заметку

Для умножения вектора b справа на обратную матрицу к A мы использовали оператор /. Хотя реальный алгоритм вычисления результата в этом случае на самом деле несколько сложнее, в принципе, можно полагать, что команда b/A вычисляется так: вектор b справа умножается на матрицу, которая обратна к матрице A.

Классической стала задача о вычислении угла между двумя векторами в пространстве. В Matlab эта задача решается исключительно просто. Рас-

смотрим один из возможных способов решения. Базируется он на том об-

 

 

 

 

 

 

 

 

 

щеизвестном факте, что скалярное a

b произведение двух векторов a

и b

равно произведению модулей этих векторов на косинус угла

ϕ между ними,

 

 

 

 

 

 

 

 

 

a

b

 

то есть a

b

=| a || b | cos(ϕ) . Отсюда легко найти cos(ϕ) =

 

 

. Зная

 

 

 

 

 

| a || b |

 

косинус угла, можно вычислить сам угол с помощью функции арккосинуса.

На заметку

В Matlab для вычисления арккосинуса имеется функция acos(). Однако здесь есть один специфический момент. Дело в том, что если известен косинус угла,

184

Глава 4. Элементы матричной алгебры

то сам угол восстанавливается неоднозначно. Арккосинус дет значение в пределах от 0 до p. Поэтому важно четко представлять, что же именно мы вычисляем. В данном случае вычисляется абсолютное значение угла между векторами – в плоскости векторов меньший из двух смежных углов между линиями, вдоль которых направлены векторы.

Пример вычисления угла между векторами представлен в документе на рис. 4.28.

Рис. 4.28. Вычисление угла между векторами

Собственно, для вычисления угла между векторами a и b, помимо команд инициализации векторов, используется всего одна команда phi=180/ pi*acos(dot(a,b)/norm(a)/norm(b)). Угол вычисляется в градусах, поэтому результат, возвращаемый арккосинусом, умножается на 180 и делится на π. Скалярное произведение векторов вычисляем с помощью функции dot(), а модуль вектора вычисляется функцией norm().

Похожая в известном смысле задача – вычисление площади и периметра пространственного треугольника. Задача формулируется так. Заданы три точки в пространстве. Они образуют треугольник. Необходимо найти площадь этого треугольника и его периметр.

Решать задачу будем следующим образом. Обозначим через A, B

и C

 

 

 

 

 

 

 

 

 

точки, которые заданы. На их основе вычисляем три вектора AB

, AC

 

 

 

 

 

 

и BC . Периметр P может быть вычислен как сумма модулей этих векто-

 

 

 

 

 

 

 

 

 

ров, то есть

P =| AB | + | AC | + | BC |. Площадь треугольника равна

 

1

 

 

 

 

 

S =

 

 

 

| AB || AC | sin(ϕ), где через ϕ обозначен между векторами AB и

 

 

 

2

 

 

 

 

 

AC . С другой стороны, если вычислить векторное произведение AB ×AC ,

то результатом будет вектор, и его модуль равен | AB || AC | sin(ϕ), то есть в два раза больше площади треугольника.

185

Самоучитель Matlab

На заметку

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

Ниже приведен командный код, с помощью которого вычисляется площадь и периметр треугольника (жирным шрифтом выделен ввод пользователя).

>>A=[1 2 1];

>>B=[-2 3 -1];

>>C=[1 -1 2];

>>AB=B-A

AB =

-3 1 -2 >> AC=C-A

AC =

0 -3 1 >> BC=C-B

BC =

3 -4 3

>>P=norm(AB)+norm(AC)+norm(BC)

P = 12.7349

>>S=norm(cross(AB,AC))/2

S=

5.3619

Командами A=[1 2 1], B=[-2 3 -1] и C=[1 -1 2] создаются точки – вершины треугольника. Затем с помощью команд AB=B-A, AC=C-A и BC=C-B вычисляются векторы, которые нам нужны для вычисления периметра и площади треугольника. Периметр вычисляем командой

P=norm(AB)+norm(AC)+norm(BC). Площадь вычисляем командой

S=norm(cross(AB,AC))/2, в которой для вычисления векторного произведения использована встроенная функция cross(). Результат вычислений показан на рис. 4.29.

Обращаем внимание, что точки представляются в виде списков из трех элементов. Это позволяет достаточно просто на основании известных точек вычислить соответствующие им векторы.

Еще одной классической является задача о решении системы линейных ал-

гебраических уравнений. В общем случае задача формулируется так. Не-

n

обходимо решить систему уравнений aijxj = bi (индекс i = 1,2,...,n )

j =1

относительно неизвестных x1 , x2 , ..., xn при условии, что параметры aij

186

Глава 4. Элементы матричной алгебры

Рис. 4.29. Вычисление периметра и площади треугольника

и bi (индексы i, j = 1,2,...,n ) заданы. Именно этой задачей и займемся. Всякие экзотические случаи, наподобие системы без решений, исследовать не будем. Предполагаем, что у системы уравнений решение есть, и оно единственно.

Исходную систему уравнений удобно представить в матричном виде, вве-

 

 

 

ˆ

 

 

 

(индексы i, j = 1,2,...,n ),

дя в рассмотрение матрицу A с элементами a

 

 

 

 

 

 

и

ij

 

соответственно (индекс

векторы-столбцы b

и x с элементами b

x

i

 

 

 

i

 

 

 

 

i = 1,2,...,n ). В этих обозначениях система уравнений может быть записа-

ˆ

 

 

 

 

 

 

 

−1

 

 

 

 

 

 

 

ˆ

на в виде Ax

= b . Решение находится элементарно: x = A b . Таким обра-

зом, для решения системы уравнений достаточно знать матрицу коэффици-

ˆ

ентов A и вектор правых частей уравнений b . Данный подход реализован в коде, представленном ниже:

187

Самоучитель Matlab

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

A =

1 2 3 -1 1 2 1 -2 5

>>b=[10;1;4]

b =

10

1

4

>>x=A\b

x =

3

2

1

Матрица коэффициентов задается командой A=[1 2 3;-1 1 2;1 -2 5]. Вектор коэффициентов правых частей задается командой b=[10;1;4]. Таким образом, решается следующая система уравнений:

 

x1

+ 2x2

+ 3x3 = 10

 

 

 

 

 

 

 

 

 

 

 

 

 

+ x

 

+ 2x

 

=

1

x

1

2

3

 

 

 

 

 

 

 

x

 

−2x

 

+ 5x

 

=

4

 

1

2

3

 

 

 

 

 

 

Система имеет единственное решение x1 = 3 , x2 = 2 и x3 = 1. Именно его попытаемся найти. Для этого используем команду x=A\b, в результате чего

иполучаем нужное решение (рис. 4.30).

На заметку

Вместо вычисления обратной матрицы к матрице A и умножения ее (слева) на вектор b мы использовали оператор \.

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

вообще может возникнуть. Допустим, мы вместо одного векторного базиса

вводим другой. Единичные орты исходного базиса обозначим как a1 , a2 и a3 .

На заметку

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

Они

 

единичные и ортогональные, то есть скалярное произведение

 

 

 

= δ

(индексы i, j = 1,2, 3 ). Здесь штрих обозначает транспониро-

aa

j

i

 

ij

188

Глава 4. Элементы матричной алгебры

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

 

 

 

= j

 

 

 

 

 

 

 

 

1,i

 

 

 

 

 

 

 

вание, а через δ

 

 

 

 

обозначен символ Кронекера. Орты в новом

=

0,i j

ij

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

базисе обозначим как b

, b

и b

. Они также ортогональные и единичные,

 

 

1

2

 

3

 

 

= δ

(индексы i, j = 1,2, 3 ). Никто

то есть имеет место соотношение b

b

j

 

 

 

 

 

 

i

 

ij

 

и ничто не запрещают нам записать новые орты через старые орты. Это бу-

 

3

 

 

дет выглядеть так: bi

= sijaj (индекс i = 1,2, 3 ). Элементы sij с индекса-

 

j =1

ˆ

, которая называется матрицей пере-

 

 

ми i, j = 1,2, 3 формируют матрицу S

хода. У этой матрицы есть ряд интересных свойств. Так, несложно показать, что для матрицы перехода Sˆ′ = Sˆ−1 - то есть транспонированная матрица

равна обратной. Определитель матрицы ˆ (по модулю) равен единице. Для

S

преобразования базиса достаточно задать матрицу перехода ˆ. Все необ-

S

ходимые преобразования вычисляются на основе этой матрицы. Так, если

в старом базисе задан некоторый вектор x , то в новом базисе получим век-

= ˆ

тор y Sx. Это следует непосредственно из способа определения матрицы перехода.

189

Самоучитель Matlab

На заметку

При преобразовании базиса модуль вектора не меняется. В старом бази-

 

 

 

 

 

 

 

 

 

 

 

 

се модуль вектора вычисляется как x

x , а в новом базисе это y

y , где

 

 

 

 

 

ˆ

 

 

 

 

 

 

по определению y

= Sx. Поскольку в обоих случаях должны получить одно

 

 

 

 

 

 

 

 

 

 

ˆ

 

и то же значение, а также принимая во внимание, что y

′ = x

S, получаем

 

 

 

ˆ ˆ

 

 

 

 

 

 

ˆ

 

y

y

= x

SSx =

x

x. Отсюда, собственно, и находим, что (через E обозна-

 

 

 

 

 

ˆ ˆ

ˆ

ˆ

ˆ−1

.

 

 

чена единичная матрица) SS

= E и, следовательно, S′ =

S

 

 

Если в старом базисе задана некоторая матрица ˆ, то в новом базисе эта

A

матрица вычисляется как ˆ = ˆˆ ˆ−1.

B SAS

На заметку

Данное правило можно получить исходя из того обстоятельства, что для лю-

ˆ

 

 

ˆ

бой матрицы A и вектора x

 

 

выражение x Ax является скаляром и не зави-

сит от выбора векторного базиса. Поэтому должно выполняться соотношение

ˆ

ˆ

 

 

 

ˆ

ˆ ˆ ˆ

ˆ

−1

xAx = yBy

= x

SBSx

, что дает A = SBS

или B

= SAS .

Очень часто задача состоит в том, чтобы выполнить преобразование базиса,

при котором некоторая матрица (например, ˆ) принимает наиболее про-

A

стой вид. А что может быть проще диагональной матрицы? Другими словами, задача может быть сформулирована, например, следующим образом.

Задана симметричная матрица ˆ. Необходимо найти матрицу перехода ˆ

A S

такую, чтобы матрица ˆ = ˆˆ ˆ−1 была диагональной.

B SAS

На заметку

К диагональному виду матрицу ˆ можно привести, если все ее собственные

A

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

ˆ

ˆ−1

ˆ

влетворять условию S′ = S

, только если матрица A симметрична. Другими

 

 

ˆ

словами, если речь идет не просто о матрице S , а именно о матрице перехо-

ˆ

 

ˆ

да S , то свести к диагональному виду можно только симметричную матрицу A

сразными собственными числами.

ВMatlab есть несколько встроенных функций, с помощью которых может решаться описанная выше задача (или идейно близкая к ней). Здесь остановимся на уже известной функции вычисления собственных чисел eig() и функции выполнения жорданова преобразования jordan(). Функция eig() уже описывалась. Что касается функции jordan(), то ее аргументом указывается исходная, преобразуемая, матрица. В качестве результата возвращается две матрицы. Первая матрица – это матрица, с помощью которой выполняется преобразование (аналог матрицы перехода, но только аналог!). Вторая матрица - диагональная или "почти диагональная" (жор-

190