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

Раздел 2 - Работа с матрицами в Scilab(230114)

.pdf
Скачиваний:
62
Добавлен:
28.03.2015
Размер:
411.24 Кб
Скачать

А.В.Сорокин

Среда вычислений 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