Задания для самостоятельного решения



1. Запустить СКМ Matlab. Настроить интерфейс рабочего стола. Рабочим каталогом назначить папку, отведенную для хранения файлов студентов.

2. Задать числовые значения переменным х и у и вычислить значения арифметических выражений, заданных вариантом (табл. 1.8). Вывести результат в различных форматах представления чисел.

3. Используя операции отношения сравнить результаты вычислений для различных значений переменных х и у.

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

Таблица 1.8

Вариант Арифметическое выражение
1
2
3
4

 

 

Окончание таблицы 1.8

 

Вариант Арифметическое выражение
5
6
7
8
9
10
11
12

 

 

РАБОТА С МАТРИЦАМИ В MATLAB

Общие сведения

Matlab является компьютерной системой, которая предназначена для осуществления операций с матрицами. Матрица, столбец, строка – это математические объекты. Способом их представления и хранения в памяти компьютера является массив (Array). По умолчанию в Matlab принято, что любая заданная переменная представляет собой массив. Под матрицей понимается двумерный массив , под вектором – одномерный:  – вектор-строка или  – вектор-столбец. Отдельно заданное значение (скаляр) Matlab воспринимает как массив размером . В программировании массив это совокупность однотипных значений, упорядоченных по индексам. У массива, как и у любой переменной, должно быть имя. Все элементы одного массива имеют одинаковое имя – имя массива и различаются порядковыми номерами (индексами). Индексы однозначно определяют положение элемента в массиве.

В Matlab разрешены только натуральные индексы. Все элементы массива одинаково доступны. Для инженера больший интерес представляет сам объект – матрица, нежели способ его хранения – массив. Поэтому в дальнейшем будут преимущественно использоваться слова "матрица" и "вектор". Для обозначения матриц в математическом тексте принято использовать прописные, а для векторов – строчные полужирные буквы прямого шрифта. Для их отдельных элементов – буквы строчного курсива. Например,  – первый элемент вектора b,  – элемент матрицы А, стоящий во второй строке в третьем столбце (рис. 2.1, а). В памяти компьютера Matlab хранит матрицу по столбцам (рис. 2.1, б). Это может быть важным при выполнении операций над матрицей и адресации отдельных ее элементов.

 

                   а                                                                 б

Рис. 2.1. Матрица А и ее представление в памяти

 

Одномерные массивы – векторы

Для определенности будем рассматривать числовые данные. Векторы – это линейные наборы чисел (элементов), в которых позиция каждого элемента задаётся единственным числом – его номером. Можно говорить о первом элементе вектора, о втором и т.д. Matlab различает прописные и строчные буквы. Поэтому в тексте программы или в командной строке и вектор в целом, и отдельный его элемент обозначаются одними и теми же символами. Элемент отличается тем, что за его именем обязательно стоит индекс, заключенный в круглые скобки. В общем случае индекс может быть вычисляемым объектом, т.е. задаваться выражением.

Для создания вектора, состоящего из нескольких чисел, чаще всего используется операция конкатенации (сцепления, объединения), обозначаемая в Matlab с помощью квадратных скобок – [ ]. Элементы, объединяемые в массив, должны отделяться друг от друга разделителями. При формировании вектора-строки в качестве разделителя можно использовать пробел и/или запятую. Например, выражение

>> a=[1 2 3]

a =

1 2 3

формирует переменную с именем a, являющуюся вектором-строкой из трёх чисел. Поскольку в конце командной строки не поставлен символ подавления эхо-печати – точка с запятой, то после нажатия на Enter на экране распечатался результат выполнения команды – содержимое созданной переменной с именем а (строки результата не предваряются символом >>). Из результата хорошо видно, что а именно вектор-строка. Аналогичный результат можно получить, выполнив выражение

>> b=[10,20,30]

b =

10 20 30

В этом примере разделителем элементов при формировании вектора являлась запятая. Можно одновременно использовать оба разделителя или задавать значения элементов через несколько пробелов. Вектор можно формировать и поэлементно (прописать каждый элемент отдельно, не используя конкатенацию). Например,

>> c(1)=1.5; c(2)=2*c(1)

c =

