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

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
753
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

Глава 2. Графика в Matlab

Контурные графики

Холмс, это исключено. Сразу видно, что Вы мало читаете.

К/ф "Приключения Шерлока Холмса и доктора Ватсона. Знакомство"

Контурные графики используются для графического представления функций от двух координат и являются альтернативой к созданию трехмерных поверхностей. На контурном графике для функциональной зависимости f (x,y) в координатной плоскости строятся кривые вида f (x,y) = const (контуры) для разных значений константы const в правой части. Обычно в качестве дополнительного (а иногда и основного) индикатора используется цветовая раскраска контурного графика. В этом случае цветовой диапазон соотносится с диапазоном значений отображаемой на контурном графике функции. Такой режим достаточно наглядный и используется, например, при построении температурных карт.

Для создания контурного графика, среди прочего, может использоваться функция contour(). Существует несколько способов передачи аргументов этой функции. Рассмотрим наиболее общие.

Поскольку речь идет о функции двух переменных, базовые точки, на основании которых строится контурный график, и значения функции в этих базовых точках должны представляться в виде матриц. Процесс создания матриц узловых точек обычно подразумевает использование функции meshgrid(). Если в качестве первого и второго аргументов функции указать векторы-строки, то в качестве результата функцией возвращается две матрицы. Первая получается построчным повторением первого вектора, а количество повторений определяется количеством компонентов во втором векторе-аргументе. Вторая матрица, возвращаемая функцией meshgrid(), получается транспонированием второго вектора-аргумента функции. Столбцы повторяются столько раз, сколько элементов в первом векторе-аргументе. Например, если вызвать функцию meshgrid() в команде вида [X,Y]=meshgrid(x,y), то в результате матрица X будет состоять из строк, совпадающих с вектором x. Количество строк равняется количеству элементов в векторе y. Матрица Y будет состоять из столбцов, совпадающих с транспонированным вектором y. Количество столбцов равняется количеству элементов в векторе x.

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

71

Самоучитель Matlab

Например, предположим, что матрица значений функции в узловых точках Z вычисляется на основе матриц X и Y. Если для этого используется стандартная встроенная функция Matlab, то обычное правило вычисления функции для матричных аргументов состоит в том, что в вычислениях используются соответствующие элементы матриц. Так, для вычисления значения Z(i,j) будут использованы узловые точки X(i,j) и Y(i,j). Если матрицы X и Y создавались по описанной выше схеме на основании векторов x и y, то тогда X(i,j) совпадает со значением x(j), а Y(i,j) совпадает со значением y(i). Таким образом, первый индекс элемента матрицы значений функции в узловых точках соответствует индексу вектора узловых точек, переданного вторым аргументом функции meshgrid(), а второй индекс элемента матрицы значений функции в узловых точках соответствует индексу вектора узловых точек, переданного первым аргументом функции meshgrid().

Для создания контурного графика функции, табулированной матрицей Z вузловыхточкахXиY,можновоспользоватьсякомандойcontour(X,Y,Z). На рис. 2.26 приведен пример создания контурного графика для функции

z(x,y) = sin(x)sin(y) . x2 + y2

Рис. 2.26. Простой контурный график

Для создания графика использовались следующие команды:

72

Глава 2. Графика в Matlab

>>x=-2*pi:0.1:2*pi;

>>y=x;

>>[X,Y]=meshgrid(x,y);

>>Z=sin(X).*sin(Y)./sqrt(X.^2+Y.^2);

>>contour(X,Y,Z)

График функции строится на интервале значений от 0 до 2π по каждому из аргументов. Узловые точки с помощью функции meshgrid() заносятся в матрицы X и Y. Значения функции в узловых точках командой

Z=sin(X).*sin(Y)./sqrt(X.^2+Y.^2) заносятся в матрицу Z. Контурный график строится командой contour(X,Y,Z).

При создании контурного графика контурные линии определяются автоматически. Третьим аргументом можно указать целое число, которое определит количество контурных линий (точнее, количество значений функции, для которых отображаются контурные линии). Если третьим аргументом указан вектор с числовыми значениями, то на контурном графике будут отображаться контурные линии. На рис. 2.27 представлен результат создания контурного графика командой contour(X,Y,Z,30).

Рис. 2.27. На контурном графике увеличено количество контурных линий

Как видим, количество контурных линий на графике значительно увеличилось (теперь контурные линии отображаются для 30 значений функции). Результат последовательного выполнения команд vals=

73

Самоучитель Matlab

[-0.3 -0.1 -0.05 0 0.01 0.05] и contour(X,Y,Z,vals) представлен на рис. 2.28.

Рис. 2.28. На контурном графике отображаются контурные линии с предопределенными значениями функции

