Главная страница

Практикум по матлабу. практикум по матлабу. Физических процессов с использованием


Скачать 1.13 Mb.
НазваниеФизических процессов с использованием
АнкорПрактикум по матлабу
Дата21.06.2021
Размер1.13 Mb.
Формат файлаpdf
Имя файлапрактикум по матлабу.pdf
ТипУчебное пособие
#219898
страница16 из 17
1   ...   9   10   11   12   13   14   15   16   17
MATLAB, используются дескрипторы графических объектов (graphics
object handles). Эти дескрипторы можно воспринимать как метки, ярлычки соот- ветствующих объектов. Их нельзя изменять. Они создаются и уничтожаются вме- сте с объектами, но каждый объект однозначно определяется своим дескриптором.
Дескриптор экрана (
root) и дескриптор рисунка (figure) имеют целые значения,
все остальные дескрипторы имеют значения вещественные.
Все функции низкого уровня и большинство функций высокого уровня возвра- щают значение дескриптора, если они вызываются с выходным аргументом, т.е. в виде
graph_handl=function_name.
Например, мы можем создать такие объекты, как рисунок, оси и линию, и со- хранить значения их дескрипторов в переменных
fig_han, axes_han и line_han
с помощью последовательности операторов
fig_han = figure;
150

axes_han = axes;
line_han = plot(exp(-([-3:3].^2)))
Если при вызове, например, функции высокого уровня
plot создается несколько однотипных объектов (несколько линий), то возвращаемый дескриптор является вектор-столбцом. Хотя, как мы знаем, объекты-предки, не созданные явно зара- нее, создаются в процессе создания объекта-наследника, тем не менее, используя только третью строку вышеприведенного примера, мы создадим рисунок и оси, но их дескрипторы не узнаем во время создания самих объектов. Как узнать дескрип- тор объекта после его создания, будет описано далее.
Не все функции высокого уровня при обращении к ним в виде
h=f() возвра- щают дескрипторы соответствующих объектов. Не возвращают дескрипторы сле- дующие функции:
bar compass errorbar feather fplot hist polar rose stairs quiver sphere cylinder
Если вы не сохранили дескриптор рисунка, осей или других созданных объек- тов, их дескриптор можно получить с помощью ряда команд. Например, дескрип- тор текущего рисунка можно получить с помощью команды
gcf(get current figure),
дескриптор текущих осей (т.е. тех осей, в которых сейчас будет происходить рисо- вание) можно получить с помощью команды
gca(get current axes). Если на рисунке несколько осей, то мы получим дескриптор той области рисования, которая бы- ла создана последней или внутри которой последним создавался какой-либо объ- ект. Существует на рисунке еще объект, который называется текущим. Это такой объект, который был последним создан, с которым последним производили мани- пуляции или на котором последним щелкали мышкой. Дескриптор такого объекта можно получить с помощью команды
gco(get current object).
Если тем или иным способом вы сохранили дескрипторы объектов, то вы мо- жете делать текущим тот или иной объект (т.е. переходить от объекта к объекту) с помощью команд
figure(fig_handl) и/или axes(axes_handl).
Дескрипторы, или функции, возвращающие дескрипторы (
gcf, gca и др.), мо- гут использоваться в качестве аргументов функций, которые изменяют или уста- навливают те или иные свойства объектов. Это прежде всего описанные далее функции
get и set.
Одним из самых популярных способов узнать и/или использовать дескриптор объекта является обращение к функции
findobj. Если эту функцию использовать без параметров, то в результате она выдаст список всех дескрипторов объекта
Root
151
и всех его наследников. При использовании функции в виде
H=findobj(hl), где
hl -дескриптор какого-нибудь созданного объекта, будет возвращен и занесен в массив
H список дескрипторов данного объекта и всех его наследников. При использовании же этой функции в виде
h=findobj(’Имя_Свойства’,’Значе-
ние_Свойства’) будет получен список всех дескрипторов объектов, у которых свойство с именем
’Имя_Свойства’ имеет значение ’Значение_Свойства’. Ес- ли таких объектов окажется несколько, то будет получен вектор дескрипторов.
8.5.
Свойства графических объектов и работа с ними. Функции
get и set
Каждый из объектов, упомянутых выше, имеет набор свойств, которые ассоцииру- ются только с ним. В этих свойствах заключается вся информация, которая необ- ходима для того, чтобы этот объект был выведен на экран. В момент создания объ- екта те свойства, которые вы не определили, принимают свои значения по умолча- нию. Всякое свойство имеет имя (’Property_Name’) и значение, в качестве которо- го может быть строка, вектор или матрица. Для того чтобы работать со свойствами объектов, вовсе не обязательно помнить все их имена и их возможные значения.
Не обязательно также постоянно консультироваться со справочной системой или с руководством (даже если оно у вас имеется). Для определения имен свойств и воз- можных значений этих свойств, а также для изменения их значений имеются две функции
get и set.
Для того чтобы получить полный список имен свойств некоторого графического объекта с дескриптором
h, достаточно ввести команду get(h). Следует при этом отметить, что этот объект должен быть создан, пусть даже формально. Например,
если вы хотите определить, какие свойства имеет объект
line, то достаточно опре- делить дескриптор линии командой
hl=line(1,1) или даже просто hl=line, после чего можно будет с помощью команды
get(hl) определить список имен свойств,
а также присвоенные им на данный момент значения. Большинство свойств име- ет вполне понятные имена (конечно, для знающего английский язык). Например,
легко увидеть, что у объекта
line(линия) имеются свойства
7 7
В правой колонке приводится перевод имен свойств.
152

Color = [0 0 0]
EraseMode = normal
LineStyle = -
LineWidth= [0.5]
Marker = none
MarkerSize = [6]
MarkerEdgeColor = auto
MarkerFaceColor = none
XData = [0 1]
YData = [0 1]
ZData = []
Цвет = [0 0 0]
Режим стирания = normal
Стиль линии = -
Ширина линии = [0.5]
Маркер = none
Размер маркера = [6]
Цвет контура маркера = auto
Цвет заливки маркера = none
XДанные = [0 1]
YДанные = [0 1]
ZДанные = []
Ряд свойств может принимать произвольные значения, а другие свойства –
только определенные. Если необходимо узнать, какие значения может принимать то или иное свойство, то используется оператор
set(hl), где hl -дескриптор со- ответствующего, интересующего вас объекта. В результате получаем на экране ин- формацию, подобную приведенной далее
Color
EraseMode: [ {normal} | background | xor | none ]
LineStyle: [ {-} | -- | : | -. | none ]
LineWidth
Marker: [ + | o | * | . | x | square | diamond | v | ^ | >]
MarkerSize
MarkerEdgeColor: [ none | {auto} ] -or- a ColorSpec.
MarkerFaceColor: [ {none} | auto ] -or- a ColorSpec.
Данные, приведенные в квадратных скобках и отделенные друг от друга верти- кальной чертой, являются вариантами возможных значений, а значения в фигурных скобках являются значениями по умолчанию.
Для получения значения свойства какого-либо объекта и возможного присво- ения этого значения переменной используется оператор
get в форме x=get(hl,
’Property_Name’). Такая запись приведет к тому, что переменной x будет при- своено значение свойства
’Property_Name’. Например, если в предыдущем при- мере записать оператор
x=get(hl, ’Color’), то будет создан вектор x= [0 0 0] - это запись цвета линии в RGB-формате. Для присвоения соответствующему свой- ству нового значения используется оператор
set в виде set(hl, ’Prop_Name’,
153

’Prop_Value’); Например, для смены цвета линии (объект line с дескриптором
hl) используется оператор
set(hl,’Color’,’red’), или, что эквивалентно, set(hl,’Co-
lor’,[1 0 0]).
8.6.
Движущиеся графики (анимация)
Для вывода на экран движущихся объектов в MATLAB имеется ряд возможно- стей. Одна из них -расчет последовательных состояний объекта и сохранение со- ответствующего изображения в специальном формате с последующей прокруткой этого мультфильма. Такие возможности нами в этом руководстве рассматриваться не будут. Интересующиеся могут познакомиться с описанием функций
movie.
Нас будет интересовать возможность получения на экране движущихся объек- тов "на лету", т.е. в процессе счета. Частично эту проблему решают такие функции,
как
comet и comet3. Эти функции позволяют получить квази-анимацию, т.е вы- вести и показать в движении траекторию одной или нескольких частиц (
comet - на плоскости, а
comet3 – в трехмерном пространстве), но после того, как эти траектории будут насчитаны. Это бывает довольно полезно, но это лишает нас возможности оперативно вмешиваться в описываемый процесс (менять какие-либо параметры расчетной модели).
Можно попытаться, например, при отрисовке изменяющейся кривой (или лю- бого другого меняющего свое положение объекта) вызывать на каждом шаге рас- чета функцию
plot, line или histo, но поскольку все функции высокого уровня при обращении к ним сами заново создают объект
axes(оси) и сами выбирают масштаб, то при таком подходе вы увидите постоянно мигающее изображение с изменяющимся масштабом осей. Попробуйте сами набрать и исполнить програм- му, приведенную ниже.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Это пример неудачной анимации при выводе бегущей волны %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
t=0:0.1:100;
x=0:0.3:30;
k=1.3; w=0.9;
n=length(t);
y=cos(k*x-w*t(1))+cos(x-t(1));
figure
154