1.5000 3.0000

В первой строке примера сформирован вектор с из двух элементов, причем второй имеет в двое большее значение, чем первый. Во второй и третьей строках дано эхо Matlab – печать результата. После выполнения этих примеров в рабочем пространстве будут размещены три переменные с именами a, b и с (рис. 2.2).

Рис. 2.2. Создание векторов-строк

 

В колонке Size рабочего пространства Workspace хорошо видно, что созданы именно векторы-строки – для них указаны размеры типа . Теперь можно корректировать значения элементов созданных переменных, добавлять в них новые элементы, объединять векторы (конкатенировать). Например,

>> a(3)=13; a(4)=4

a =

1 2 13 4

>> b=[b 4.25]

b =

10.0000 20.0000 30.0000 4.2500

>> c=[7.5 c a]

c =

7.5000 1.5000 3.0000 1.0000 2.0000 13.0000 4.0000

В векторе a изменили значение третьего элемента со старого, равного 3, на новое, равное 13, и добавили четвертый элемент. К вектору b тоже добавили четвертый элемент, равный 4,25, но технологией конкатенации. В начало вектора с добавлен элемент (уже имеющиеся элементы автоматически сдвинулись вправо на один индекс), а в его конец ("в хвост") конкатенированы элементы вектора a (сам вектор а от этого не изменяется). Вектор с стал длиной в 7 элементов.

Текущую длину одномерного массива (количество элементов в нем) всегда можно узнать с помощью функции length (длина)

length(с)

ans =

7

Векторы могут состоять не только из вещественных чисел. Выражение

d = [1+2j, 2+3j, 3-4j];

формирует вектор-строку d из трех комплексных чисел.

Выражение

>> d = [];

сделает вектор пустым (переменная d сохранится в Workspace, но размер ее будет 0×0).

>> с=[ [] 3]

с =

3

сначала очистит переменную с (сделает вектор пустым), а потом добавит в нее первый (и он будет единственный) элемент, равный 3.

Внимание: 1. При попытке адресации несуществующего элемента, например пятого элемента вектора a, в командном окне Matlab появится сообщение об ошибке

>> a(5)

??? Index exceeds matrix dimensions.

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

>> a(5) = -17;

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

> d=[];

>> d(3)=3; d(7)=17

d =

0 0 3 0 0 0 17

В результате в векторе d будет семь элементов.

Для задания значений компонентов вектора-столбца используются те же приемы, но в качестве разделителей элементов выступает символ ";" – точка с запятой. Например,

>> a=[1; 5; 10]

 

a =

1

5

10

>> b=[2 4]'

b =

2

4

>> c=[a; b]

c =

1

5

10

2

4

>> d=[6

     9]

d =

6

9

Здесь вектор b получается из вектора-строки при помощи операции транспонирования, обозначаемой символом ' (апостроф). Вектор с формируется конкатенацией двух столбцов a и b. При формировании столбца d в качестве разделителя элементов используется признак конца строки (нажатие на Enter). В результате четырех операций присваивания в рабочем пространстве (рис. 2.3) будет сформировано четыре вектора-столбца (в колонке Size размер переменных указан по типу  – столбец из m строк и в колонке Value значения компонентов перечислены хоть и в строку, но через точку с запятой). Тип (класс) элементов у всех векторов double – числовой двойной точности.

Рис. 2.3. Векторы-столбцы в Workspace

 

Двумерные массивы – матрицы

Сказанное ранее о векторах справедливо и для матриц. Матрицу можно рассматривать как вектор-столбец из векторов-строк и задавать в командной строке

>> a=[1 2 3; 4 5 6]

a =

1 2 3

4 5 6

или как вектор-строку из векторов-столбцов

>> a=[[1; 4] [2; 5] [3; 6]]

a =

1 2 3

4 5 6

или вводить "классическим" способом – строку за строкой, нажимая после элементов каждой строки на Enter

>> a=[1 2 3

     4 5 6]

a =

1 2 3

4 5 6

