Построение и исследование графикацелевой функции с помощью системы Matlab
Минск
БНТУ
Лабораторная работа №1
Построение и исследование графикацелевой функции с помощью системы Matlab
Цель работы:
1.Ознакомиться со способами построения двухмерных и трехмерных графиков.
2. Научиться находить минимальные(максимальные) значения функций, не используя функции программного пакета OptimizationToolbox.
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
1.1 Способы построениядвухмерных и трехмерных графиков в системе Matlab
Элементарные графические функции системы Matlab позволяют построить на экране и вывести на печатающее устройство следующие типы графиков: линейный, логарифмический, полулогарифмический, полярный.Для каждого графика можно задать заголовок, нанести обозначение осей и масштабную сетку.
1.1.1 Построение двухмерных графиков
Двухмерные графикив Matlabможно строить либо из окна Workspace, по правой клавише, либо с помощью специальных команд, заданных в командной строке:
plot - график в линейном масштабе
loglog- график в логарифмическом масштабе
semilogx, semilogy - график в полулогарифмическом масштабе
polar- график в полярных координатах
1.1.1.1 Команда plot
Вывод функции в виде графика состоит из следующих этапов:
1. Задание вектора значений аргумента х.
2. Вычисление вектора у значений функции y(х).
3. Вызов команды plot для построения графика.
Команды для задания вектора х и вычисления функции лучше завершать точкой с запятой для подавления вывода в командное окно их значений (после команды plot точку с запятой ставить необязательно, т. к. она ничего не выводит в командное окно).
Описание команды
plot(Y)
plot(X1,Y1,...,Xn,Yn)
plot(X1,Y1,LineSpec,...,Xn,Yn,LineSpec)
plot(X1,Y1,LineSpec,'PropertyName',PropertyValue)
plot(axes_handle,X1,Y1,LineSpec,'PropertyName',PropertyValue)
h = plot(X1,Y1,LineSpec,'PropertyName',PropertyValue)
Команда plot(y)строит график элементов одномерного массиваy в зависимости от номера элемента; если элементы массива комплексные, то строится plot(real(y), imag(y)). Если Y - двумерный действительный массив, то строятся графики для столбцов; в случае комплексных элементов их мнимые части игнорируются.
Команда plot(x, y) соответствует построению обычной функции, когда одномерный массив x соответствует значениям аргумента, а одномерный массив y - значениям функции. Когда один из массивов X или Y либо оба двумерные, реализуются следующие построения:
если массив Y двумерный, а массив x одномерный, то строятся графики для столбцов массива Y в зависимости от элементов вектора x;
если двумерным является массив X, а массив y одномерный, то строятся графики столбцов массива X в зависимости от элементов вектора y;
если оба массива X и Y двумерные, то строятся зависимости столбцов массива Y от столбцов массива X.
Команда plot(x1, y1, s1, x2, y2, s2, ...) позволяет объединить на одном графике несколько функций y1(x1), y2(x2), ..., определив для каждой из них свой способ отображения. Для этих же целей можно использовать и команду holdon, которая предназначена для удержания текущего графического окна. В результате второй график проведется "поверх первого графика". К недостаткам указанных способов построения нескольких графиков в пределах одних и тех же осей координат относится использование одного и того же диапазона изменения координат, что при несопоставимым значениях двух функций приведёт к плохому изображению графика одной из них. Если всё же нужно одновременно визуализировать несколько графиков так, чтобы они не мешали друг другу, то это можно сделать двумя способами. Во-первых, можно построить их в разных графических окнах. Вторым решением рассматриваемой задачи показа сразу нескольких графиков без конфликта диапазонов осей координат является использование командыsubplot. Эта функция позволяет разбить область вывода графической информации на несколько подобластей, в каждую из которых можно вывести графики различных функций. Командаsubplot принимает три числовых аргумента, первый из которых равен числу рядов подобластей, второе число равно числу колонок подобластей, а третье число - номеру подобласти (номер отсчитывается вдоль рядов с переходом на новый ряд по исчерпанию).
Обращение к командам plot вида plot(x, y, s1, x, y, s2) позволяет для графика y(x) определить дополнительные свойства, для указания которых применения одной строковой переменной s1 недостаточно, например при задании разных цветов для линии и для точек на ней.
Иногда требуется сравнить поведение двух функций, значения которых сильно отличаются друг от друга. График функции с небольшими значениями практически сливается с осью абсцисс, и установить его вид не удается. В этой ситуации помогает командаplotyy, которая выводит графики в окно с двумя вертикальными осями, имеющими подходящий масштаб.
После выполнения команд на экране появляется окно FigureNo. 1 с графиком функции. Окно содержит меню, панель инструментов и область графика.
Командаplot использует линейный масштаб по обеим координатным осям. Однако MatLab предоставляет пользователю возможность строить графики функций одной переменной в логарифмическом или полулогарифмическом масштабе.
1.1.1.2Командыloglog, semilogx, semilogy, polar
Для построения графиков в логарифмическом и полулогарифмическом масштабах служат следующие команды:
- loglog (логарифмический масштаб по обеим осям);
- semilogx (логарифмический масштаб только по оси абсцисс);
-semilogy (логарифмический масштаб только по оси ординат).
Аргументы loglog, semilogx и semilogy задаются в виде пары векторов значений абсцисс и ординат так же, как для командыplot, описанной выше.
Для построения графиков в полярных координатах можно использовать команду polar.
1.1.1.3Оформление графиков
Для построения графика функции в рабочей среде Matlab должны быть определены два вектора одинаковой размерности, например х и у. Соответствующий массив х содержит значения аргументов, а у — значения функции от этих аргументов. Команда plot соединяет точки с координатами (x(i), y(i)) прямыми линиями, автоматически масштабируя оси для оптимального расположения графика в окне. Прямые линии в системе Matlab представляют собой графические объекты типа Line. Эти объекты имеют огромное число свойств и характеристик, которые можно менять. Доступ к этим объектам осуществляется по их описателям (дескрипторам; handles). Команда plot(x, y, s) позволяет выделить график функции, указав способ отображения линии, способ отображения точек, цвет линий и точек с помощью строковой переменной s, которая может включать до трех символов из таблицы, приведенной в help.
Если цвет линии не указан, он выбирается по умолчанию из шести первых цветов, с желтого до синего, повторяясь циклически.
Удобство использования графиков во многом зависит от дополнительных элементов оформления: координатной сетки, подписей к осям, заголовка и легенды. Сетка наносится командой gridon, подписи к осям размещаются при помощи xlabel, ylabel, заголовок дается командой title.
Наличие нескольких графиков на одних осях требует помещения легенды командой legend с информацией о линиях. Все перечисленные команды применимы к графикам как в линейном, так и в логарифмическом и полулогарифмическом масштабах.
1.1.2Построение трехмерных графиков
В системе Matlab предусмотрено несколько команд и функций для построения трехмерных графиков. Значения элементов числового массива рассматриваются как z-координаты точек над плоскостью, определяемой координатами x и y. Возможно несколько способов соединения этих точек. Первый из них - это соединение точек в сечении (функция plot3), второй - построение сетчатых поверхностей (функции mesh и surf). Поверхность, построенная с помощью функции mesh, - это сетчатая поверхность, ячейки которой имеют цвет фона, а их границы могут иметь цвет, который определяется свойством EdgeColor графического объекта surface. Поверхность, построенная с помощью функции surf, - это сетчатая поверхность, у которой может быть задан цвет не только границы, но и ячейки; последнее управляется свойством FaceColor графического объекта surface.
1.1.2.1 Команда plot3
Описание команды
plot3(x, y, z)
plot3(X, Y, Z)
plot3(x, y, z, s)
plot3(x1, y1, z1, s1, x2, y2, z2, s2, ...)
Команды plot3(...) являются трехмерными аналогами функции plot(...).
Команда plot3(x, y, z), где x, y, z - одномерные массивы одинакового размера, строит точки с координатами x(i), y(i), z(i) и соединяет их прямыми линиями.
Команда plot3(X, Y, Z), где X, Y, Z - двумерные массивы одинакового размера, строит точки с координатами x(i, :), y(i, :), z(i, :) для каждого столбца и соединяет их прямыми линиями.
Команда plot3(x, y, z, s) позволяет выделить график функции z(x, y), указав способ отображения линии, способ отображения точек, цвет линий и точек с помощью строковой переменной s, которая может включать до трех символов из следующей таблицы.
1.1.2.2 Команда mesh
Описание команды
mesh(X, Y, Z, C) meshc(X, Y, Z, C) meshz(X, Y, Z, C)
mesh(x, y, Z, C ) meshc(x, y, Z, C ) meshz(x, y, Z, C )
mesh(Z, C) meshc(Z, C) meshz(Z, C)
mesh(X, Y, Z) meshc(X, Y, Z) meshz(X, Y, Z)
mesh(x, y, Z) meshc (x, y, Z) meshz(x, y, Z)
mesh(Z) meshc(Z) meshz(Z)
Команда mesh(X, Y, Z, C) выводит на экран сетчатую поверхность для значений массива Z, определенных на множестве значений массивов X и Y. Цвета узлов поверхности задаются массивом C. Цвета ребер определяются свойством EdgeColor объекта surface. Можно задать одинаковый цвет для всех ребер, определив его в виде вектора [r g b] интенсивности трех цветов - красного, зеленого, синего. Если определить спецификацию none, то ребра не будут прорисовываться. Если определить спецификацию flat, то цвет ребер ячейки определяется цветом того узла, который был первым при обходе этой ячейки. Поскольку одни и те же ребра обходятся несколько раз, то цвета будут замещаться. Если определить спецификацию interp, то будет реализована линейная интерполяция цвета между вершинами ребра.
Команда mesh(x, y, Z, C) выполняет ту же функцию, но вместо двумерных массивов X, Y использует их одномерные проекции, так что если length(x) = n, а length(y) = m, то [m, n] = size(Z). В этом случае узлы сетчатой поверхности определяются тройками {x(j), y(i), Z(i, j)}, где вектор x определяет столбцы массива Z, а y - строки.
Команда mesh(Z, C) использует сетку, которая определяется одномерными массивами x = 1 : n и y = 1 : m.
Команды mesh(X, Y, Z), mesh(x, y, Z), mesh(Z) используют в качестве массива цвета C = Z, то есть цвет в этом случае пропорционален высоте поверхности.
Группа команд meshc(...) в дополнение к трехмерным поверхностям строит проекцию линий постоянного уровня.
Группа команд meshz(...) в дополнение к трехмерным поверхностям строит плоскость отсчета на нулевом уровне, закрывая поверхность, лежащую ниже этого уровня.
Функция h = mesh(...) возвращает дескриптор h для графического объекта surface.
1.1.2.3Командаsurf
Команда surf строит каркасную поверхность графика функции и заливает каждую клетку поверхности определенным цветом, зависящим от значений функции в точках, соответствующих углам клетки. В пределах каждой клетки цвет постоянный.
Описание команды
surf(Z)
surf(Z,C)
surf(X,Y,Z)
surf(X,Y,Z,C)
surf(...,'PropertyName',PropertyValue)
surf(axes_handles,...)
surfc(...)
h = surf(...)
Аргументы surfзадаются в виде пары векторов значений абсцисс и ординат так же, как для командыmesh, описанной выше.
С помощью функции surf получаются хотя и искусственно раскрашенные, но весьма наглядные изображения. Если же мы хотим добиться более естественных и объективных способов окрашивания поверхностей, то следует использовать функцию surfl.
Функция surfl трактует поверхность графика как материальную поверхность с определёнными физическими свойствами по отражению света. По умолчанию задаётся некоторый источник света, освещающий такую материальную поверхность, после чего рассчитываются траектории отражённых лучей, попадающих в объектив условной камеры. Изображение в такой камере и показывается в графическом окне системы Matlab.
Так как разные материалы по-разному отражают падающие лучи, то можно подобрать некоторый материал, чтобы получить наилучшее (с точки зрения пользователя) изображение. В частности, можно использовать функцию colormap( copper ), с помощью которой для изображения графика выбирается набор цветов (по-английски - colormap), который характерен для света, отражающегося от медной поверхности (медь по-английски - copper). После этого применение функции surfl( X, Y, Z ) вместо surf(X,Y,Z) приводит к получению очень реалистически выглядящего и очень наглядного графика. Можно с такого графика убрать чёрные линии, изображающие рёбра, а также добиться ещё более плавного перехода освещения поверхности, если выполнить команду shadinginterp, означающую, что теперь цвет (освещённость) будет меняться даже внутри отдельных граней (ячеек). В итоге будет получаться совсем уж реальное изображение некоторой объёмной фигуры.
1.1.2.4Функцияmeshgrid
Описание функции
[X, Y] = meshgrid(x, y)
[X, Y] = meshgrid(x)
Функция [X, Y] = meshgrid(x, y) задает сетку на плоскости x-y в виде двумерных массивов X, Y, которые определяются одномерными массивами x и y. Строки массива X являются копиями вектора x, а столбцы - копиями вектора y. Формирование таких массивов упрощает вычисление функций двух переменных, позволяя применять операции над массивами.
Функция [X, Y] = meshgrid(x) представляет собой упрощенную форму записи для функции [X, Y] = meshgrid(x, x).
1.1.3Построение линий уровня
Matlab позволяет построить поверхность, состоящую из линий уровня, при помощи командыcontour3. Эту команду можно использовать так же, как и описанные выше mesh, surf, meshc и surfc с тремя аргументами. При этом число линий уровня выбирается автоматически. Имеется возможность задать четвертым аргументом в contour3 либо число линий уровня, либо вектор, элементы которого равны значениям функции, отображаемым в виде линий уровня. Задание вектора (четвертого аргумента levels) удобно, когда требуется исследовать поведение функции в некоторой области ее значений (срез функции).
Команда contour(X,Y,Z) приводит к графику, на котором показаны линии уровня на плоскости xy, но без указания числовых значений на них. Такой график является малоинформативным, он не позволяет узнать значения функции на каждой из линий уровня.
Использование команды colorbar также не позволит точно определить значения функции.
Каждую линию уровня можно снабдить значением, которое принимает на ней исследуемая функция, при помощи определенной в Matlabкомандыclabel. Командаclabel вызывается с двумя аргументами: матрицей, содержащей информацию о линиях уровня и указателем на график, на котором следует нанести разметку. Пользователю не нужно самому создавать аргументы clabel. Командаcontour, вызванная с двумя выходными параметрами, не только строит линии уровня, но и находит требуемые для clabel параметры.
Дополнительным аргументом функции contour (так же, как и contour3, описанной выше) может быть или число линий уровня, или вектор, содержащий значения функции, для которых требуется построить линии уровня.
Наглядную информацию об изменении функции дает заливка прямоугольника на плоскости xyцветом, зависящим от значения функции в точках плоскости. Для построения таких графиков предназначена командаcontourf, использование которой не отличается от применения contour.
2. ПРИМЕР ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ
В ходе выполнения лабораторной работы необходимо построить графики заданных функций и исследовать их на минимум, не используя функции программного пакета OptimizationToolboxсистемы Matlab. Проиллюстрируем выполнение задания на примере следующих функций:
→ min на отрезке [-1.5;1.5]
2. → min, переменные x и у определены на отрезке [-1;1]
2.1 Построение графика и исследование функции одной переменной
Для анализа поведения функции на заданном отрезке построим ее график с помощью команды plot (рис.1). Функцию зададим в командной строке.
>>x=-1.5:0.0001:1.5;
>>y=cos(3*pi*x)+exp(-x*2)/3;
>> plot(x,y)
Рис.1- График функции
Как видно из графика, исследуемая функция имеет много локальных экстремумов.
Как отмечалосьранее в теоретической части, команда plot(x, y) соответствует построению обычной функции, когда одномерный массив x соответствует значениям аргумента, а одномерный массив y - значениям функции. Это подтверждает информация из Workspace(рис.2).
Рис.2 – Значения аргумента и функции
Для поиска наименьшего элемента в одномерном массиве в Matlabиспользуется функция min.
>> [y_min,n]=min(y)
y_min =
-0.9549
n =
Таким образом, минимальное значение исследуемой функции равно «-0.9549», индекс этого значения равен 25011. Зная этот индекс, можно найти значение аргумента-x, имеющего тот же индекс.
>>x_min=x(25011)
x_min =
1.0010
Итак, среди 30001 значений функции ее минимальное значение равно -0.9549, и принимает она его в точке x=1.0010.
2.2 Построение графика и исследование функции двух переменных
Для отображения функции двух переменных с помощью трехмерных графиков следует:
1. Сгенерировать матрицы с координатами узлов сетки на прямоугольной области определения функции.
2. Вычислить функцию в узлах сетки и записать полученные значения в матрицу.
3. Использовать одну из графических функций Matlab, например, mesh.
4. Нанести на график дополнительную информацию, в частности, соответствие цветов значениям функции.
Сетка генерируется функцией meshgrid, задаваемой двумя входными аргументами (векторами) (если область поиска квадрат с одинаковым шагом, то возможно задавать один аргумент) и двумя выходными (матрицами с абсциссами и ординатами узлов сетки).
Построим график функции ,переменные x и у определены на отрезке [-1;1] (рис.2).
Функцию зададим в командной строке.
>>[X,Y] = meshgrid(-1:0.05:1);
>>Z =2*sin(2*pi*X).*cos(2.5*pi*Y).*(1-X.^2).*(1-Y);
>>mesh(X,Y,Z)
Рис.2 - График функции
Чтобы построить линии уровня используем команду meshc (рис.3).
>> [X,Y] = meshgrid(-1:0.05:1);
>> Z =2*sin(2*pi*X).*cos(2.5*pi*Y).*(1-X.^2).*(1-Y);
>>meshc(X,Y,Z)
Рис.3–Линии уровня функции
Чтобы показать каркасную поверхность, используемкомандуsurf (рис.4).
>> [X,Y] = meshgrid(-1:0.05:1);
>> Z =2*sin(2*pi*X).*cos(2.5*pi*Y).*(1-X.^2).*(1-Y);
>> surf(X,Y,Z)
Рис.3–Каркасная поверхность функции
Как говорилось выше, для построения можно использовать командуplot3
>> [X,Y] = meshgrid(-1:0.05:1);
>> Z =2*sin(2*pi*X).*cos(2.5*pi*Y).*(1-X.^2).*(1-Y);
>> plot3(X,Y,Z)
Тогда получим еще один вид поверхности исследуемой функции (рис.4).
Рис.4–Поверхность функции
Для того, чтобы определить минимальное значение функции Z, используем функцию min(min(Z)). Или min (Z(:)).
min_Z=min(Z(:)) аналогично min_Z=min(minZ)
Чтобы найти координаты минимума используем:
[row_min,col_min]=find(Z==min(Z(:))) или
[row_min,col_min]=find(Z==min_Z), приэтом row-это y, col –это x.
Итак,
>> [X,Y] = meshgrid(-1:0.05:1);
>> Z =2*sin(2*pi*X).*cos(2.5*pi*Y).*(1-X.^2).*(1-Y);
>>min_Z=min(Z(:))
min_Z =
-3.3750
>>[row_min,col_min]=find(Z==min_Z)
row_min =
col_min =
>>xx=[-1:0.05:1];
>>xx_min=xx(16)
xx_min =
-0.2500
>>yy=[-1:0.05:1];
>>yy_min=yy(5)
yy_min =
-0.8000
Проверка
>> Z =2*sin(2*pi*(-0.25))*cos(2.5*pi*(-0.8)).*(1-(-0.25)^2).*(1-(-0.8))
Z =
-3.3750
3. ЗАДАНИЯ ДЛЯ ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ
№ вари-анта | Функция с одной переменной | Функция с двумя переменными |