Автор работы: Пользователь скрыл имя, 24 Апреля 2013 в 18:08, курсовая работа
Среди множества существующих математических пакетов, таких как Mathematica, MathCad и др., система MatLab занимает лидирующее место благодаря удобному встроенному языку программирования для реализации самых разнообразных математических алгоритмов и задач математического моделирования. Кроме того, данный пакет имеет дополнительно инструмент визуального моделирования Simulink, позволяющий строить и исследовать математические модели, не прибегая к их программированию.
Введение
Глава 1. Структура программы. Основные математические операции и типы данных
1.1. Структура программы пакета MatLab
1.2. Простые переменные и основные типы данных в MatLab
1.3. Арифметические операции с простыми переменными
1.4. Основные математические функции MatLab
1.5. Векторы и матрицы в MatLab
1.6. Операции над матрицами и векторами
1.7. Структуры в MatLab
1.8. Ячейки в MatLab
Глава 2. Условные операторы и циклы в MatLab
2.1. Условный оператор if
2.2. Условный оператор switch
2.3. Оператор цикла while
2.4. Оператор цикла for
Глава 3. Работа с графиками в MatLab
3.1. Функция plot
3.2. Оформление графиков
3.3. Отображение трехмерных графиков
3.4. Отображение растровых изображений
Глава 4. Программирование функций в MatLab
4.1. Порядок определения и вызова функций
4.2. Область видимости переменных
Глава 5. Работа с файлами в MatLab
5.1. Функции save и load
5.2. Функции fwrite и fread
5.3. Функции fscanf и fprintf
5.4. Функции imread и imwrite
Часто возникает необходимость определения общего числа элементов в векторе, т.е. определения его размера. Это можно сделать, воспользовавшись функцией length() следующим образом:
N = length(a); % (N=4) число элементов массива а
Если требуется задать вектор-столбец, то это можно сделать так
a = [1; 2; 3; 4]; % вектор-столбец
или так
b = [1 2 3 4]’; % вектор-столбец
при этом доступ к элементам векторов осуществляется также как и для векторов-строк.
Следует отметить, что
векторы можно составлять не только
из отдельных чисел или
a
= [1 2 3 4]; % начальный вектор a = [1 2 3 4]
b = [a 5 6];
% второй вектор b = [1 2 3 4 5 6]
Здесь вектор b состоит из шести элементов и создан на основе вектора а. Используя этот прием, можно осуществлять увеличение размера векторов в процессе работы программы:
a = [a 5]; % увеличение вектора а на один элемент
Недостатком описанного способа задания (инициализации) векторов является сложность определения векторов больших размеров, состоящих, например, из 100 или 1000 элементов. Чтобы решить данную задачу, в MatLab существуют функции инициализации векторов нулями, единицами или случайными значениями:
a1
= zeros(1, 100); % вектор-строка, 100 элементов
с
% нулевыми
значениями
a2 = zeros(100,
1); % вектор-столбец, 100 элементов с
% нулевыми
значениями
a3 = ones(1,
1000); % вектор-строка, 1000 элементов с
% единичными
значениями
a4 = ones(1000,
1); % вектор-столбец, 1000 элементов с
% единичными
значениями
a5 = rand(1000,
1); % вектор-столбец, 1000 элементов со
% случайными
значениями
Матрицы в MatLab задаются аналогично векторам с той лишь разницей, что указываются обе размерности. Приведем пример инициализации единичной матрицы размером 3х3:
E = [1 0 0; 0 1 0; 0 01]; % единичная матрица 3х3
или
E
= [1 0 0
0 1 0
0 0 1]; % единичная
матрица 3х3
Аналогичным образом можно задавать любые другие матрицы, а также использовать приведенные выше функции zeros(), ones() и rand(), например:
A1 = zeros(10,10); % нулевая матрица 10х10 элементов
или
A2
= zeros(10); % нулевая матрица 10х10 элементов
A3 = ones(5);
% матрица 5х5, состоящая из единиц
A4 = rand(100);
% матрица 100х100, из случайных чисел
Для доступа к элементам
матрицы применяется такой же
синтаксис как и для векторов,
но с указанием строки и столбца
где находится требуемый
A
= [1 2 3;4 5 6;7 8 9]; % матрица 3х3
disp( A(2,1)
); % вывод на экран элемента, стоящего во
% второй
строке первого столбца, т.е. 4
disp( A(1,2)
); % вывод на экран элемента, стоящего в
% первой
строке второго столбца, т.е. 2
Также возможны операции выделения указанной части матрицы, например:
B1
= A(:,1); % B1 = [1; 4; 7] – выделение первого столбца
B2 = A(2,:);
% B2 = [1 2 3] – выделение первой строки
B3 = A(1:2,2:3);
% B3 = [2 3; 5 6] – выделение первых двух
% строк
и 2-го и 3-го столбцов матрицы А.
Размерность любой матрицы или вектора в MatLab можно определить с помощью функции size(), которая возвращает число строк и столбцов переменной, указанной в качестве аргумента:
a
= 5; % переменная а
A = [1 2 3];
% вектор-строка
B = [1 2 3; 4
5 6]; % матрица 2х3
size(a) % 1х1
size(A) % 1х3
size(B) % 2х3
В системе MatLab достаточно просто выполняются математические операции над матрицами и векторами. Рассмотрим сначала простые операции сложения и умножения матриц и векторов. Пусть даны два вектора
a
= [1 2 3 4 5]; % вектор-строка
b = [1; 1; 1;
1; 1]; % вектор-столбец
тогда умножение этих двух векторов можно записать так
c
= a*b; % c=1+2+3+4+5=16
d = b*a; % d
– матрица 5х5 элементов
В соответствии с операциями над векторами, умножение вектор-строки на вектор-столбец дает число, а умножение вектор-столбца на вектор-строку дает двумерную матрицу, что и является результатом вычислений в приведенном примере, т.е.
Сложение и вычитание двух векторов записывается так
a1
= [1 2 3 4 5];
a2 = [5 4 3 2
1];
c = a1+a2; %
c = [1+5, 2+4, 3+3, 4+2, 5+1];
с = a2-a1; %
c = [5-1, 4-2, 3-3, 2-4, 1-5];
Следует обратить внимание, что операции
сложения и вычитания можно выполнять
между двумя векторами-
Аналогичным образом выполняются операции умножения и сложения между матрицами:
A
= [1 2 3; 4 5 6; 7 8 9];
B = ones(3);
C = A+B; % сложение
двух матриц одинакового размера
D = A+5; % сложение
матрицы и числа
E = A*B; % умножение
матрицы А на В
F = B*A; % умножение
матрицы В на А
G = 5*A; % умножение
матрицы на число
Операции вычисления обратной матрицы, а также транспонирования матриц и векторов, записываются следующим образом:
a
= [1 1 1]; % вектор-строка
b = a’; % вектор-столбец,
образованный
% транспонированием
вектора-строки а.
A = [1 2 3; 4
5 6; 7 8 9]; % матрица 3х3 элемента
B = a*A; % B
= [12 15 18] – вектор-строка
C = A*b; % C
= [6; 15; 24] – вектор-столбец
D = a*A*a’;
% D = 45 – число, сумма эл-ов матрицы А
E = A’; % E
– транспонированная матрица А
F = inv(A); %
F – обратная матрица А
G = A^-1; % G
– обратная матрица А
Из приведенного примера видно, что операция транспонирования матриц и векторов обозначается символом ‘ (апостроф), который ставится после имени вектора или матрицы. Вычисление обратной матрицы можно делать путем вызова функции inv() или возводя матрицу в степень -1. Результат в обоих случаях будет одинаковым, а два способа вычисления сделано для удобства использования при реализации различных алгоритмов.
Если в процессе вычислений требуется поэлементно умножить, разделить или возвести в степень элементы вектора или матрицы, то для этого используются операторы:
.* - поэлементное умножение;
./ и .\ - поэлементные деления;
.^ - поэлементное возведение в степень.
Рассмотрим работу данных операторов на следующем примере.
a
= [1 2 3]; % вектор-строка
b = [3 2 1];
% вектор-строка
c = a.*b; % c
= [3 4 3]
A = ones(3);
% матрица 3х3, состоящая из единиц
B = [1 2 3;4
5 6; 7 8 9]; % матрица 3х3
C = A.*B; % матрица
3х3, состоящая из
D = A./B; % матрица
3х3, состоящая из
E = A.\B; % матрица
3х3, состоящая из
F = A.^2; % возведение
элементов матрицы А в квадрат
В заключении данного параграфа рассмотрим несколько функций полезных при работе с векторами и матрицами.
Для поиска максимального значения элемента вектора используется стандартная функция max(), которая возвращает найденное максимальное значение элемента и его позицию (индекс):
a
= [1 6 3 4];
[v, i] = max(a);
% v = 6, i = 2;
или
v = max(a); % v = 6;
Приведенный пример показывает два разных способа вызова функции max(). В первом случае определяется и максимальное значение элемента и его индекс в векторе, а во втором – только максимальное значение элемента.
В случае с матрицами, данная функция определяет максимальные значения, стоящие в столбцах, как показано ниже в примере:
A
= [4 3 5; 6 7 2; 3 1 8];
[V, I] = max(A);
% V=[6 7 8], I = [2 2 3]
V = max(A); %
V=[6 7 8]
Полный синтаксис функции max() можно узнать, набрав в командном окне MatLab команду
help <название функции>
Аналогичным образом работает функция min(), которая определяет минимальное значение элемента вектора или матрицы и его индекс.
Другой полезной функцией работы с матрицами и векторами является функция sum(), которая вычисляет сумму значений элементов вектора или столбцов матрицы:
a
= [3 5 4 2 1];
s = sum(a);
% s = 3+5+4+2+1=15
A = [4 3 5; 6
7 2; 3 1 8];
S1 = sum(A);
% S1=[13 11 15]
S2 = sum(sum(A));
% S2=39
При вычислении суммы S2 сначала вычисляется сумма значений элементов матрицы А по столбцам, а затем, по строкам. В результате, переменная S2 содержит сумму значений всех элементов матрицы А.
Для сортировки значений элементов вектора или матрицы по возрастанию или убыванию используется функция sort() следующим образом:
a = [3 5 4 2 1];
b1
= sort(a); % b1=[1 2 3 4 5]
b2 = sort(a,
‘descend’); % b2=[5 4 3 2 1]
b3 = sort(a,
‘ascend’); % b3=[1 2 3 4 5]
для матриц
A
= [4 3 5; 6 7 2; 3 1 8];
B1 = sort(A);
% B1=[3 1 2
% 4 3 5
% 6 7 8]
B2 = sort(A,
‘descend’); % B2=[6 7 8
% 4 3 5
% 3 1 2]
Во многих практических задачах
часто требуется найти
a
= [3 5 4 2 1];
b1 = find(a ==
2); % b1 = 4 – индекс элемента 2
b2 = find(a ~=
2); % b2 = [1 2 3 5] – индексы без 2
b3 = find(a >
3); % b3 = [2 3]
В приведенном примере символ ‘= =’ означает проверку на равенство, а символ ‘~=’ выполняет проверку на неравенство значений элементов вектора а. Более подробно об этих операторах будет описано в разделе условные операторы.
Еще одной полезной функцией работы
с векторами и матрицами
a
= [3 5 4 2 1];
m = mean(a);
% m = 3
A = [4 3 5; 6
7 2; 3 1 8];
M1 = mean(A);
% M1 = [4.333 3.667 5.000]
M2 = mean(mean(A));
% M2 = 4.333
При разработке программ важным является выбор эффективного способа представления данных. Во многих случаях недостаточно объявить простую переменную или массив, а нужна более гибкая форма представления данных. Таким элементом может быть структура, которая позволяет включать в себя разные типы данных и даже другие структуры. Структуры задаются следующим образом:
S
= struct('field1',VALUES1,'
где field1 – название первого поля структуры; VALUES1 – переменная первого поля структуры, и т.д.
Приведем пример, в
котором использование
S
= struct('title','','author','',
В итоге задается структура с тремя полями: title, author и year. Каждое поле имеет свой тип данных и значение.
Для того, чтобы записать в эту структуру конкретные значения используется оператор ‘.’ (точка) для доступа к тому или иному полю структуры:
S.title
= 'Евгений Онегин';
S.author = 'Пушкин';
S.year = 2000;
и таким образом, переменная S хранит информацию о выбранной книге.
Однако по условиям задачи необходимо осуществлять запись не по одной, а по 100 книгам. В этом случае целесообразно использовать вектор структур lib, который можно задать следующим образом:
lib(100,1)
= struct('title','','author','',
и записывать информацию о книгах так:
lib(1).title
= 'Евгений Онегин';
lib(1).author
= 'Пушкин';
lib(1).year =
2000;
Данный пример показывает удобство хранения информации по книгам. Графически массив структур можно представить в виде таблицы, в которой роль столбцов играют поля, а роль строк элементы массива структур (рис. 1.1).
При работе со структурами полезными являются следующие функции:
isstruct(
S ) – возвращает истину, если аргумент
структура
isfield( S, 'name')
– возвращает истину, если имеется такое
поле
fieldnames( S
) – возвращает массив строк с именами
всех полей
которые позволяют программно определить всю необходимую информацию о той или иной структуре и корректно выполнять обработку ее полей.
|
название |
автор |
год издания |
lib[1] |
lib[1].title |
lib[1].author |
lib[1].year |
|
|
|
|
lib[2] |
lib[2].title |
lib[2].author |
lib[2].year |
|
|
|
|
lib[3] |
lib[3].title |
lib[3].author |
lib[3].year |
|
|
| |
lib[100] |
lib[100].title |
lib[100].author |
lib[100].year |
Рис. 1.1. Графическое представление массива структур хранения информации по 100 книгам
Ячейки также как и структуры могут содержать разные типы данных, объединенные одной переменной, но в отличии от вектора структур, вектор ячеек может менять тип данных в каждом элементе. Таким образом, вектор ячеек является универсальным контейнером – его элементы могут содержать любые типы и структуры данных, с которыми работает MatLab – векторы чисел любой размерности, строки, векторы структур и другие (вложенные) векторы ячеек.