Лекция 4. Разработка интерфейсных программ
(продолжение). Символьные вычисления в матлабе
Содержание
Функции uimenu и uicontextmenu
Как работать со слайдерами
Символьные вычисления в матлабе
Задачи
Функции uimenu и uicontextmenu
Функция uimenu создает новое системное меню в текущем графическом окне. Например, оператор
f=uimenu('label','workspace');
создает новое системное меню с именем workspace.
Следующие операторы добавляют три строки к меню workspace и связывают с ними callback-функции.
uimenu(f,'label','figure','callback','myfigure');
uimenu(f,'label','save','callback','mysave');
uimenu(f,'label','Quit','callback','exit','separator','on','Accelerator','Q');
Далее к меню workspace добавляем строку-меню.
f2=uimenu(f,'label','new');
И добавляем новые строки к меню new.
uimenu(f2,'label','up','callback','myup');
uimenu(f2,'label','down','callback','mydown');
На рис.4.1 показано созданное меню.
Для работы всех пунктов меню необходимо написать все callback функции.
Функция uicontextmenu позволяет создать меню, связанное с любым графическим объектом.
Вызов меню осуществляется нажатием правой кнопки мыши на графическом объекте.
В файле ex_contextmenu.m содержится функция ex_contextmenu,
которая рисует на экране график и связывает с этим графиком всплывающее меню.
Для вызова меню достаточно перевести указатель мыши на нарисованную кривую и
нажать првую кнопку мыши.
function ex_contextmenu()
%clear all
x=1:0.10:10;
y=cos(x.^2).*sin(x.^3);
h=plot(x,y);
c1=uicontextmenu;
it1=uimenu(c1,'label','dashed','callback','set(gco,''linestyle'',''--'')');
it1=uimenu(c1,'label','solid','callback','set(gco,''linestyle'',''-'')');
it1=uimenu(c1,'label','red','callback','set(gco,''color'',[1 0 0])');
set(h,'uicontextmenu',c1);
Результат работы функции ex_contextmenu показан на рис. 4.2.
Обратите внимание, что в качестве callback-функций используются не имена функций,
а просто команды matlab. Функция gco, использованнная в примере, возвращает указатель
на текущий графический объект ( аббревиатура от трех английских слов get current object).
Как работать со слайдерами
Для работы со слайдерами используется объект типа slider. Следующий оператор открывает
слайдер в текущем графическом окне.
global h
h=uicontrol('style','slider','units','normalized','position',[...],'callback','hsc');
Для обработки событий со слайдером должна быть описана функция hsc, имеющая примерно
такой вид
function hsc()
global h
r=get('h','value');
.
.
.
Задача функции hsc - считать положение слайдера. Каждый объект типа slider имеет поле
value, определяющее положение слайдера. По умолчанию значение этого поля изменяется от
0 (наименьшее положение) до 1 (максимальное положение).
В файле colorrgb.m содержится пример функции с использованием
слайдеров.
function colorrgb()
%#function hsc
global hs1 hs2 hs3 ht1 ht2 ht3 hf
figure(1)
set(gcf,'color',[1 1 0]);
hf=uicontrol('style','frame','backgroundcolor',[0 0 0],'units','normalized',...
'position',[0.5 0.1 0.3 0.3]);
hs1=uicontrol('style','slider','units','normalized','position',...
[0.1 0.1 0.05 0.3],'callback','hsc');
hs2=uicontrol('style','slider','units','normalized','position',...
[0.2 0.1 0.05 0.3],'callback','hsc');
hs3=uicontrol('style','slider','units','normalized','position',...
[0.3 0.1 0.05 0.3],'callback','hsc');
ht1=uicontrol('style','text','units','normalized','position',...
[0.05 0.01 0.1 0.06],'string','0');
ht2=uicontrol('style','text','units','normalized','position',...
[0.16 0.01 0.1 0.06],'string','0');
ht3=uicontrol('style','text','units','normalized','position',...
[0.27 0.01 0.1 0.06],'string','0');
uicontrol('style','pushbutton','units','normalized','position',...
[0.5 0.01 0.3 0.06],'callback','delete(gcf)','string','Cancel');
uicontrol('style','text','units','normalized','position',...
[0.08 0.41 0.08 0.05],'string','Red','backgroundcolor',[1 0 0]);
uicontrol('style','text','units','normalized','position',...
[0.18 0.41 0.08 0.05],'string','Green','backgroundcolor',[0 1 0]);
uicontrol('style','text','units','normalized','position',...
[0.28 0.41 0.08 0.05],'string','Blue','backgroundcolor',[0 0 1]);
Обработку перемещений слайдеров осуществляет функция hsc
hsc.m
function hsc
global hs1 hs2 hs3 ht1 ht2 ht3 hf
r=get(hs1,'value');
g=get(hs2,'value');
b=get(hs3,'value');
set(hf,'backgroundcolor',[r g b]);
set(ht1,'string',num2str(r));
set(ht2,'string',num2str(g));
set(ht3,'string',num2str(b));
Функция colorrgb визуализует результат смешивания трех базовых цветов, интенсивность которых
определяется тремя слайдерами. Результирующий цвет выводится в объекте типа frame, а числовые
значения интенсивностей базовых цветов отображаются объектами типа text. Функция hsc
считывает положения трех слайдеров в переменные r, g и b и назначает цвет фона для объекта
типа frame, ссылка на который хранится в глобальной переменной hf. Значения r,g и b
заносятся в поля объектов типа text, сылки на которые хранятся в глобальных переменных
ht1,ht2 и ht3.
Результат работы функции colorrgb показан на рис. 4.3.
Символьные вычисления в матлабе
Функции для символьных вычислений пакета Matlab реализованы с помощью пакета для символьных
вычислений Maple. Функции для вычисления производных и неопределенных интегралов можно
вызывать используя строковые переменные. Например, следующие три строки вычисляют вторую
производную от функции cos(a*x) по x.
s='cos(a*x)';
s2='x';
s3=diff(s,s2,2);
Для вычисления интеграла исподьзуется функция int.
s4=int(s,s2);
Для вычисления пределов строковых переменных недостаточно, необходимо вводить
символьные переменные. Например, чтобы посчитать предел от sin(x)/x в точке 0
нужно ввести
syms x
s5=limit(sin(x)/x,x,0)
Все функции для символьных переменных возвращают данные типа syms. Этот тип данных
необходимо преобразовывать в строковый при выводе результатов в поля типа string
интерфейсных объектов. Для преобразования используется функция char.
s6=char(s5);
В файле mylimit.m пример интерфейса для вычисления пределов.
function mylimit()
%#function calllim
global fun var point ans
h1=figure;
pos=[0.1 0.7 0.1 0.05];
var=uicontrol('style','edit','units','normalized','position',pos,'string','x');
pos1=[0.1 0.77 0.1 0.05];
point=uicontrol('style','edit','units','normalized','position',pos1,'string','0');
pos2=[0.1 0.84 0.7 0.05];
ans=uicontrol('style','edit','units','normalized','position',pos2);
pos3=[0.01 0.7 0.07 0.05];
uicontrol('style','text','units','normalized','position',pos3,'string','var');
pos4=[0.01 0.77 0.07 0.05];
uicontrol('style','text','units','normalized','position',pos4,'string','point');
pos5=[0.01 0.84 0.07 0.05];
uicontrol('style','text','units','normalized','position',pos5,'string','limit');
pos6=[0.01 0.91 0.07 0.05];
uicontrol('style','pushbutton','units','normalized','position',pos6,...
'string','limit','backgroundcolor',[1 0 0],'callback','calllim');
pos7=[0.3 0.91 0.5 0.05];
fun=uicontrol('style','edit','units','normalized','position',pos7,'string',...
'sin(x)/x');
pos8=[0.2 0.91 0.08 0.05];
uicontrol('style','text','units','normalized','position',pos8,'string','f(t)=');
Callback функция, обрабатывающая нажатие кнопки limit, содержится в файле
calllim.m
function calllim()
global fun var point ans
s1=get(fun,'string');
s2=get(var,'string');
s3=get(point,'string');
s4=sprintf('%s %s','syms',s2);
eval(s4);
s5=strcat('limit(',s1,',',s2,',',s3,')');
s6=eval(s5);
set(ans,'string',char(s6));
Задачи
1. Написать интерфейс для для вычисления производной любого порядка от произвольной функции.
Дифференцируемая функция, переменная по которой производится дифференцирование и порядок
производной вводятся с интерфейса.
2. Написать интерфейс для для вычисления неопределенного интеграла от произвольной функции.
Подынтегральная функция и переменная по которой берется интеграл вводятся с интерфейса.
3. Написать интерфейс для вычисления предела от произвольной функции в заданной точке.
4. Написать интерфейс для разложения произвольной функции в ряд Тейлора в окрестности
заданной точки.
previous next home