Автор работы: Пользователь скрыл имя, 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
Второй оператор управления выполнением цикла continue позволяет пропускать выполнение фрагмента программы, стоящий после него. Например, требуется подсчитать сумму элементов массива
a = [1 2 3 4 5 6 7 8 9];
исключая элемент с индексом 5. Такую программу можно записать следующим образом:
function
sum_array
S = 0; % начальное
значение суммы
a = [1 2 3 4
5 6 7 8 9]; % массив
i=0; % счетчик
индексов массива
while i <
length(a) % цикл (работает пока i меньше
% длины
массива а)
i=i+1; % увеличивается
счетчик индексов на 1
if i == 5 %
если индекс равен 5
continue; %
то его не подсчитываем
end
S=S+a(i); %
подсчитывается сумма элементов
end % конец
цикла
disp(S); % отображение
суммы 40 на экране
Следует отметить, что в данной программе увеличение индекса массива i происходит до проверки условия. Это сделано для того, чтобы значение индекса увеличивалось на 1 на каждой итерации работы цикла. Если увеличение счетчика i записать как в предыдущих примерах, т.е. после подсчета суммы, то из-за оператора continue его значение остановилось бы на 5 и цикл while работал бы «вечно».
Часто при организации цикла требуется перебирать значение счетчика в заданном диапазоне значений и с заданным шагом изменения. Например, чтобы перебрать элементы вектора (массива), нужно организовать счетчик от 1 до N с шагом 1, где N – число элементов вектора. Чтобы вычислить сумму ряда, также задается счетчик от a до b с требуемым шагом изменения step. И так далее. В связи с тем, что подобные задачи часто встречаются в практике программирования, для их реализации был предложен свой оператор цикла for, который позволяет проще и нагляднее реализовывать цикл со счетчиком.
Синтаксис оператора цикла for имеет следующий вид:
for
<счетчик> = <начальное значение>:<шаг>:<конечное
значение>
<операторы
цикла>
end
Рассмотрим работу данного цикла на примере реализации алгоритма поиска максимального значения элемента в векторе:
function
search_max
a = [3 6 5 3
6 9 5 3 1 0];
m = a(1); % текущее
максимальное значение
for i=1:length(a)
% цикл от 1 до конца вектора с
% шагом
1 (по умолчанию)
if m < a(i)
% если a(i) > m,
m = a(i); %
то m = a(i)
end
end % конец
цикла for
disp(m);
В данном примере цикл for задает счетчик i и меняет его значение от 1 до 10 с шагом 1. Обратите внимание, что если величина шага не указывается явно, то он берется по умолчанию равным 1.
В следующем примере рассмотрим реализацию алгоритма смещения элементов вектора вправо, т.е. предпоследний элемент ставится на место последнего, следующий – на место предпоследнего, и т.д. до первого элемента:
function
queue
a = [3 6 5 3
6 9 5 3 1 0];
disp(a);
for i=length(a):-1:2
% цикл от 10 до 2 с шагом -1
a(i)=a(i-1);
% смещаем элементы вектора а
end % конец
цикла for
disp(a);
Результат работы программы
3
6 5 3 6 9 5 3 1 0
3 3 6 5 3 6 9
5 3 1
Приведенный пример показывает, что для реализации цикла со счетчиком от большего значения к меньшему, нужно явно указывать шаг, в данном случае, -1. Если этого не сделать, то цикл сразу завершит свою работу и программа будет работать некорректно.
В заключении рассмотрим работу оператора цикла for на примере моделирования случайной последовательности с законом изменения
где - коэффициент от -1 до 1; - нормальная случайная величина с нулевым математическим ожиданием и дисперсией
где - дисперсия моделируемого случайного процесса. При этом первый отсчет моделируется как нормальная случайная величина с нулевым математическим ожиданием и дисперсией . Программа моделирования имеет следующий вид:
function
modeling_x
r = 0.95; % коэффициент
модели
N = 100; % число
моделируемых точек
ex = 100; %
дисперсия процесса
et = ex*(1-r^2);
% дисперсия случайной добавки
x = zeros(N,1);
% инициализация вектора х
x(1) = sqrt(ex)*randn;
% моделирование 1-го отсчета
for i=2:N % цикл
от 2 до N
x(i)=r*x(i-1)+sqrt(et)*randn;
end % конец
цикла
plot(x); % отображение
СП в виде графика
При выполнении данной программы будет показана реализация смоделированной случайной последовательности .
Рис. 2.1. Результат моделирования случайной последовательности.
Работа программы начинается с определения переменных , (в программе переменная ex) и для реализации указанной модели. Затем вычисляется дисперсия и моделируется первый отсчет случайного процесса с помощью функции randn. Функция randn выполняет генерацию нормальных случайных величин с нулевым средним и единичной дисперсией. Чтобы сгенерировать случайную величину с дисперсией достаточно случайную величину с единичной дисперсией умножить на , т.к. дисперсия – это средний квадрат случайной величины относительно математического ожидания. В результате имеем программную строчку
x(1) = sqrt(ex)*randn;
Затем, реализуется цикл
for со счетчиком i от 2 до N с шагом 1. Внутри
цикла выполняется
MatLab предоставляет богатый инструментарий по визуализации данных. Используя внутренний язык, можно выводить двумерные и трехмерные графики в декартовых и полярных координатах, выполнять отображение изображений с разной глубиной цвета и разными цветовыми картами, создавать простую анимацию результатов моделирования в процессе вычислений и многое другое.
Рассмотрение возможностей MatLab по визуализации данных начнем с двумерных графиков, которые обычно строятся с помощью функции plot(). Множество вариантов работы данной функции лучше всего рассмотреть на конкретных примерах.
Предположим, что требуется вывести график функции синуса в диапазоне от 0 до . Для этого зададим вектор (множество) точек по оси Ox, в которых будут отображаться значения функции синуса:
x = 0:0.01:pi;
В результате получится вектор столбец со множеством значений от 0 до и с шагом 0,01. Затем, вычислим множество значений функции синуса в этих точках:
y = sin(x);
и выведем результат на экран
plot(x,y);
В результате получим график, представленный на рис. 3.1.
Представленная запись функции plot() показывает, что сначала записывается аргумент со множеством точек оси Ох, а затем, аргумент со множеством точек оси Oy. Зная эти значения, функция plot() имеет возможность построить точки на плоскости и линейно их интерполировать для придания непрерывного вида графика.
Рис. 3.1. Отображение функции синуса с помощью функции plot().
Функцию plot() можно записать и с одним аргументом x или y:
plot(x);
plot(y);
в результате получим два разных графика, представленные на рис. 3.2.
Анализ рис. 3.2 показывает, что в случае одного аргумента функция plot() отображает множество точек по оси Oy, а по оси Оx происходит автоматическая генерация множества точек с единичным шагом. Следовательно, для простой визуализации вектора в виде двумерного графика достаточно воспользоваться функцией plot() с одним аргументом.
Для построения нескольких графиков в одних и тех же координатных осях, функция plot() записывается следующим образом:
x
= 0:0.01:pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,x,y2);
Результат работы данного
фрагмента программы представле
а)
Рис. 3.2. Результаты работы функции plot() с одним аргументом:
а – plot(x); б – plot(y).
Рис. 3.3. Отображение двух графиков в одних координатных осях.
Аналогичным образом можно построить два графика, используя один аргумент функции plot(). Предположим, что есть два вектора значений
y1
= sin(x);
y2 = cos(x);
которые требуется отобразить на экране. Для этого объединим их в двумерную матрицу
в которой столбцы составлены из векторов y1 и y2 соответственно. Такая матрица будет отображена функцией
plot([y1’
y2’]); % апострофы переводят вектор-строку
% в вектор-столбец
в виде двух графиков (рис. 3.4).
Рис. 3.4. Отображение двумерной матрицы в виде двух графиков.
Два вектора в одних осях можно отобразить только в том случае, если их размерности совпадают. Когда же выполняется работа с векторами разных размерностей, то они либо должны быть приведены друг к другу по числу элементов, либо отображены на разных графиках. Отобразить графики в разных координатных осях можно несколькими способами. В самом простом случае можно создать два графических окна и в них отобразить нужные графики. Это делается следующим образом:
x1
= 0:0.01:2*pi;
y1 = sin(x1);
x2 = 0:0.01:pi;
y2 = cos(x2);
plot(x1, y1);
% рисование первого графика
figure; % создание
2-го графического окна
plot(x2, y2);
% рисование 2-го графика во 2-м окне
Функция figure, используемая в данной программе, создает новое графическое окно и делает его активным. Функция plot(), вызываемая сразу после функции figure, отобразит график в текущем активном графическом окне. В результате на экране будут показаны два окна с двумя графиками.
Неудобство работы приведенного
фрагмента программы
x1
= 0:0.01:2*pi;
y1 = sin(x1);
x2 = 0:0.01:pi;
y2 = cos(x2);
figure(1); %создание
окна с номером 1
plot(x1, y1);
% рисование первого графика
figure(2); %
создание графического окна с номером
2
plot(x2, y2);
% рисование 2-го графика во 2-м окне
При выполнении данной программы на экране всегда будут отображены только два графических окна с номерами 1 и 2, и в них показаны графики функций синуса и косинуса соответственно.
В некоторых случаях
большего удобства представления информации
можно достичь, отображая два
графика в одном графическом
окне. Это достигается путем использо
subplot(<число строк>, <число столбцов>, <номер координатной оси>)
Рассмотрим пример отображения двух графиков друг под другом вышеприведенных функций синуса и косинуса.
x1
= 0:0.01:2*pi;
y1 = sin(x1);
x2 = 0:0.01:pi;
y2 = cos(x2);
figure(1);
subplot(2,1,1);
% делим окно на 2 строки и один столбец
plot(x1,y1);
% отображение первого графика
subplot(2,1,2);
% строим 2-ю координатную ось
plot(x2,y2);
% отображаем 2-й график в новых осях
Результат работы программы показан на рис. 3.5.
Аналогичным образом можно выводить два и более графиков в столбец, в виде таблицы и т.п. Кроме того, можно указывать точные координаты расположения графика в графическом окне. Для этого используется параметр position в функции subplot():
subplot(‘position’, [left bottom width height]);
где left – смещение от левой стороны окна; bottom – смещение от нижней стороны окна; width, height – ширина и высота графика в окне. Все эти переменные изменяются в пределах от 0 до 1.
Рис. 3.5. Пример работы функции subplot.
Ниже представлен фрагмент программы отображения графика функции синуса в центре графического окна. Результат работы показан на рис. 3.6.
x1
= 0:0.01:2*pi;
y1 = sin(x1);
subplot(‘position’,
[0.33 0.33 0.33 0.33]);
plot(x1,y1);
В данном примере функция subplot() смещает график на треть от левой и нижней границ окна и рисует график с шириной и высотой в треть графического окна. В результате, получается эффект рисования функции синуса по центру основного окна.
Таким образом, используя параметр position можно произвольно размещать графические элементы в плоскости окна.
Рис. 3.6. Пример работы функции subplot с параметром position.
Пакет MatLab позволяет отображать графики с разным цветом и типом линий, показывать или скрывать сетку на графике, выполнять подпись осей и графика в целом, создавать легенду и многое другое. В данном параграфе рассмотрим наиболее важные функции, позволяющие делать такие оформления на примере двумерных графиков.
Функция plot() позволяет менять цвет и тип отображаемой линии. Для этого, используются дополнительные параметры, которые записываются следующим образом: