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

Калачиков математические основы mu_dsp_2811

.pdf
Скачиваний:
48
Добавлен:
11.04.2015
Размер:
1.53 Mб
Скачать

Для правильного перемножения нужно транспонировать вторую матрицу. Операция транспонирования выполняется с помощью символа " ' ":

v1*v2' ans =

47.

1.7Применение оператора : (двоеточие)

Очень часто необходимо произвести формирование упорядоченных числовых последовательностей. Такие последовательности нужны, например, для создания векторов со значениями абсциссы при построении графиков или при создании таблиц. Для этого в MATLAB используется оператор : (двоеточие) в виде:

Начальное_значение : Шаг : Конечное_значение

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

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

>> 1:5

ans = 1 2 3 4 5 >> i=0:2:10

i = 0 2 4 6 8 10

>>j=10:-2:2 j = 10 8 6 4 2

>>V=0:pi/2:2*pi;

>>V

V = 0 1.5708 3.1416 4.7124 6.2832.

1.8Логические операторы

Логические операторы и соответствующие им функции служат для реализации поэлементных логических операций над элементами одинаковых по размеру массивов. Они широко используются в управляющих структурах программ.

В таблице 1.3 приведены основные логические операторы.

11

Таблица 1.3 – Основные логические операторы

Оператор

Описание

==

Равно

~=

Не равно

<=

Меньше либо равно

>=

Больше либо равно

&&

Логическое И

||

Логическое ИЛИ

~

Логическое НЕ

&

Поэлементное И

|

Поэлементное ИЛИ

>> 1 < 2 % 1 меньше 2? ans =

1 % Да, результат – логическая единица

>>2 == 0 % 2 равен 0? ans =

0 % Нет, результат равен 0

>>7 > [ 2 10 1 7 ] % Сравнение скалярной величины с векторной

%

ans = % Поэлементное сравнение

1 0 1 0

>>[ 1 1 1 ] & [ 1 0 1 ] % Поэлементное И

ans = 1 0 1

1.9Комплексные числа

В расчетах с комплексными числами следует помнить, что в MATLAB для знака мнимой единицы зарезервированы символы I и J.

>>z = 3 + j*4 % Формирование комплексного числа z = 3 + 4i

>>re = real(z) % Реальная часть

re = 3

>>im = imag(z) % Мнимая часть im = 4

>>a = abs(z) % Модуль

a = 5

>>phi = angle(z) % Фаза phi = 0.92730

>>z2 = a*exp(j*phi)

z2 = 3.0000 + 4.0000i

12

Таблица 1.4 – Операции над комплексными числами

Команда

Описание

Пример

x = real(z)

Определение реальной

>>real(2+3j)

 

части КЧ

ans = 2

y = imag(z)

Мнимая часть КЧ

>> imag(2+3j)

 

 

ans = 3

a = abs(z)

Модуль числа Z

>> abs(-5)

 

 

ans = 5

phi = angle(z)

Фаза числа Z

>> angle(1-j)

 

 

ans = -0.78540

1.10Матрицы и векторы

В Matlab по умолчанию предполагается, что каждая заданная переменная – это вектор, матрица или массив. Все определяется конкретным значением переменной. Например, если задано X=1, то это значит, что X – это вектор с единственным элементом, имеющим значение 1, а точнее даже матрица с размером 1×1. Если надо задать вектор из трех элементов, то их значения следует перечислить в квадратных скобках, разделяя пробелами или запятыми. Так, например, присваивание

>> V=[1 2 3] V = 1 2 3

задает вектор V, имеющий три элемента со значениями 1, 2 и 3 (его можно считать и матрицей размера 3×1). После ввода вектора система выводит его на экран дисплея. Заметим, для вектора столбца нужно разделять элементы знаками «;» (точка с запятой):

>> V=[1; 2; 3] V =

1

2

3

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

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

задает квадратную матрицу, которую можно вывести:

>> M

M =

1 2 3

4 5 6

7 8 9

13

Возможен ввод элементов матриц и векторов в виде арифметических выражений, содержащих любые доступные системе функции, например:

>>V= [2+2/(3+4),exp(5),sqrt(10)];

>>V

V = 2.2857 148.4132 3.1623

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

>>x = linspace(5,10,100); % вектор из 100 элементов в диапазоне от 5 до 10

>>x(1:5)

ans =

5.0000 5.0505 5.1010 5.1515 5.2020

Команда linspace может использоваться при задании вектора значений временных отсчетов или отсчетов частот дискретного спектра.

Для доступа к целым строкам или столбцам матрицы применяют команду двоеточия “:”, которая заменяет тот или иной индекс

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

A =

1 2 3

4 5 6

7 8 9

>>A(1,:) = [] % удаление первой строки

При умножении матриц следует обращать внимание на то, что число

столбцов первой матрицы должно быть равным числу строк второй матрицы.

Поэлементное умножение и сложение матриц:

