Раздел 2 - Работа с матрицами в Scilab(230114)
.pdfА.В.Сорокин |
Среда вычислений Scilab: Первые шаги |
2.Работа с матрицами в среде Scilab
2.1Задание матриц
Матрица в среде Scilab может вводиться несколькими способами:
--> a=[1 2 3; 2 3 4; 4 5 6] <Enter>
или
--> a=[1 2 3; <Enter> 2 3 4; <Enter> 4 5 6] <Enter>
Результат - матрица размере 3х3
a11 |
a12 |
a13 |
|
a a |
a |
a |
|
21 |
22 |
23 |
|
a |
a |
a |
|
31 |
32 |
33 |
|
1
Вектор столбец можно вводить b 2 несколькими способами
3
--> b=[1;2;3] <Enter>
или
--> b=[1 2 3]' <Enter>
Таким образом матрица и вектор начинается с символа [ , а заканчивается символом ]. Разделение на элементы внутри строки осуществляется пробелом или символом ,. Разделение на строки осуществляется символом ;.
Обращаться к элементам матрицы или вектора можно так a(1,2) есть элемент a12 , b(2) есть элемент b2 .
2.2Операции над матрицами и векторами
+- поэлементное сложение элементов матриц
- - поэлементное вычитание элементов матриц * - матричное умножение
Если одним из операндов является число, то элементы другого операнда (матрицы)
a |
a |
|
a c |
a c |
|
умножаются на это число. Если a 11 |
12 |
|
и c – число, то a c 11 |
12 |
|
a21 |
a22 |
a21 c |
a22 c |
.* - поэлементное умножение матриц / - матричное деление справа
Запись b/a означает ba 1
./ - поэлементное деление справа
24
А.В.Сорокин
Если |
a |
a |
|
b |
a 11 |
12 |
|
и b 11 |
|
|
a21 |
a22 |
b21 |
Среда вычислений Scilab: Первые шаги
|
|
|
a11 |
|
a12 |
|
||
b |
|
|
|
b |
|
b |
|
|
12 |
|
, то запись a ./ b означает результат |
11 |
12 |
|
|||
b22 |
|
|
a21 |
|
a22 |
|
||
|
|
|
|
|
|
b22 |
|
|
|
|
|
b21 |
|
|
\ - матричное деление слева Запись a\b означает a 1b
.\ - поэлементное деление слева
|
|
|
|
|
|
|
|
b11 |
||
|
a |
|
|
b |
|
|
|
|
|
|
Если |
a |
b |
, то запись a .\ b означает результат |
a |
||||||
a 11 |
12 |
|
и b 11 |
12 |
|
11 |
||||
|
a21 |
a22 |
b21 |
b22 |
|
|
b21 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
a21 |
b12 a12 b22 a22
^ - возведение в степень |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
a |
a |
|
|
a |
|
a |
a |
|
|
a |
|
, |
a |
a |
|
1 |
- т.е. |
|
|
||||
Если a 11 |
12 |
|
, то, a^2 11 |
|
12 |
|
|
11 |
12 |
|
a ^ ( 1) 11 |
12 |
|
|
|
||||||||
a21 |
a22 |
|
|
a21 |
|
a22 |
a21 |
|
a22 |
|
a21 |
a22 |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
a |
|
|
|
|
|
|
|
x |
x |
|
|
|||||
вычисление обратной, |
|
|
2 |
, т.е. такая матрица |
x |
, что |
|||||||||||||||||
a ^ ( 1/ 2) |
11 |
|
|
12 |
|
|
|
|
11 |
12 |
|
||||||||||||
|
|
|
|
|
a21 |
|
a22 |
|
|
|
|
|
|
|
x21 |
x22 |
|
||||||
x x a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.^ - поэлементное возведение в степень |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
1 |
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|||
a11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
a12 |
|
a. ^ (1/ 2) |
a112 |
|
a12 2 |
|
|
|
|
|
|
|
|
|
|
||||||||
Если a |
|
|
, то |
|
1 |
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|||||
a21 |
a22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a 2 |
|
a |
2 |
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
21 |
|
|
|
22 |
|
|
|
|
|
|
|
|
|
|
|
'- операция транспонирования матрицы a ' aT
2.3 Примеры работы с матрицами
Пусть матрицы a и b заданы
--> a=[1 2; 3 4]
a = |
|
1 |
2 |
3 |
4 |
--> b=[2 1; 3 5] b =
21
35
Сложение и разность матриц
-->c=a+b c =
3 |
3 |
6 |
9 |
-->d=a-b d =
-1 |
1 |
0 |
-1 |
25
А.В.Сорокин |
Среда вычислений Scilab: Первые шаги |
|
* - матричное умножение |
|
|
-->f=a*b |
|
|
f = |
|
|
8 |
11 |
|
18 |
23 |
|
.* - поэлементное умножение матриц
--> g=a.*b g =
2 2
920
/- матричное деление справа
--> h=a/b h =
-0.1429 0.4286 0.4286 0.7143
проверка правильности выполнения операции
--> j=h*b j =
1.0000 2.0000
3.0000 4.0000
./ - поэлементное деление справа
--> k=a./b
k = |
|
0.5000 |
2.0000 |
1.0000 |
0.8000 |
\ - матричное деление слева
--> v=a\b
v=
-1.0000 3.0000 1.5000 -1.0000
проверка правильности выполнения операции
>> j=a*v |
|
j = |
|
2.0000 |
1.0000 |
3.0000 |
5.0000 |
.\ - поэлементное деление слева
--> m=a.\b
m=
2.0000 0.5000
1.0000 |
1.2500 |
|
^ - возведение в степень |
||
--> a2=a^2 |
|
|
a2 = |
|
|
7 |
10 |
|
15 |
22 |
|
проверка правильности выполнения операции
--> a*a
26
А.В.Сорокин |
Среда вычислений Scilab: Первые шаги |
ans =
7 10
15 22
--> x=b^(1/2) x =
1.3251 |
0.2852 |
0.8557 |
2.1808 |
--> x*x |
|
ans = |
|
2.0000 |
1.0000 |
3.0000 |
5.0000 |
.^ - поэлементное возведение в степень
--> y=a.^2
y = |
|
1 |
4 |
9 |
16 |
транспонирование матрицы
--> at=a' at =
13
24
Примечание. С матрицами можно строить выражение с использованием арифметических функций. При этом функция будет вычисляться от каждого элемента матрицы.
a |
a |
|
sin(a ) |
sin(a |
) |
|
Пример. Если a 11 |
12 |
|
, то sin(a) |
11 |
12 |
. |
a21 |
a22 |
sin(a21 ) |
sin(a22 ) |
2.4. Работа с блочными матрицами
Среда Scilab позволяет работь с блочными матрицами, что иногда бывает очень полезным.
Например, даны четыре матрицы: a 1 |
2 , b [3] , c [4] , d 5 |
6 . На основе них |
|||
можно построить блочную матрицу |
|
|
|||
a |
b |
|
|
|
|
|
используя команду |
|
|
|
|
c |
d |
|
|
|
|
--> [ a b ; c d] <Enter> |
|
|
|
|
|
Или блочную матрицу |
a |
b |
|
|
|
|
|
|
|
||
|
|
d |
c |
|
|
используя команду
--> [ a b ; d c] <Enter>
27
А.В.Сорокин |
Среда вычислений Scilab: Первые шаги |
При построении блочной матрицы размеры соответствующих блоков должны быть согласованы.
Одной еще интересной возможностью является разбиение матрицы на блоки используя оператор двоеточие ( : ) для индексов матрицы.
k:n=[k k+1 k+2 … n-2 n-1 n], k<n
k:m:n=[k k+m k+2m … n-2m n-m n], если n-k нацело делится на m и m>0
2:5=[2 3 4 5] 2:2:12=[2 4 6 8 10 12]
k:-1:n=[k k-1 k-2 … n+2 n+1 n], k>n
k:m:n=[k k-m k-2m … n+2m n+m n], если k-n нацело делится на m и m<0
7:-1:3=[3 4 5 6 7] 13:-2:1=[13 11 9 7 5 3 1]
13:1=[ ] 2:-1:7=[ ]
Рассмотрим это на примере:
a11 |
a12 |
a13 |
|
|
Пусть имеется матрица a a |
a |
a |
|
. Тогда |
21 |
22 |
23 |
|
|
a |
a |
a |
|
|
31 |
32 |
33 |
|
|
команда |
|
|
|
|
--> s=a(1:2,2:3)<Enter> |
|
|
|
|
2 |
3 |
, т.е. блок |
a |
a |
|
|
помещает в переменную s матрицу s |
|
|
12 |
13 |
|
|
|
4 |
5 |
|
a22 |
a23 |
Если необходимо построить матрицу |
a |
a |
|
, то это можно сделать командой |
11 |
13 |
|
||
|
a31 |
a33 |
|
|
--> a([1 3],[1 3]) |
|
|
|
|
Конструкция [1 3] означает, что из матрицы a будут выбраны элементы с индексами 1 и 3. Например
--> a([1 2 3],[1 2 3])
или
--> a(1:3,1:3)
будем соответствовать всей матрице. А команды
--> a([3 2 1],[3 2 1])
или
--> a(3:-1:1,3:-1:1)
28
А.В.Сорокин |
|
Среда вычислений Scilab: Первые шаги |
|||||
|
|
|
a33 |
a32 |
a31 |
|
|
матрице с переставленными строками и столбцами a a |
a |
a |
. |
||||
|
|
|
|
23 |
22 |
21 |
|
|
|
|
a |
a |
a |
|
|
|
|
|
|
13 |
12 |
11 |
|
команда |
|
|
|
|
|
|
|
--> a([1 3 2],[1 2 3]) |
|
|
|
|
|||
выдаст следующую матрицу |
|
|
|
|
|||
a11 |
a13 |
a12 |
|
|
|
|
|
a a |
a |
a |
|
|
|
|
|
21 |
23 |
22 |
|
|
|
|
|
a |
a |
a |
|
|
|
|
|
31 |
33 |
32 |
|
|
|
|
|
Для построения из матрицы a матрицы с вычеркнутой 2-ой строкой можно поступить следующим образом:
--> b=a([1 3], : )
или
--> b=a([1 3], 1:3)
Другим способом удаления строки или столбца является помещение на его место пустой матрицы [ ].
--> a(2, :)=[ ]
Какой способ является предпочтительным, зависит от типа конкретной решаемой задачи.
Используя описанные выше команды можно вычислять миноры матрицы. Рассмотрим
a11 |
a12 |
a13 |
|
|
это на вычислении определителя матрицы a a |
a |
a |
|
раскладываемого по первой |
21 |
22 |
23 |
|
|
a |
a |
a |
|
|
31 |
32 |
33 |
|
|
строке:
d=a(1,1)*(-1)^(1+1)*det(a(2:3,2:3))+ a(1,2)*(-1)^(1+2)*det(a(2:3,[1 3]))+ a(1,3)*(-1)^(1+3)*det(a(2:3,1:2))
Здесь det( ) обозначает функцию вычисления определителя матрицы.
Реализуем метод Крамера для вычисления решения x системы
Ax b
где
29
А.В.Сорокин |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Среда вычислений Scilab: Первые шаги |
|||||||||
|
|
|
|
a11 |
a12 |
a13 |
|
|
b1 |
|
|
|
x1 |
|
|
|
|
|
|
|||||
|
|
|
A a |
|
|
a |
a |
|
|
, |
b b |
|
, |
|
x x |
. |
|
|
|
|
|
|||
|
|
|
|
21 |
22 |
|
23 |
|
|
|
2 |
|
|
|
2 |
|
|
|
|
|
|
|||
|
|
|
|
a |
|
|
a |
a |
|
|
b |
|
|
|
x |
|
|
|
|
|
|
|||
|
|
|
|
31 |
32 |
33 |
|
|
|
3 |
|
|
|
3 |
|
|
|
|
|
|
||||
формулами |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b a |
a |
|
|
|
|
a |
b a |
|
|
|
|
a |
a |
b |
|
||||||||
|
|
1 |
12 |
13 |
|
|
|
|
|
11 |
1 |
13 |
|
|
|
|
11 |
12 |
1 |
|
||||
|
det b2 |
a22 |
a23 |
|
|
det |
a12 |
b2 |
a23 |
|
det a21 |
a22 |
b2 |
|||||||||||
|
b a |
a |
|
|
|
|
a |
b a |
|
|
|
|
a |
a |
b |
|
||||||||
x |
|
3 |
32 |
33 |
|
, |
x |
|
|
|
13 |
3 |
33 |
, |
x |
|
|
31 |
32 |
3 |
|
|||
1 |
|
|
det A |
|
|
|
2 |
|
|
|
det A |
|
|
|
|
3 |
|
|
det A |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
последовательность команд будет такой
--> da=det(a)
--> x1=det([b a(:,2:3)])/da --> x2=det([a(:,1) b a(:,3)])/da --> x3=det([a(:,1:2) b])/da --> x=[x1;x2;x3]
Для проверки необходимо проверить вектор невязки на нуль
Ax b 0 ?
т.е. выполнить команду
--> e =a*x-b
По-другому метод Крамера можно было бы реализовать так
--> da=det(a)
--> сa=a, ca(:,1)=b --> x1=det(ca)/da --> сa=a, ca(:,2)=b --> x2=det(ca)/da --> сa=a, ca(:,3)=b --> x2=det(ca)/da --> x=[x1;x2;x3]
2.5 Создание стандартных матрицы в среде Scilab
Определение размеров матрицы можно делать с помощью функции size --> [n,m]=size(A)
n = 3
m=
3
Для определения длины вектора наряду с функцией size можно использовать функцию length
30
А.В.Сорокин |
Среда вычислений Scilab: Первые шаги |
--> k=length(b) |
|
k = |
|
3 |
|
В среде Scilab имеется три функции, позволяющие создавать следующие матрицы: Для создания единичной матрицы порядка n можно использовать команду eye(n)
--> E=eye(3,3)
E = |
|
|
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
Команда
--> E=eye(2,3)
создает матрицу
E = |
|
|
1 |
0 |
0 |
0 |
1 |
0 |
Для создания матрицы порядка n состоящей из единиц можно использовать команду ones(n)
--> I=ones(3,3)
I = |
|
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
Команда
--> I=ones(3,2)
создает матрицу
I = |
|
1 |
1 |
1 |
1 |
1 |
1 |
Для создания матрицы порядка n состоящей из нулей можно использовать команду zeros(n)
--> Z=zeros(3,3)
31
А.В.Сорокин |
Среда вычислений Scilab: Первые шаги |
|
Z = |
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Команда
--> Z=zeros(1,3)
создает матрицу
Z =
0 0 0
2.6 Функции для обработки матриц
Функция det используется для вычисления определителя матрицы
--> a=[1 2; 2 1]; --> d=det(a)
d=
= - 3
Функция rank используется для вычисления ранга матрицы
--> a=[1 2; 2 1]; --> r=rank(a) r=
= 2
Функция inv используется для вычисления обратной матрицы
--> a=[1 2; 2 1]; --> ia=inv(a)
ai =
-0.3333 |
0.6667 |
|
0.6667 |
-0.3333 |
|
--> a*ia |
|
|
ans = |
|
|
1 |
0 |
|
0 |
1 |
|
Используя эту функцию, можно решать систему линейных алгебраических уравнений ax b с помощью команды
--> x=inv(a)*b
В качестве альтернативы такого способа решения можно предложить два других
32
А.В.Сорокин |
Среда вычислений Scilab: Первые шаги |
|
--> x=a\b |
|
|
и |
|
|
--> x=a^(-1)*b |
|
|
Функция diag используется как для получения из матрицы вектора диагональных |
||
элементов |
|
|
--> a=[1 2; 2 3]; |
|
|
--> h=diag(a) |
|
|
h = |
|
|
1 |
|
|
3 |
|
|
так и для построения матрицы с заданной диагональю |
|
|
--> t=diag(h) |
|
|
t = |
|
|
1 |
0 |
|
0 |
3 |
|
Функция sum используется для суммирования элементов матрицы и вектора :
Суммирование элементов вектора
--> b=[1 2 3] --> s=sum(b) s =
6
Суммирование элементов столбцов
--> a=[1 2;
|
3 4] |
-->s=sum(a,1) |
|
s = |
|
4 |
6 |
Суммирование элементов строк
-->s=sum(a,2) s =
3
7
Функция prod используется для вычисления произведения элементов матрицы и вектора
:
Вычисление произведения элементов вектора
--> b=[1 2 3] --> p=prod(b) p =
6
Вычисление произведения элементов столбцов
--> a=[1 2; 3 4]
-->p=prod(a,1) p =
33