# Лекция 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. Написать интерфейс для разложения произвольной функции в ряд Тейлора в окрестности
    заданной точки.