x = [1 2 3] y = [4 5 6]

>>z = x.*y

z =

4 10 18

>>x.\y, x./y ans =

4.0000 2.5000 2.0000 ans =

0.2500 0.4000 0.5000

Объединение матриц:

>>A = [ 1 2; 3 4 ]; % Матрица размером 2x2

>>B = [ 5 5 ]; % Матрица размером 1x2

>>C = [ A; B ] % Объединение матриц

C = 1 2 3 4 5 5

14

>> D = [ A B' ] D =

1 2 5

3 4 5

Транспонирование матриц:

>> B = A' B =

13

24

1.11Векторизация циклов

Под векторизацией понимается преобразование циклов for и while к эквивалентным векторным или матричным выражениям. При векторизации алгоритма ускоряется выполнение M-файла.

Вот один из способов вычислить 1001 значение функции синуса на интервале [0 10], используя оператор цикла:

i = 0;

for t = 0:.01:10 i = i + 1;

y(i) = sin(t); end

Эквивалентная векторизованная форма имеет вид

t = 0:.01:10; y = sin(t);

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

всистеме MATLAB является предпочтительным.

1.12Предварительное выделение памяти

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

Массив

чисел

zeros

y = zeros(1, 100)

for i

= 1:100

 

 

 

 

y(i) = det(X^i);

 

end

 

 

 

Массив

записей

struct

data = struct([1 3], 'x', [1 3], 'y',

[5

6])

 

 

 

data(3).x = [9 0 2];

 

data(3).y = [5 6 7];

 

Массив

ячеек

cell B = cell(2, 3)

 

 

 

 

15

B{1, 3} = 1:3;

B{2, 2} = 'string';

Предварительное выделение памяти позволяет избежать фрагментации памяти при работе с большими матрицами. В ходе сеанса работы системы MATLAB, память может стать фрагментированной из-за работы механизмов динамического распределения и освобождения памяти. Это может привести к появлению большого количества фрагментов свободной памяти, и непрерывного пространства памяти может оказаться недостаточно для хранения какоголибо большого массива.

1.13Графический вывод результатов вычислений

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

Общие требования к представлению графической информации

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

Требования к оформлению инженерной графической информации отличаются от требований к обычным графикам в математике. Пользовательинженер должен иметь возможность принять такое решение о выборе значения некоторых конструктивных параметров, характеризующих исследуемый процесс или техническое устройство, чтобы его прогнозируемое поведение удовлетворяло заданным условиям. Поэтому инженерные графики должны быть «читабельными», то есть такими, чтобы с их помощью можно было легко отсчитывать значение функции при любых значениях аргумента (и, наоборот) с относительной погрешностью в несколько процентов. Это становится возможным, если координатная сетка графиков соответствует определенным целым числам какого-либо десятичного разряда. Графики, построенные системой MATLAB, полностью отвечают этим требованиям.

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

Для сравнения графиков система позволяет располагать их в одном поле или в одном окне друг под другом.

16

Процедуры и функции графической визуализации

Основной функцией, обеспечивающей построение графиков на экране дисплея, является функция plot. Общая форма обращения к ней такова:

plot(x1,y1,s1,x2,y2,s2,…)

Здесь x1, y1 – заданные векторы, элементами которых являются массивы значений аргумента (x1) и функции (y1), отвечающие первой кривой графика; x2, y2 – массивы значений аргумента и функции второй кривой и т. д. При этом предполагается, что значения аргумента откладываются вдоль горизонтальной оси графика, а значения функции – вдоль вертикальной оси. Переменные s1, s2, … являются символьными (их указание не является обязательным). Любая из них может содержать до трех специальных символов, определяющих соответственно: а) тип линии, которая соединяет отдельные точки графика; б) тип точки графика; в) цвет линии. Если переменные s не указаны, то типом линии по умолчанию является отрезок прямой, типом точки – пиксел, а цвет устанавливается в такой очередности: синий, зеленый, красный, голубой, фиолетовый, желтый, черный, белый.

Графики в MATLAB всегда выводятся в отдельное графическое окно, которое называют фигурой.

Для примера выведем на экран график синусоиды (рисунок 1.1):

x=0:0.001:2*pi; y=sin(x);

 

plot(x,y)

 

 

 

 

 

 

1

 

 

 

 

 

 

 

0.8

 

 

 

 

 

 

 

0.6

 

 

 

 

 

 

 

0.4

 

 

 

 

 

 

 

0.2

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

-0.2

 

 

 

 

 

 

 

-0.4

 

 

 

 

 

 

 

-0.6

 

 

 

 

 

 

 

-0.8

 

 

 

 

 

 

 

-10

1

2

3

4

5

6

7

1

 

 

 

 

 

 

 

0.

 

 

 

 

 

 

 

0.

 

 

 

 

 

 

 

0.

 

 

 

 

 

 

 

0.

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

-1

 

 

 

 

 

 

 