plot(x,y);
for i=2:n;
y=cos(k*x-w*t(i))+cos(x-t(i));
plot(x,y);
drawnow
end;
Это вовсе не то, что подразумевается под анимацией. Дело в том, что постоян- ное создание-удаление объектов приводит к миганию картины и к медленному ее обновлению. Для получения «правильной» анимации в процессе счета необходимо перейти к использованию графических функций низкого уровня и не использовать механизм создания-удаления объекта для изображения его движения, а создав од- нажды объект менять только его свойства (координаты в нашем случае).
Рассмотрим, как это выглядит практически на том же примере – движение па- кета волн.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Это пример ‘‘правильной’’>> анимации при выводе пакета волн %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
% Задание значений параметров
t=0:0.1:100;
x=0:0.3:30;
k=1.3; w=0.9;
n=length(t);
% Расчет формы волны при t(1)=0
y=cos(k*x-w*t(1))+cos(x-t(1));
% Вычисление границ рисунка
axlim = [min(x) max(x) min(y) max(y)];
figure
% Сохранение дескриптора выводимого объекта
lh = line(x,y);
% Задание цвета кривой и выбор границ
set(lh,’color’,’r’);
axis(axlim);
% Выбор режима стирания
set(lh,’erasemode’,’xor’);
% Начало цикла анимации
155

for i = 2:n
% Пересчет координат кривой
y=cos(k*x-w*t(i))+cos(x-t(i));
% Самый главный момент - замена координат
set(lh,’XData’,x,’YData’,y);
drawnow;
end
В приведенной выше программе есть три узловых момента, обеспечивающих каче- ственную анимацию.
1.
Во-первых, это подготовка системы координат и создание дескриптора выво- димого объекта с присвоением свойству
’EraseMode’ (режим стирания) зна- чения
’xor’. Обратите внимание на этот параметр. Дело в том, что значение этого свойства по умолчанию-
’none’ и при этом выведенный ранее объект не стирается, а остается на экране. Возможно осуществление анимации и с по- мощью режима стирания
’background’, причем анимация будет происходить быстрее. Различия между этими двумя режимами лучше всего посмотреть введя дополнительно перед циклом анимации команду
grid on (нарисовать координатную сетку). При режиме
xor сетка остается после «прохождения»
волны по экрану, а при использовании режима стирания
background сетка затирается там, где прошла волна.
2.
Фактически перерисовка объекта происходит при изменении значений свойств объекта
’XData’ и ’YData’ (возможно, ’XData’, ’YData’ и ’ZData’, если это объект в трехмерном пространстве).
3.
Важным фактором непрерывного обновления картинки является команда
draw-
now, которая обеспечивает постоянный вывод обновленных значений на экран.
Такой принудительный вывод обеспечивают также функции
pause и getframe.
Возможен (и иногда более интересен) другой способ принудительного вывода на экран. Если после создания дескриптора объекта вы выполните принуди- тельный вывод этого объекта на экран с помощью команды
pause до входа в цикл анимации, то при вхождении в цикл команда
drawnow уже не нуж- на, анимация будет происходить до исчерпания цикла или до принудительного прекращения программы.
156

