Пакет MatLab. Элементы программирования. Функции пакета. Графические возможности пакета, страница 16

UserData                           задает матрицу, связанную с меню;

/имя матрицы/;

Visible                                задает виден ли элемент управления на экране;

/on или off/.

Продолжение примера: открытие Checked - меню

solid=uimenu(m_plot,’Label’,’Solid line’,’CallBack’,[‘ltype=’’-‘’;

set(solid,’Checked’,’on’), set(’dotted’, ’Checked’,’off’),

set(’dashed’, ’Checked’,’off’)’]

Открытие переключающегося меню:

toggle=uimenu(tmenu,’Label’,’Теперь On’,’CallBack’,

[‘if strcmp(get(tooggle,’Label’),’Теперь On’),’,

set(tooggle,’Label’),’Теперь Off’),’,’fnoff’,

else set(tooggle,’Label’),’Теперь On’),’,’fnon’, ‘end’]

§6. Использование мыши в пакете MatLab.

fig=figure('Color','k','Name','  Пример');

position=[200 200 75 25];

pb=uicontrol(fig,'Style','Push','String','Ìûøü','Position',position);

wnew_p=['set(fig,''WindowButtonMotionFcn'',['

' ''new_pos=get(fig,''''CurrentPoint'''');'' ',...

' ''position(1)=new_pos(1);'' ',' ''position(2)=new_pos(2);''])'];

curs_p='set(pb,''Pos'',position)';

set(fig,'WindowButtonDownFcn',wnew_p)

set(fig,'WindowButtonUpFcn',['set(fig,''WindowButtonMotionFcn'','' ''),',curs_p])


IV. ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ ПАКЕТА

§1. Решение обыкновенных дифференциальных уравнений.

Решение обыкновенных дифференциальных уравнений, в том числе и нелинейных, производится с помощью функций пакета MatLab ode23 и ode45, в которых реализованы алгоритмы интегрирования системы д.у. методом Рунге-Кутта 2,3 и 4,5 порядков. Обращение к функции имеет следующий вид

[t,y]=ode23('uravn',t0,tk,y0,tol,trace), где t0, tk - начальное и конечное время, y0 - начальные условия, tol - точность, trace - определяет вывод решения, 'uravn' название m-файла, в котором описаны правые части д.у. Функции возвращают вектор времени t  и векторы решений по всем координатам y1, y2 ... yn. Например, в файле uravn1.m описаны правые части системы д.у.

.

y1 =   y2,

.

y2 = - y2 - y1, соответствующей дифференциальному уравнению

p2 x + px + x = 0.

Файл описания дифференциального уравнения uravn1.m имеет вид:

function yp=uravn1(t,y);

yp = [y(2,:); -y(2,:)-y(1,:)];

Программа решения дифференциального уравнения тогда будет иметь следующий вид:

%Решение обыкновенного дифференциального уравнения

%правые части описаны в файле uravn1.m

clc; t0=0; tk=16; y0=[0 0.25]'; tol=1e-3; trace=1;

[t,y]=ode23('uravn1',t0,tk,y0,tol,trace);

plot(t,y), title('Решение уравнения');

Для решения другого уравнения необходимо заменить лишь файл с правыми частями уравнений. Например для системы дифференциальных уравнений вида

.

y1 = y1(1-y2 )-y22,

.

y2 = y1

файл описания будет выглядеть так

function yp=uravn2(t,y);

yp = [(y(1,:).*(1-y(2,:).^2)-y(2,:)); y(1,:)];

§2. Имитация движения (управление многозвенным роботом-манипулятором).

echo off; clear

%Программа проверки функций для k-звенного робота

%l - массив длин звеньев, q - массив углов,

%nk - массив номеров звеньев для вывода следа

%al, p0, s0 - параметры линии, K - коэффициенты ОС

%yz(k-2) - уставки для избыточных звеньев, vz - уставка по скорости

%nk - массив номеров звеньев для вывода следа

l=[2 2 1 1 1 1 1 1]; q=[120 -70 -30 -30 -20 30 -10 10];

K=[0 -5 -5 -5 -5 -5 -5 -5]; yz=[0.0 0.0 0.0 0.0 0.0 0.0];

ry=[0 0 0 0 0 0]; nk=[8]; vz=1.0; al=30; p0=2; s0=1.6;

t=0; tk=1; h=0.02; xs=0; ys=0; gg=[2 10]; g=1; k=length(l);

K=diag(K); u=zeros(length(l),1);

q=q'*pi/180; al=al*pi/180; M=azvml(l,al);

[k,nk]=azvpodg(l,q,nk,yz); azvldr(l,al,s0);

while (t<tk), q=q+h*u;

%for i=1:k, if abs(q(i))<pi/18/5, q(i)=sign(q(i))*pi/18; end; end;

[y,et]=azvryetl(l,q,al,s0,p0,yz,ry);

[u,et]=azvu(l,q,al,vz,K,et,M,u,ry);

[xg,yg]=azvrysh(l,q);

if g~=gg(1)&g~=gg(2) plot(xs,ys,'i',xs,ys,'*i'); end;

plot(xg,yg,'c13',xg,yg,'*c6'); xs=xg; ys=yg; g=g+1;

[sx,sy]=azvsp(l,nk,xg,yg,sx,sy);

tg=[tg; t]; etg=[etg; et(2:k)']; t=t+h; end;

pause; hold off, axis('normal'), plot(tg,etg);

title('Отклонения концов звеньев');

function azvldr(l,al,s0)

%Рисование линии

m=ceil(sum(l)); x=-m:m/2:m; y=x*tan(al)-s0/cos(al); plot(x,y,'c12');

function M=azvml(l,al)

%Расчет матрицы M для линии

k=length(l); M=[cos(al) sin(al); -sin(al) cos(al)];