0

1

2

3

4

5

6

7

Рисунок 1.1 – Результат применения функций plot и grid

17

Нанесение сетки из координатных линий обеспечивается с помощью функции grid (рисунок 1.1). При этом сетка координат всегда соответствует «целым» шагам изменения.

Заголовок выводится в графическое поле с помощью процедуры title(’<текст>’). Текст ввода должен всегда помещаться между апострофами. Аналогично можно вывести объяснения к графику, которые размещаются вдоль горизонтальной оси (функция xlabel) и вдоль вертикальной оси (функция ylabel). Применим эти функции для нашего примера (рисунок 1.2):

x=0:0.001:2*pi; y=sin(x);

 

 

 

 

 

plot(x,y);title('Синусоида');

 

 

 

xlabel('Значения x'); ylabel('Значения функции'), grid

 

 

 

 

 

Синусоида

 

 

 

 

1

 

 

 

 

 

 

 

 

0.8

 

 

 

 

 

 

 

 

0.6

 

 

 

 

 

 

 

функции

0.4

 

 

 

 

 

 

 

0.2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Значения

0

 

 

 

 

 

 

 

-0.2

 

 

 

 

 

 

 

 

-0.4

 

 

 

 

 

 

 

 

-0.6

 

 

 

 

 

 

 

 

-0.8

 

 

 

 

 

 

 

 

-10

1

2

3

4

5

6

7

 

 

 

 

 

Значения x

 

 

 

Рисунок 1.2 – Результат применения функций title, xlabel, ylabel

В среде MATLAB несложно выводить и графики, заданные параметрически. Например, построим график функции, которая определена формулами (рисунок 1.3):

x 4e 0.05t sin t; y 0.2e 0.1t sin 2t.

t=0:0.1:50;

x=4*exp(-0.05*t).*sin(t); y=0.2*exp(-0.1*t).*sin(2*t); plot(x,y); title('Параметрическая функция'); xlabel('x'); ylabel('y'); grid

18

 

 

 

 

Параметрическая функция

 

 

 

 

0.2

 

 

 

 

 

 

 

 

 

0.15

 

 

 

 

 

 

 

 

 

0.1

 

 

 

 

 

 

 

 

 

0.05

 

 

 

 

 

 

 

 

y

0

 

 

 

 

 

 

 

 

 

-0.05

 

 

 

 

 

 

 

 

 

-0.1

 

 

 

 

 

 

 

 

 

-0.15

 

 

 

 

 

 

 

 

 

-0.2

 

 

 

 

 

 

 

 

 

-4

-3

-2

-1

0

1

2

3

4

 

 

 

 

 

x

 

 

 

 

Рисунок 1.3 – График параметрически заданной функции

Система MATLAB предоставляет очень удобную возможность ― не указывать аргумент функции при построении ее графика. В таком случае в качестве аргумента система принимает номер элемента вектора, график которого строится. Например, построим график вектора х (рисунок 1.4):

x=[3 5 2 7 3 9 1];

plot(x); title('График вектора x');

xlabel('Номер элемента'); ylabel('Значение элемента'); grid

 

 

 

 

График вектора x

 

 

 

9

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

7

 

 

 

 

 

 

элемента

6

 

 

 

 

 

 

 

 

 

 

 

 

 

Значение

5

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

11

2

3

4

5

6

7

 

 

 

 

Номер элемента

 

 

 

Рисунок 1.4 – График функции без указания значений аргумента

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

19

ных линий для любого из заданных значений аргумента. Это можно сделать, применяя процедуру stem, обращение к которой аналогично обращению к процедуре plot (рисунок 1.5):

stem(x); title('График вектора x');

xlabel('Номер элемента'); ylabel('Значение элемента')

Значение элемента

График вектора x

9

8

7

6

5

4

3

2

1

01

2

3

4

5

6

7

 

 

 

Номер элемента

 

 

 

Рисунок 1.5 – График, построенный с помощью процедуры stem

Полезной является функция hist (построение графика гистограммы заданного вектора). Стандартное обращение к ней имеет вид:

hist(y,x)

где y – вектор, гистограмму которого нужно построить; x – вектор, элементы которого определяют интервал изменения первого вектора. Эта функция осуществляет две операции: 1) подсчитывает количество элементов вектора y, значения которых попадают внутрь соответствующего диапазона, указанного вектором x; 2) строит столбцовую диаграмму подсчитанных чисел элементов вектора y как функцию диапазонов, указанных вектором x.

В качестве примера построим гистограмму вектора у, элементы которого распределены по нормальному закону с математическим ожиданием 0 и среднеквадратическим отклонением 1. Общее количество элементов вектора у 10000 (рисунок 1.6):

x=-2.5:0.05:2.5; y=randn(10000,1);

hist(y,x); title('Гистограмма нормального распределения'); xlabel('x'); ylabel('Вероятность x'); grid

20