Контурные линии отображаются всего для пяти значений функции. Значения, для которых отображаются контурные линии, представлены элементом вектора vals, который передается третьим аргументом функции contour().

Достаточно серьезным недостатком представленных выше графиков является то обстоятельство, что контурные линии не содержат меток, на основании которых можно было бы установить, какому значению соответствует та или иная контурная линия. Для отображения меток у контурных линий используют функцию clabel(). Функции первым аргументом передается матрица контурных линий и указатель на соответствующий графический объект. Эти два параметра возвращаются при вызове функции contour().

На заметку

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

На рис. 2.29 представлен контурный график с метками для контурных линий.

74

Глава 2. Графика в Matlab

Рис. 2.29. На контурном графике отображаются метки значений для контурных линий

Для создания графика использовались команды:

>>[C,h]=contour(X,Y,Z,[-0.5 -0.1 0 0.1 0.3]);

>>clabel(C,h)

Первой командой создается контурный график, а в переменные C и h соответственно записываются значения матрицы контурных линий и указателя на графический объект. Командой clabel(C,h) на этом графике добавляются маркеры контурных линий.

На заметку

В Matlab функции могут возвращать (и как правило возвращают) сразу несколько значений в качестве результата. Если из функции нужно "считать" несколько значений, они "считываются" в список. Общий формат команды вызова функции, возвращающей несколько значений, имеет вид [значение1,значение2,...]= функция(аргументы). Именно такого типа команда и использовалась выше.

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

75

Самоучитель Matlab

Рис. 2.30. Ввод меток контурных линий в ручном режиме

Рис. 2.31. Контурный график с заливкой области графика

76

Глава 2. Графика в Matlab

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

На контурной линии выбирается место, и после щелчка мышью там появляется метка (подпись) со значением функции, соответствующим выбранной контурной линии. Для прекращения ввода меток достаточно нажать клавишу <Enter> или щелкнуть мышкой вне области рисунка.

Для отображения контурного графика с заливкой области графика цветом используют функцию contourf(). На рис. 2.31 приведен пример создания контурного графика с помощью команды contourf(X,Y,Z).

Способ использования функции contourf() аналогичен к функции contour(). Например, на рис. 2.32 представлен контурный график, который создается командой contourf(X,Y,Z,30).

Рис. 2.32. Контурный график с заливкой и увеличенным количеством контурных линий

В данном случае третьим аргументом указывается количество значений функции, для которых строятся контурные линии. Командой contourf(X,Y,Z,vals) (где вектор vals такой же, как и в рассмотренном выше примере) создается контурный график (с заливкой цветом) с контурными линиями для значений, определяемых третьим аргументом – вектором vals (рис. 2.33).

77

Самоучитель Matlab

Рис. 2.33. Контурный график с заливкой и контурными линиями для предопределенных значений функции

Рис. 2.34. Контурный график с заливкой и отображением подписей для контурных линий

78

Глава 2. Графика в Matlab

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

В данном случае использовались следующие команды:

>>[C,h]=contourf(X,Y,Z,[-0.5 -0.1 0 0.1 0.3]);

>>clabel(C,h)

Отметим также, что при выполнении заливки цветом в контурных графиках (и не только) полезной может быть функция colormap(). Она позволяет изменить используемую по умолчанию цветовую палитру. Аргументом функции могут указываться, кроме прочего, следующие ключевые слова: jet, hsv, hot, cool, spring, summer, autumn, winter, gray, bone, copper, pink и lines. Каждое из этих ключевых слов соответствует предопределенной цветовой палитре. Желающие изучить этот вопрос подробно могут обратиться к справочной системе Matlab или поэкспериментировать с рабочими документами. Для перехода к используемой по умолчанию цветовой палитре воспользуемся командой colormap('default').

Создание трехмерных графиков

- Крупное дело?

- Давно такого не было!

К/ф "Приключения Шерлока Холмса и доктора Ватсона. Собака Баскервилей"

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

Для создания поверхности использовалась команда mesh(X,Y,Z). При этом поверхность отображается в виде сетки. У функции mesh() существуют модификации: функции meshc() и meshz(). Функция meshc() позволяет одновременно с трехмерной поверхностью строить в горизонтальной координатной плоскости контурный график, как показано на рис. 2.36.

График построен с помощью команды meshc(X,Y,Z). В таком (то есть в режиме отображения кроме трехмерной поверхности еще и контурных линий) обычно бывает легче анализировать представленные в графическом виде зависимости, поскольку фактически для одной и той же функциональной зависимости отображается сразу два графика: пространственная поверхность и контурный график.

79

Самоучитель Matlab

Рис. 2.35. Трехмерная поверхность (сетка)

Рис. 2.36. Трехмерная поверхность и контурные линии

80