9.
Разработка графического интерфейса пользователя
При разработке прикладных программ представляется полезным создание графи-
ческого интерфейса пользователя. Фактически, это создание среды расчета за- дач определенного класса без программирования со стороны пользователя. Как правило, такие интерфейсы имеет смысл разрабатывать для задач с несколькими параметрами если предполагается неоднократное решение подобных задач. В та- ком случае целесообразно разработать графический интерфейс, который помогает пользователю получать результаты решения задачи (как правило в графическом виде) при определенном выборе параметров. Такой интерфейс может быть так- же удобен при создании учебных задач, потому что обучающийся в таком случае основное внимание тратит не на программирование или решение задачи, а на под- бор требуемых параметров, анализ и осмысление получающихся результатов.
Из приведенного выше краткого введения понятно, что обязателными элемен- тами графического интерфейса при решении научных и/или учебных задач должны быть:
1.
Одно или несколько окон для вывода графических результатов расчета.
2.
Несколько редактируемых окон, с помощью которых задаются и/или изме- няются значения параметров задачи.
3.
Управляющие кнопки, которые позволяют запускать и останавливать процесс расчета, перерисовывать результаты, выходить из задачи.
4.
Поясняющие надписи (статический текст).
Конечно, возможны и другие элементы управления, такие как прокручиваемые списки, радио-кнопки для выбора одного из многих вариантов и т.д., но в настоя- щем пособии мы рассмотрим подробно только перечисленные в списке четыре ти- па. На рис.
8
показан простейший интерфейс, созданный для исследования биений,
образующихся при сложении двух гармонических колебаний с близкими частотами.
Как видно из рисунка, все вышеперечисленные элементы в нем присутствуют.
Для создания такого интерфейса можно воспользоваться функциями графиче- ского вывода, а также специальной функцией, разработанной для интерактивного взаимодействия пользователя с рисунком. Эта функция называется
uicontrol. Но для упрощения работы и создания однотипных элементов интерфейса в системе
MATLAB имеется специальная программа, которая позволяет на уровне визуаль- ного программирования, почти без написания кода создать требуемые элементы.
157

Рис. 8. Простейщий графический интерфейс пользователя для решения задачи
“Биения”
9.1.
Создание внешнего вида интерфейса
В этом параграфе мы рассмотрим использование MATLAB для разработки внеш- него вида графического интерфейса (GUI-GraphicsUserInterface) с использовани- ем средств графического (визуального) программирования. Для вызова визуаль- ного редактора необходимо в командном окне MATLAB набрать команду
guide.
По истечении определенного времени, определяемого быстродействием вашего ком- пьютера, появятся два новых окна, показанные на рис.
9
. Одно из них – панель управления (Control Panel, на рисунке слева) и форма или область рисования
(Figure, на рисунке справа). Эти окна могут перекрываться, но мы для ясности изложения расположили их рядом. Показанная выше картинка появится на экране в том случае, если перед вызовом
guide отсутствует какой-либо открытый рису- нок. В случае же если функция
guide вызывается после отрисовки какого-либо рисунка, то он открывается вместо пустого. Мы же рассмотрим создание графиче- ского интерфейса с самого начала.
Перед созданием графического интерфейса желательно “разработать проект”
того, что вы хотите иметь в качестве интерфейса. Мы рассмотрим пример вывода трех разных сигналов в трех подокнах, что в терминах графики высокого уровня определялось бы операторами subplot(3,1,k), где k -номер графика. Кроме того,
158

Рис. 9. Общий вид визуального графического редактора и окна редактирования справа от собственно подокон с графиками мы хотим иметь три редактируемых по- ля, в которых можно осуществлять ввод/редактирование числовых значений трех переменных. Пусть эти переменные принимают произвольные значения.
В данном изложении мы не будем оснащать наши редактируемые окна провер- кой, удовлетворяют ли введенные значения каким-либо условиям, хотя такое воз- можно. Назовем эти переменные N, R, C. В данном примере имеется в виду расчет тока в RC-цепи при подаче на зажимы сигнала с номером N, а R и C - сопротив- ление и емкость в цепи (подробное описание задачи см. в параграфе
10
основного текста пособия).
Наш интерфейс должен позволить менять зна-
R u n
E x i t
N =
C =
R =
Рис. 10. Вид интерфейса чения N, R, и C, получая в трех расположенных друг над другом подокнах сигнал (напряжение,
подаваемое на зажимы), производную от сигна- ла и напряжение на сопротивлении U
r
. Помимо окон для вывода графиков и редактируемых окон ввода необходимо поместить на панель интерфей- са еще две кнопки -
1   ...   9   10   11   12   13   14   15   16   17


написать администратору сайта