Во всех трех случаях результат одинаков. У элемента матрицы два индекса, которые указываются в круглых скобках: первым – номер строки, вторым через запятую – номер столбца, на пересечении которых стоит элемент. Отдельный элемент матрицы (как впрочем, и вектора) может использоваться в выражениях наравне со скалярами. Например, используя элементы введенной выше матрицы а , можно вычислить значение  следующим образом:

>> c=a(1,2)^3-sqrt(a(2,1))

c =

6

Индекс может быть и вычисляемым (задаваться выражением)

>> m=2; n=m+1;

>> a(m-1,n)

ans =

3

Добавить к существующей матрице строку или столбец можно конкатенацией. Например,

>> b=[7 8 9]

7 8 9

>> a=[a; b]

a =

1 2 3

4 5 6

7 8 9

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

>> a=[a; [1 2 3 4]]

??? Error using ==> vertcat

All rows in the bracketed expression must have the same number of columns.

Этим сообщением Matlab извещает, что ошибочно используется вертикальная конкатенация. Все строки в выражении, заключенном в скобки, должны иметь одинаковое число столбцов. По аналогии можно выполнять и конкатенацию матриц. Например, горизонтальная конкатенация матриц (по столбцам)

>> a1=[1 2 3; 4 5 6]

a1 =

1 2 3

4 5 6

>> a2=[11 12 13 14; 15 16 17 18]

a2 =

11 12 13 14

15 16 17 18

>> a=[a1 a2]     % матрицы с одинаковым числом строк

a =

1 2 3 11 12 13 14

4 5 6 15 16 17 18

Вертикальная конкатенация матриц (по строкам)

>> b1=[1 2 3; 4 5 6; 7 8 9]

b1 =

1 2 3

4 5 6

7 8 9

>> b2=[11 12 13; 14 15 16]

b2 =

11 12 13

14 15 16

>> b=[b1; b2] % матрицы с одинаковым числом столбцов

b =

1 2 3

4 5 6

7 8 9

11 12 13

14 15 16

Текущий размер матрицы – число строк и столбцов – можно определить с помощью функции size (размер)

>> a=[1 2; 3 4; 5 6]

a =

1 2

3 4

5 6

>> size(a)

ans =

3 2

В ответе первым указывается число строк, вторым – число столбцов матрицы. Результат работы функции size (как и любой другой функции) можно сохранить в переменных и в дальнейшем использовать. По правилам языка слева от оператора присваивания может стоять имя только одной переменной. Например, можно записать

>> s=size(a)

s =

3 2

Из эхо-печати результата видно, что переменная s будет вектором-строкой, первый элемент которой равен числу строк матрицы а, второй – числу ее столбцов. И если требуется использовать в вычислениях, например, число строк матрицы, то в тексте программы необходимо указать s(1) – первый элемент вектора. Применять переменные с индексом не всегда комфортно. Удобнее было бы иметь две скалярные переменные – отдельные число строк и число столбцов. Ситуацию можно разрешить несколькими способами. Можно поэлементно разнести массив по скалярам

>> numrow=s(1)

numrow =

3

>> numcol=s(2)

numcol =

2

А можно "обмануть" Matlab – разместить результат в два скаляра, конкатенированных вектор

>> [numrow numcol]=size(a)

numrow =

3

numcol =

2

Формально правила языка не нарушены, слева от знака = указан один объект – вектор, но только задан он не именем переменной, как обычно. Красиво! И, конечно же, никакого обмана здесь нет! Такая конструкция выражения присваивания официально используется в Matlab при работе с функциями, возвращающими несколько значений (и даже больше двух, и даже разных типов). Пример является поучительным, поскольку прием конкатенации отдельных переменных и/или констант в вектор часто используется в Matlab в случаях, когда необходимо разместить несколько объектов, а разрешен только один.

Сделать матрицу любого размера пустой можно одной операцией присваивания

>> b=[];

>> size(b)

ans =

0 0

Внимание: "пустая матрица" не значит "несуществующая"! Имя пустой матрицы b сохраняется в Workspace и в дальнейшем может использоваться для формирования матрицы любого размера, в том числе и , т.е. скаляра.

Использование двоеточия

4.1. Автозаполнение

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

ИмяВектора = НачальноеЗначение : Шаг : КонечноеЗначение

