Построение трёхмерных графиков
Рассмотрим построение графиков функций двух переменных на прямоугольной области определения. Предположим, что требуется получить поверхность функции на прямоугольнике x [-1, 1], y [0, 2]. Первый шаг состоит в задании сетки на прямоугольнике, то есть точек, которые будут использоваться для вычисления значений функции. Для генерации сетки предусмотрена функция meshgrid, вызываемая от двух входных аргументов – векторов, задающих разбиения по осям x и y. Функция meshgrid возвращает два выходных аргумента, являющихся матрицами:
>> [X,Y]=meshgrid(-1:0.1:1,0:0.1:2);.
Матрица X состоит из одинаковых строк, равных первому входному аргументу – вектору в meshgrid, а матрица Y – из одинаковых столбцов, совпадающих со вторым вектором в meshgrid. Такие матрицы оказываются необходимыми на втором шаге при заполнении матрицы Z, каждый элемент которой является значением функции z(x,y) в точках сетки. Несложно понять, что использование поэлементных операций при вычислении функции z(x,y) приводит к требуемой матрице:
>> Z=exp(-X).*sin(pi*Y);.
Для построения графика z(x,y) осталось вызвать подходящую графическую функцию, к примеру:
>> mesh(X,Y,Z).
На экране появляется графическое окно, содержащее каркасную поверхность исследуемой функции (рис. 3.11). Обратите внимание, что цвет поверхности соответствует значению функции.
Рис. 3.11
Команда colorbar приводит к отображению в графическом окне столбика, показывающего соотношение между цветом и значением z(x,y). Цветовые палитры графика можно изменять, пользуясь функцией colormap, например, colormap(gray) отображает график в оттенках серого цвета. Некоторые цветовые палитры приведены ниже:
bone – похожа на палитру gray, но с легким оттенком синего цвета;
colorcube – каждый цвет изменяется от темного к яркому;
cool – оттенки голубого и пурпурного цветов;
copper – оттенки медного цвета;
hot – плавное изменение: черный-красный-оранжевый-жёлтый-белый;
hsv – плавное изменение (как цвета радуги);
jet – плавное изменение: синий-голубой-зелёный-жёлтый-красный;
spring – оттенки пурпурного и жёлтого;
summer – оттенки зелёного и жёлтого;
winter – оттенки синего и зелёного;
MATLAB предоставляет целый набор графических функций для визуализации функций двух переменных, среди них:
surf – залитая цветом каркасная поверхность;
meshc, surfc – поверхности с линиями уровня на плоскости xy;
contour – плоский график с линиями уровня;
contourf – залитый цветом плоский график с линиями уровня;
contour3 – поверхность, составленная из линий уровня;
surfl – освещённая поверхность.
Все перечисленные функции допускают то же самое обращение, что и mesh, например:
>> surf (X,Y,Z)
>> contourf(X,Y,Z).
Остановимся подробнее на нескольких вопросах. Первый из них: как изменять установки, определённые по умолчанию, при отображении функций линиями уровня при помощи contour, contourf и contour3. Число линий уровня задаётся в четвёртом дополнительном аргументе, например:
>> contourf(X,Y,Z,10).
Вместо числа линий уровня можно указать в векторе те значения z(x,y), для которых требуется построить линии уровня:
>> contour(X,Y,Z,[-0.51 -0.25 -0.01 0.89]).
Несколько сложнее нанести подписи с соответствующим значением z(x,y) к каждой линии уровня. Для этого придётся вызвать contour с двумя выходными аргументами, первый из них – матрица с информацией о положении линий уровня, а второй – вектор с указателями на линии (рис.3.12). Полученные переменные следует использовать в качестве входных аргументов функции clabel:
>> [CMatr, h] = contour(X, Y, Z,[-0.51 -0.25 -0.01 0.89]);
>> clabel(CMatr, h)
Рис. 3.12
Залитые цветом каркасные поверхности, построенные при помощи surf и surfc, имеют постоянный цвет в пределах каждой ячейки. Команда shading interp, вызываемая после surf и surfc, служит для плавного изменения цвета в пределах ячеек и скрытия линий сетки на поверхности. Если желательно убрать сетку и сохранить постоянный цвет ячеек, то достаточно использовать shading flat, а shading faceted придаёт графику прежний вид.
Столь же просто обеспечивается построение графиков сложных поверхностей. Надо только знать, какой командой реализуется тот или иной график. Например, для построения графика поверхности и её проекции в виде контурного графика на плоскость под поверхностью достаточно использовать следующие команды:
» [X.Y]=meshgrid(-5:0.1:5);
» Z=X.*sin(X+Y);
» meshc(X.Y,Z).
Окно с построенным графиком показано на рис. 3.13.
Рис. 3.13. Окно с графиками поверхности и её проекции на плоскость под фигурой
Раньше пришлось бы потратить немало времени на составление и отладку нужной для построения такого графика программы. В MATLAB же можно в считанные секунды изменить задающую поверхность функцию Z(X, Y) и тут же получить новый график поверхности с окраской, в данном случае заданной вектором Z, и с её проекцией на плоскость XY.
Мы ограничимся этими примерами построения графиков как достаточно простыми и типовыми. Из них следует важный вывод – для решения той или иной частной задачи надо знать соответствующие команды и функции. В этом вам поможет справочная система MATLAB.
Можно поворачивать построенную фигуру мышью и наблюдать её под разными углами. Рассмотрим эту возможность на примере построения логотипа системы MATLAB – мембраны. Для этого, введя команду membrane, получим исходный график, представленный на рис. 3.14.
Рис. 3.14. Построение мембраны – логотипа системы MATLAB
Для вращения графика достаточно активизировать последнюю справа кнопку панели инструментов с изображением пунктирной окружности со стрелкой. Теперь, введя курсор мыши в область графика и нажав левую кнопку мыши, можно круговыми движениями заставить график вращаться вместе с обрамляющим его параллелепипедом (рис. 3.15).
Рис. 3.15. Вращение трёхмерной фигуры мышью
Графические функции по умолчанию располагают поверхность так, что наблюдатель видит её часть под некоторым углом, а другая – скрыта от взора. Положение наблюдателя определяется двумя углами: азимутом (AZ) и углом возвышения (EL). Азимут отсчитывается от оси, противоположной y, а угол возвышения – от плоскости xy (см. рис. 3.16, на котором положительные направления отсчёта углов обозначены стрелками).
Рис. 3.16
Осмотреть поверхность со всех сторон позволяет функция view. Вызов функции view с двумя выходными аргументами и без входных даёт возможность определить текущее положение наблюдателя (углы выводятся в градусах):
>> [AZ, EL]=view
AZ =
-37.5000
EL =
30.
Эти значения MATLAB использует по умолчанию при построении трёхмерных графиков. Для задания положения наблюдателя следует указать азимут и угол возвышения (в градусах) в качестве входных аргументов view, например: view(0,90) показывает вид на график сверху. Перед поворотом графика целесообразно расставить обозначения к осям, используя, как и для двумерных графиков xlabel и ylabel, и zlabel для подписи к вертикальной оси. Функция view допускает ещё несколько вариантов вызова:
view(3) – возврат к стандартным установкам;
view([x,y,z]) – помещение наблюдателя в точку с координатами x, y и z.
Освещённая поверхность строится при помощи функции surfl, которая позволяет получить наглядное представление о поведении исследуемой функции. Следует учесть, что лучше сочетать вызов surfl с командой shading interp и цветовой палитрой, содержащей большое количество оттенков (gray, copper, bone, winter и т. д.), поскольку поверхность обладает свойствами рассеивания, отражения и поглощения света, исходящего от некоторого источника. Положение источника можно задавать в четвёртом дополнительном аргументе surfl, причём либо вектором из двух элементов (азимут и угол возвышения источника), либо вектором из трёх элементов (положение источника света в системе координат осей), например: surfl(X,Y,Z,[20 80]) или surfl(X,Y,Z,[6 8 11]).
Разберём теперь работу с несколькими графиками. Первый вызов любой графической функции приводит к появлению на экране графического окна Figure 1, содержащего оси с графиком. Однако, при дальнейших обращениях к графическим функциям прежний график пропадает, а новый выводится в тоже самое окно. Команда figure предназначена для создания пустого графического окна. Если требуется получить несколько графиков в разных окнах, то перед вызовом графических функций следует прибегать к функции figure. Графические окна при этом нумеруются так: Figure 2, Figure 3 и т.д.
Каждое окно имеет свои оси, при наличии нескольких пар осей (в одном окне или в разных) вывод графиков производится в текущие оси. Последняя созданная пара осей является текущей. Для того, чтобы выбрать текущие оси из нескольких имеющихся, достаточно щелкнуть по ним левой кнопкой мыши перед вызовом графической функции. Возможна и обратная ситуация, когда в процессе работы требуется добавлять графики к уже имеющимся на некоторых осях. В этой ситуации перед добавлением графика следует выполнить команду hold on. Для завершения такого режима достаточно воспользоваться hold off.
В одном графическом окне можно расположить несколько осей со своими графиками. Функция subplot предназначена для разбиения окна на части и определения текущей из них. Предположим, что требуется вывести графики на шесть пар осей в одно графическое окно (две по вертикали и три по горизонтали). Создайте графическое окно при помощи figure и выполните команду:
>> subplot(2,1,1).
В левом верхнем углу окна появились оси. Первые два аргумента в subplot указывают на общее число пар осей по вертикали и горизонтали, а последний аргумент означает номер данной пары осей. Нумерация идёт слева направо, сверху вниз. Используйте subplot(2,1,1), subplot(2,1,2) для создания остальных пар осей. Вывод любой из графических функций можно направить в нужные оси, указав их при помощи subplot(2,1,k), например (рис. 3.17):
>> [X,Y]=meshgrid(-5:0.1:5);
>> Z=X.*sin(X+Y);
>> meshc(X,Y,Z)
>> subplot(2,1,1)
>> bar([1.2 0.3 2.8 0.9])
>> subplot(2,1,2)
>> surf(X,Y,Z).
Рис. 3.17
Достарыңызбен бөлісу: |