Практикум по матлабу. практикум по матлабу. Физических процессов с использованием
Скачать 1.13 Mb.
|
bar, можно блокировать вывод на экран ги- стограммы, присвоив результат выполнения функции hist(y) двум выходным ар- гументам. При обращении вида [n,x]=hist(y) или [n,x]=hist(y,num_of_bins) или [n,x] = hist(y,bin_centers) вычисляются два вектора. Вектор n содержит число попаданий величины y в каждый из бинов, центры которых находятся в век- торе x. Такое использование функции hist позволяет использовать для отрисовки гистограммы не столбиковую диаграмму (функцию bar), а, например, ступенчатую кривую (функцию stairs). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Пример постороения гистограммы с помощью STAIRS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% y=randn(100,1); % Генерация случайных чисел dx=0.5; % Ширина бинов x=-2.5:dx:2.5; % Центры бинов [ny,xh]=hist(y,x); % Вычисление параметров гистограммы xh=xh-dx/2; % Сдвиг координа по оси x на половину ширины бина [xl,yl]=stairs(xh,ny); % Вычисление координат ломаной hl=line(xl,yl); % Создание дескриптора ломаной линии и отрисовка ее При использовании подобной конструкции будет создан дескриптор hl, который может быть далее использован для построения динамических гистограмм с помо- щью оператора set. 8.2.4. Изображение кривых с погрешностями («усами») При необходимости изобразить возможный диапазон погрешности кривой, полу- ченной статистическими методами, используется функция errorbar(x,y,e). При интервал ростов, или бинов. 142 вызове этой функции будет нарисована кривая, представляющая собой зависи- мость y (x), а в каждой точке x,y изображается вертикальная прямая, имеющая длину, равную удвоенному значению соответствующего элемента вектора e. Если x,y,e представляют собой матрицы, тогда строится несколько кривых с погрешно- стями, причем каждая соответствует столбцам матриц. 8.2.5. Изображение функций Функция fplot предоставляет альтернативную возможность изображения функ- ций по сравнению с вычислением вектора y по x и последующим изображением этой кривой с помощью функции plot. Эта функция бывает особенно полезной, когда кривая имеет несколько разных скоростей изменения и заранее не ясно, в скольких и каких точках необходимо вычислять и выводить кривую. Этой функции необходимо передавать строку, описывающую требуемую функцию в виде f (x). Строка, описывающая f (x), может содержать любые допустимые в MATLAB операции и/или функции. Функция f (x) должна возвращать вектор той же раз- мерности, что и x, или матрицу, каждый столбец которой имеет столько же эле- ментов, сколько и x. Например, для того чтобы нарисовать кривую y = sin(x)cos(2x) в диапа- зоне x от 0 до 5π, необходимо вызвать функцию fplot (’sin(x) .*cos(2x)’, [0 5*pi]). Функция fplot имеет еще два дополнительных (необязательных) аргу- мента. Один из них -это строка, описывающая тип и цвет линии (аналогично функции plot), а вторая -точность. По умолчанию точность равна 2 · 10 −3 , и она определяет, на сколько точек делить интервал, чтобы погрешность от линейной интерполяции не превосходила этой заданной точности. Чем меньше точность, тем дольше вам придется ждать вывода графика на экран. При необходимости исполь- зовать эту функцию только для вычисления координат рисуемой линии (напри- мер, при использовании ее в анимации) используется обращение в виде [Xp,Yp] = fplot(...)]. В этом случае кривая не рисуется, а соответствующие координаты заносятся в массивы Xp и Yp соответственно. 8.3. Трехмерные изображения Не всегда весь объем визуализируемой информации удобно представить в виде набора двумерных кривых. Иногда, по смыслу задачи, данные должны быть пред- ставлены как объекты трехмерного пространства. Для изображения таких объектов мы рассмотрим несколько функций. 143 8.3.1. Одномерная кривая Для изображения одномерной кривой в Рис. 5. Пример вывода трехмерной кривой трехмерном пространстве используется есте- ственное обобщение функции plot(x,y), ко- торое называется plot3(x,y,z). Для полу- чения рис. 5 использовалась последователь- ность команд t=0:0.1:50; x=0.5*t.*cos(t); y=0.6*t.*sin(t); z=0.2*t; plot3(x,y,z); Способ обращения к команде plot3, а также список дополнительных параметров полно- стью совпадает с описанным в п. 8.1.1 и да- лее. Аналогично функциям plot - plot3 существует пара функция comet - comet3. Функция comet3 используется так же, как и comet (см. Дополнение, п. 8.1 ). При использовании для отрисовки трехмерной кривой функции (объекта) line можно обращаться к этой функции как к функции plot, т.е. line(x,y,z). Возможно также при создании анимации трехмерной кривой использовать изменение свойств объекта с помощью оператора set, как это показано в примере к п. 5.1 . В этом слу- чае для отрисовки трехмерной кривой необходимо использовать свойство ’ZData’ (по аналогии с ’XData’ и ’YData’), значением которого должны быть z-координаты соответствующей кривой. Следует отметить, что даже нарисовав такую картинку на плоском экране зачастую трудно представить себе ее истинный вид. 8.3.2. Сеточные поверхности Трехмерные сеточные поверхности изображаются с помощью функции mesh. Ко- манда mesh(z) изображает в трехмерной перспективе поверхность, описываемую элементами матрицы z. Эта поверхность определяется Z-координатами точек над прямоугольной сеткой в X-Y плоскости. Попробуйте выполнить самостоятельно команду mesh(eye(10)). Для того чтобы нарисовать функцию z=f(x,y) над пря- моугольником, необходимо определить вектора xx и yy , которые определят раз- биение сторон прямоугольника. С помощью команды meshgrid можно создать матрицу x, каждая строка которой будет совпадать с xx, а размер столбцов ко- торой будет совпадать с длиной вектора yy, и, аналогично, матрицу y, каждый столбец которой совпадает с yy, следующим образом [x,y] = meshgrid(xx,yy);. После этого необходимо определить матрицу z, вычисляя каждый ее элемент как функцию f в соответствующих точках, определяемых матрицами x и y, после че- го использовать команду mesh. Вы можете, например, нарисовать поверхность на квадрате [-2,2] х [-2,2] с помощью следующего набора команд (попробуйте это 144 выполнить) xx = -2:.1:2; yy = xx; [x,y] = meshgrid(xx,yy); z = exp(-x.^2 - y.^2); mesh(z) Конечно, первые три строки можно заменить на [x,y] = meshgrid(-2:.1:2, - 2:.1:2); Более полно с возможностями изображения трехмерных поверхностей можно познакомиться с помощью оперативной помощи ( help plot3/mesh/surf), по руководству пользователя [ 6 ] или с помощью книги [ 5 ]. 8.3.3. Изолинии Одним из популярных способов визуализации поверхностей является изображе- ние изолиний. MATLAB предоставляет возможность построения изолиний двух типов -двумерных или плоских, фактически являющихся проекциями соответству- ющих линий постоянного значения на плоскость X-Y, и трехмерных изолиний, на- рисованных в какой-либо перспективе. Простейшим способом изобразить изолинии на плоскости -это обратиться к функции contour(Z), где Z -это матрица, содержащая значения исследуемой по- верхности на равномерной сетке, т.е. Z ij = f(i, j). При таком обращении си- стема MATLAB сама выберет число изолиний и значения функции, при которой они будут построены. Если вы хотите сами задать число выводимых изолиний, то необходимо обращение вида contour(Z,n_of_lines), если же необходимо задать сами эти уровни, то это можно сделать с помощью обращения contour(Z,values _of _levels). Если вам необходимо нарисовать одну изолинию с определенным значением функции, то вектор, содержащий уровни, должен иметь два одинаковых элемента, равных этому уровню. Отмеченные выше три способа вызова функции построения изолиний стороят их по отношению к номерам строк и столбцов матрицы Z так, что элемент Z(1,1) будет помещаться в левом нижнем углу рисунка. Можно построить изолинии отно- сительно выбранных вами масштабов по оси X и Y . Для этого необходимо пере- дать функции вектора или матрицу координат, определяющие координаты каждого из элементов матрицы Z. Эта передача осуществляется путем одного из следующих обращений: contour(x,y,Z); contour(x,y,Z,n_of_lines); contour(x,y,Z,values_of_levels); 145 0 1 2 3 4 5 6 0 0.5 1 1.5 2 2.5 3 x y Contour of z = sin(x).*cos(y+ π /2) Рис. 6. Пример построения изолиний функции z (x, y) = sin(x) · cos(y + π/2). В качестве примера рассмотрим построение изолиний функции f (x) = sin(x) · cos(y + π/2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Пример построения изолиний функции % sin(x)*cos(y+pi/2) % Пример взят из [4] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Вычисление равномерной по x и y сетки [x,y]=meshgrid(linespace(0,2*pi,30),linespace(0,pi,30)); % Расчет значений функции в узлах сетки % Использование ’.*’ означает почленное умножение z=sin(x).*cos(y+pi/2); % В следующей строке строятся изолинии % со значениями в интервале от -1 до 1 % с шагом 0.1 исключая значение 0 contour(x,y,z,[-1:0.1:-0.1 0.1:0.1:1]); xlabel(’x’); 146 ylabel(’y’); title(’Contour of z = sin(x)*cos(y+ pi/2)’); В результате выполнения этой программы будет выведен рис. 6 . Если у вас цветной дисплей, то линии будут разноцветные, а порядок их раскраски будет такой же, как и при выводе нескольких линий с помощью функции plot. К сожалению, на полу- ченном таким образом графике нельзя будет установить, какое значение относится к какой линии, и являются ли явно видные области экстремума впадинами или вы- ступами. Для того чтобы пометить требуемые линии их значениями, используется функция clabel, а для того чтобы увидеть выступы или впадины, можно просто использовать функцию contour3 вместо функции contour. Функция clabel может быть использована совместно с приведенным выше при- мером. Необходимо вместо обращения к функции contour вставить следующие строки c=contour(x,y,z,[-1:0.1:-0.1 0.1:0.1:1]); clabel(c); при этом все изолинии будут помечены, но эти цифровые метки-значения будут размещены произвольным образом. Для того чтобы были помечены не все изоли- нии, достаточно модифицировать приведенные выше две строки следующим обра- зом: c=contour(x,y,z,[-1:0.1:-0.1 0.1:0.1:1]); clabel(c,[-1:.2:1]); В этом случае будут помечены только те линии, значения которых определены вто- рым аргументом функции clabel. Если же вы хотите расставить значения на изо- линиях вручную, то второе обращение к функции clabel необходимо видоизменить на clabel(c,’manual’). После вывода рисунка значения не будут проставлены, но появится крест вместо обычного указателя мыши. Щелкните левой кнопкой мыши около той изолинии, значение которой вы хотите вывести, и в том месте, где вам это представляется удобным. Когда вы пометите нужное вам количество изолиний, нажмите клавишу Return. Существуют еще возможности по изменению цвета вы- водимых изолиний, изменению размера шрифта, которым подписываются значения и т.д., но все они требуют работы со свойствами графических объектов и со знани- ем основ дескрипторной графики, о чем будет рассказано в разделе 8.4 . Для тех, кому нравятся изолинии, выполненные в стиле географических карт, т.е. опреде- ленный диапазон значений заливается одним цветом, следующий – другим и т.д., существует функция contourf с теми же аргументами, что и функция contour. 147 8.4. Дескрипторная графика (графика низкого уровня) Этот и следующие разделы будут посвящены графике низкого уровня, которую на русском языке принято называть дескрипторной. В них будут описаны средства решения целого ряда задач, которые не могут быть решены с помощью описанных в разделах 8.1 - 8.3 функций высокого уровня. 8.4.1. Графические объекты и их иерархия Прежде всего познакомимся с понятием графический объект. Графические объек- ты -это те базисные объекты, из которых на экране возникает изображение. Даже самый элементарный график состоит из нескольких графических объектов. Это ок- но, в котором выводится график, линии, оси, метки на осях и т.д. Все графические функции высокого уровня, описанные ранее, создавали такие графические объек- ты как линии (line), оси (axes) и др. Все эти объекты являются строительными блоками, из которых MATLAB создает различные изображения. Существуют графические команды низкого уровня, которые создают 10 типов графических объектов в дополнение к корневому объекту, который создается ав- томатически при входе в MATLAB. Эти команды и создаваемые ими объекты перечислены в таблице. Объект Команда низкого уровня Figure(рисунок) figure Axes (оси) axes Line(линия) line(x,y) или line(x,y,z) Patch (заплата) patch(x,y,c) или patch(x,y,z,c) Surface (поверхность) surface(X,Y,Z,C), surface(X,Y,Z) surface(Z,C), surface(Z) Image (картинка) image(C) или image(x,y,C) Light (освещение) light(’Prop_name’,’Prop_value’,...) Text (текст) text(x,y,text_str) или text(x,y,z,text_str) User Interface Control uicontrol (интерактивное управление) User Interface Menu uimenu (меню) Переменные x,y и z, используемые в качестве аргументов команды line, яв- ляются векторами или матрицами одинаковой длины, и они задают последователь- 148 ность координат кривой (или кривых -если переменные матрицы). В случае мат- риц каждая кривая определяется столбцами соответствующих матриц. Переменные x,y и z, используемые в качестве аргументов команды patch, яв- ляются координатами вершин соответствующего многоугольника (заплатки). Пе- ременная c используется для задания цвета заливки многоугольника. При создании поверхности (команда surf) X,Y и Z являются матрицами, опи- сывающими координаты четырехугольников, которыми аппроксимируется поверх- ность. Переменная C определяет цвет. Размещение текстового объекта (строка text_str) определяется переменными x,y и z. По умолчанию первая буква строки прижимается левым краем и центри- руется по вертикали к точке x,y или x,y,z. Команда light сама не создает какого-либо нового изображения, а только опре- деляет освещение объектов patch и/или surf. Объекты (и соответствующие ко- манды) взаимодействия с пользователем будут описаны в соответствующем месте. Графические объекты системы MATLAB являются не только физическими объектами, но и объектами в смысле объектно-ориентированного программирова- ния. В связи с этим они связаны иерархической структурой типа родители-дети. Каждый объект-наследник не может появиться без появления соответствующего предка. Например, линия ( line) не может быть нарисована перед тем, как будут созданы оси ( axes) и рисунок (figure). К счастью, вы не должны сами с по- мощью команд низкого уровня создавать всю последовательность объектов. Как только вы создадите кривую, например с помощью команды plot(1:10), соответ- ствующие рисунок и оси будут созданы автоматически. С другой стороны, вам не возбраняется написать последовательность низкоуровневых команд типа figure; axes; plot(1:10); Если после создания рисунка вы закроете его, например с помощью команды close, то при этом исчезнут и дети, т.е. оси и линии. То же самое происходит при исполь- зовании команды delete (удалить). Иерархическая структура объектов показана на рис. 7 . Основным или корневым объектом root является экран. Он генерирует- ся автоматически при вхождении в систему MATLAB. Рисунок ( figure) являет- ся следующим в иерархии объектом, и он либо создается специально одноименной командой, либо генерируется при вызове высокоуровневых команд, описанных ра- нее. При необходимости можно создавать много рисунков, ограничением является только количество памяти у вашего компьютера. Все последующие (после figure) 149 Рис. 7. Иерархическая структура графических объектов команды осуществляют вывод в текущее окно. Простейшим способом сделать тот или иной рисунок текущим используется команда figure(num), где num -это номер рисунка, который выводится вверху соответствующего окна. Рисунок ( figure) имеет четыре наследника. Три из них - uicontrol, uimenu и Uicontextmenu являются объектами, предназначенными для создания интер- фейса пользователя, и о них мы поговорим позже. Объект оси ( axes) определя- ет область вывода детей данного объекта на рисунке. Таких областей может быть несколько, каждая со своими наследниками (т.е. линиями, текстами, поверхностя- ми и т.д.). Это аналогично использованию команды высокого уровня subplot, но обладает более гибкими возможностями. 8.4.2. Дескрипторы и работа с ними Для того чтобы манипулировать упомянутыми выше, а также другими объектами в системе |