Например,

>> x=1:0.2:2

x =

1.0000 1.2000 1.4000 1.6000 1.8000 2.0000

формируется вектор-строка из шести элементов, имеющих значение от 1 до 2 с шагом 0,2. Формирование вектора-столбца может быть выполнено следующим образом:

>> y=(-2:2:4)'

y =

-2

0

2

4

В этом примере круглые скобки используются для корректного размещения символа операции транспонирования (транспонируется весь результат – строка значений от -2 до 4 с шагом 2, а не число 4, как было бы в отсутствии скобок). Впрочем, вместо круглых скобок можно в данном примере можно использовать и более привычные для вектора квадратные скобки.

Шаг может быть и отрицательным

>> x=1:-0.2:-0.3

x =

1.0000 0.8000 0.6000 0.4000 0.2000 -0.0000 -0.2000

В этом примере последнее значение в векторе-строке не равно заданному конечному значению -0,3, так как шаг не укладывается в диапазон [1; -0,3] целое число раз. Поэтому Matlab заканчивает генерацию элементов вектора досрочно.

Шаг, равный единице, при автозаполнении можно и не указывать

>> x=1:5

x =

1 2 3 4 5

 

4.2. Индексация

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

>> x=11:17

x =

11 12 13 14 15 16 17

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

>> x(2)=0; x(3)=0; x(4)=0; x(5)=0; x(6)=0

x =

11 0 0 0 0 0 17

Результат получен за пять операций присваивания. Хлопотно! Индексация при помощи двоеточия позволяет решить эту задачу быстрее и изящнее

>> x(2:6)=0

x =

11 0 0 0 0 0 17

Последний элемент массива (матрицы или вектора) можно адресовать, используя слово end. Например, пусть требуется в векторе произвольной длины каждый элемент с нечетным номером сделать равным -1. Красивое решение этой задачи без явного циклического перебора, без непосредственной адресации элементов, с автоматическим определением конца интервала обработки может быть следующим:

>> y(1:2:end)=-1

y =

-1   2 -1 4 -1 6 -1 8 -1 10

Особенно эффективно использование двоеточия при работе с матрицами. Например, выражение a(:, 1) следует понимать как все строки первого столбца матрицы а (выделение из матрицы вектора-столбца); a(2, :) – все столбцы второй строки матрицы а (выделение из матрицы вектора-строки); а(:, 2:3) – выделение подматрицы (все строки второго и третьего столбцов матрицы); а(2:4, 3:5) – выделение подматрицы (столбцы с третьего по пятый строк со второй по четвертую); (a(2:2:end,end) – элементы четных строк последнего столбца матрицы а; а(:) – растягивание матрицы в вектор-столбец (элементы в результирующем векторе располагаются так, как они записаны в памяти (см. рис. 2.1))

>> a=[11 12 13 14; 21 22 23 24; 31 32 33 34]

a =

11 12 13 14

21 22 23 24

31 32 33 34

>> a=a(:)'

В результате получим

a =

Columns 1 through 7

11 21 31 12 22 32 13

Columns 8 through 12

23 33 14 24 34

Здесь значения элементов матрицы заданы равными их индексам (например, ). Знак транспонирования использован для преобразования в вектор-строку. Вектор-строка получилась длинной и не уместилась при эхо-печати в одну строку экрана. Поэтому Matlab распечатал результат в две строки, предварив печать каждой сообщением о номерах элементов напечатанных в ней: "Columns 1 through 7" – столбцы с 1 по 7 (элементы вектора названы столбцами, потому что получившаяся в результате растягивания и транспонирования переменная а – строка с размерами , т.е. это фактически матрица из одной строки и двенадцати столбцов).

Знак двоеточия можно использовать для адресации элементов при конкатенации

а2=[а(:, 1), b, а(:, 3)]

что означает сформировать матрицу а2 как строку (последовательность) из трех столбцов: первый взять равным первому столбцу матрицы a, второй – равным вектору-столбцу b, а третий – равным третьему столбцу матрицы a. Как и прежде, необходимо согласовывать размеры сцепляемых массивов.


Дата добавления: 2021-02-10; просмотров: 96; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!