ВИЗУАЛИЗАЦИЯ КОЛЕБАНИЙ СВЯЗАННЫХ ОСЦИЛЛЯТОРОВ СРЕДСТВАМИ MATLAB
Плешакова А.В., Астраханский государственный университет, Астрахань,
e-mail:Anya-2006@yandex.ru
Шульпина О.Н.,
Тарасевич Ю.Ю.,
Пономарёва И.С.
В данной статье представлен один из методов по созданию виртуальной лаборатории для демонстрации колебаний связанных осцилляторов. Одним из методов осуществления данной цели является получение локального и Интернет-приложения, демонстрирующих колебания связанных осцилляторов. В качестве таких осцилляторов взята система двух маятников, соединённых между собой пружинами (рис.1в,г). Если мы будем проводить реальный эксперимент, то нам придётся учитывать погрешности, тем более что сложно варьировать массы тел, а также жёсткости пружин, так как зачастую не имеется набор пружин различной жёсткости. Компьютерная же демонстрация может достаточно точно описать и показать нам такие колебания, и в ней легко менять параметры системы, не прилагая больших усилий. Визуализация системы реализуется с помощью методов программирования. В качестве программного продукта используется система MATLAB. В начале мы должны подробно исследовать движение грузов, проследить особенности и вывести необходимые законы движения грузов. Затем необходимо создать достаточно простой и удобный интерфейс с помощью системы MATLAB, выбрать необходимые операторы и функции, которые помогут нам создать необходимую программу. И далее надо заложить в программу получившиеся формулы и законы движения, после чего необходимо подкорректировать, возможно, получившиеся недостатки, и программа может использоваться. Данное приложение предполагается использовать при изучении колебаний, как в высших, так и в средних учебных заведениях, а также предполагается использование в лабораторных и самостоятельных исследованиях.
Частным случаем колебаний являются связанные колебания, которые и вызывают наибольший интерес. Связанные колебания - собственные колебания в сложной колебательной системе с 2 и более степенями свободы, которую можно рассматривать как совокупность нескольких связанных систем с 1 степенью свободы каждая (например, 2 связанных колебательных контура (рис.1а)).
Существуют различные колебательные системы, в данной работе нас интересует конкретный вид колебаний[1] - это колебания с двумя и тремя степенями свободы. Примеры таких колебательных систем представлены на рис. 1.
Рис. 1. Примеры колебательных систем: а - два связанных пружиной маятника, каждый из которых состоит из груза, подвешенного на невесомом стержне; б - связанные колебательные контуры; в - два груза, связанные между собой пружиной, г - три груза, связанные между собой пружиной
Объектом нашего внимания будут колебательные системы на рис. 1в.
Интересным случаем связанных колебаний является случай, когда пользователь может варьировать массами грузов и жесткостями пружин. Рассмотрим такой случай для двух связанных грузов и обратимся к рис.2.
Рис. 2. Колебания двух связанных осцилляторов
В данном случае обозначим массу первого груза , а второго - , жесткости пружин равны , и соответственно. Смещение левого груза из положения равновесия обозначим , а второго - (рис.2). Мы считаем, что пружины подчиняются закону Гука, поэтому запишем уравнения движения данных тел:
(1.2.1)
Для упрощения записи введены обозначения:
, ,
, . (1.2.2)
Так как мы знаем по каким законам двигаются грузы, мы можем написать код программы, которая может вычислить положение грузов в определённый момент времени. В этом случае использована функция системы MATLAB под названием Ode45.
[T,Y]=ode45(@syst1,[0 30*pi],[x01 x02 0 0]);
function dy=syst1(t,x)
global a b c d T Y
dy = zeros(4,1);
dy(1)=x(3);
dy(2)=x(4);
dy(3)=-a*x(1)-b*(x(1)-x(2));
dy(4)=-c*x(2)-d*(x(2)-x(1));
где , , , - частоты колебаний грузов. Для наглядности в программе легче всего использовать график движения грузов, причём мы реализовали вывод графиков обоих грузов на одной координатной оси, так как это более удобно и более наглядно.
Приведём график движения грузов, когда жёсткости пружин отличаются друг от друга в два раза. Для примера возьмём случай (рис.3), когда масса второго груза в 20 раз больше массы первого. Жёсткость первой пружины имеет значение 2, вторая - 4, а третья - 8. Для примера смещение грузов возьмём -4 и 4.
Рис. 3. Колебания грузов, когда жёсткости пружин отличаются друг от друга в два раза
Рис.4. Колебания трёх связанных осцилляторов
Здесь, так же как и в случае двух осцилляторов обозначим массу первого груза , второго - ,а третьего - ,жесткости пружин равны , , и соответственно. Смещение первого груза из положения равновесия обозначим , второго - , а третьего - (рис.2). Мы считаем, что пружины подчиняются закону Гука:
Function
Колебательные системы, выбранные для исследования, были смоделированы с помощью встроенных функций MATLAB, в результате чего была разработана программа (приложение 3), которая даёт возможность изучить и наглядно увидеть колебания двух и трёх связанных пружиной осцилляторов.
Для объединения двух случаев связанных колебаний используется общее меню, через которое без труда можно перейти от одного приложения к другому.
function modeling(action)
if nargin<1
fig=figure;%Вызываем фигуру, в которой будет общее окно программы
action='initialize';%делаем активной эту фигуру
end
switch action %Включаем активность фигуры
case 'initialize';%Выбираем свойство "Инициализация"
scrsz = get(0,'ScreenSize');
set(fig,'WindowButtonDownFcn',@Ok,'Units','pixels','WindowStyle','modal','Resize','off','Position',[(scrsz(3)-563)/2 (scrsz(4)-398)/2 563 398],'MenuBar','none','Name','Виртуальная лаборатория','NumberTitle','off');%Определяем необходимые параметры фигуры, такие как: размер окна, стиль, позиция, имя и др.
a=imread('mod2.png'); %Считываем рисунок для окна программы
hSub=subplot('position',[0 0 1 1]);%Натягиваем рисунок на размер окна фигуры
imagesc(a);%Вставляем рисунок в окно программы
axis off %Убираем оси координат
set(hSub,'HandleVisibility','off');
end
function Ok(src,eventdata)
close
main_menu %Производим переход к главному меню программы
Теперь необходимо создать меню программы, с помощью которого мы сможем переходить от одной колебательной системы к другой. После того, как мы выбрали вид меню, подобрали размер окна и т.д. (было приведено выше), мы определяем содержание меню:
t0 = ' ';
t1 = 'МОДЕЛИ КОЛЕБАТЕЛЬНЫХ СИСТЕМ'; t11 = '>> Колебания двух связанных осцилляторов'; t12 = '>> Колебания трёх связанных осцилляторов';%Обьявляем название представленных в программе моделей
S = strvcat(t1, t0, t11, t12);
list1 =uicontrol(fig,'Style','listbox','FontSize',11,'Callback','main_menu start_h','visible','on',...
'Units','pixels','String',S,'Position',[365 65 425 415],'BackgroundColor',[1 1 1],'ForegroundColor',[0 0 0.5]);%Определяем вид меню: стиль, позицию, цвет фона, цвет шрифта и др.
if ~isempty(w)
if w==1
set(fig,'Name','Виртуальная лаборатория\Главное меню');%Название окна фигуры
end
end
case 'start_h'
global list1 q
l1 = get(list1,'Value');
switch l1
case 3; delete(gcf); q = 11; Anna
case 4; delete(gcf); q = 12; Oksana %В зависимости о того, к какой ссылке обратился пользователь, программа выбирает соответствующую модель системы
end
case 'about' %Выбор ссылки "О программе"
fig1=figure; scrsz = get(0,'ScreenSize');
set(fig1,'Units','pixels','Resize','off','Position',[(scrsz(3)-563)/2 (scrsz(4)-398)/2 563 398],'MenuBar','none','Name','О лаборатории','NumberTitle','off');%Соответствующие значения фигуры, в которой пишется справка "О программе"
a=imread('mod2.png'); hSub=subplot('position',[0 0 1 1]); imagesc(a); axis off;
set(hSub,'HandleVisibility','off'); %Выбор рисунка, масштабирование, вывод на экран соответственно
Ok=uicontrol(fig1,'Units','pixels','Position',[487 16 70 25],'Callback','close','FontSize',11,'String','Ok','Style','pushbutton');%Нажатие кнопки "ОК" способствует закрытию окна справки
listbox1=uicontrol(fig1,'BackgroundColor',[1 1 1],'ForegroundColor',[0.2510 0 0.5020],'Units','pixels','Position',[327 52 230 100],'String',...
'Авторы:| Тарасевич Ю.Ю.,| Пономарева И.С.| Плешакова А.В.| Шульпина О.Н.|Астраханский государственый|университет|Астрахань 2007',...
'FontName','Arial Cyr','Style','listbox');%Окно справки, текст справки
end
function menu(src,eventdata)
global list1 w fig
point = get(gcf,'CurrentPoint');
if (fix(point(1))>=9)&(fix(point(1))<=341)&(fix(point(2))>=348)&(fix(point(2))<=401)
w = 1;
set(fig,'Name','Виртуальная лаборатория');
end
if (fix(point(1))>=9)&(fix(point(1))<=341)&(fix(point(2))>=254)&(fix(point(2))<=305)
w=2;
set(fig,'Name','Виртуальная лаборатория');
end
Окно программы представлено на рис. 5. При нажатии в любую точку окна, происходит переход в главное меню программы, окно которого представлено на рис.6.
Рис.5. Общее окно программы
Рис.6. Окно главного меню программы
Интерфейс локального приложения для демонстрации колебаний двух грузов представлен на рис.7.
Фрагмент программы на MATLAB.
function pushbutton1_Callback(hObject, eventdata, handles)
global flag a b c d T Y
set(handles.pushbutton5,'enable','on')
min1 = get(handles.slider1,'Min');
max1 = get(handles.slider1,'Max');
min2 = get(handles.slider2,'min');
max2 = get(handles.slider2,'max');
min3 = get(handles.slider3,'min');
max3 = get(handles.slider3,'max');
min4 = get(handles.slider4,'min');
max4 = get(handles.slider4,'max');
min5 = get(handles.slider5,'Min');
max5 = get(handles.slider5,'Max');
min6 = get(handles.slider6,'Min');
max6 = get(handles.slider6,'Max');
min7 = get(handles.slider7,'Min');
max7 = get(handles.slider7,'Max');
m1 = str2num(get(handles.edit1,'String'));
k1 = str2num(get(handles.edit2,'string'));
k2 = str2num(get(handles.edit3,'String'));
k3 = str2num(get(handles.edit4,'String'));
x01 = str2num(get(handles.edit5,'String'));
x02 = str2num(get(handles.edit6,'String'));
m2 = str2num(get(handles.edit7,'String'));
if (m1 > max1) | (m1 < min1) | (x01 > max5) | (x01< min5) | (x02 > max6) | (x02 < min6) | (m2 > max7) | (m2 < min7)
m1
max1
min1
errordlg('Допустимый диапазон [-10;10]','Ошибка ввода данных')
set(handles.edit1,'String','10')
set(handles.slider1,'Value',10)
set(handles.edit2,'String','1')
set(handles.slider2,'Value',1)
set(handles.edit3,'String','1')
set(handles.slider3,'Value',1)
set(handles.edit4,'String','1')
set(handles.slider4,'Value',1)
set(handles.edit5,'String','5')
set(handles.slider5,'Value',5)
set(handles.edit6,'String','5')
set(handles.slider6,'Value',5)
set(handles.edit7,'String','10')
set(handles.slider7,'Value',10)
% считать данные о начальном смещении 1 и 2 тела
else
%t = 0:0.1:15*pi;
a = (k1/m1);
b = (k2/m1);
c = (k3/m2);
d = (k2/m2);
[T,Y]=ode45(@syst1,[0 30*pi],[x01 x02 0 0]);
plot(T,Y(:,1),'-',T,Y(:,2),'-.')
xlabel('t')
ylabel('x_1,x_2')
end
axis normal
function dy=syst1(t,x)
global flag a b c d T Y
dy = zeros(4,1);
dy(1)=x(3);
dy(2)=x(4);
dy(3)=-a*x(1)-b*(x(1)-x(2));
dy(4)=-c*x(2)-d*(x(2)-x(1));
После нажатия на кнопку "Выполнить" на экран выходит окно (рис.7)
Рис. 7. Интерфейс локального приложения колебаний двух осцилляторов
В левой части окна находится график (рис.7), на котором отображается зависимость координаты от времени. В правой части находится панель управления программой. На этой панели пользователь устанавливает необходимые значения масс ( ), начальных смещений ( ) и жёсткостей ( ). Затем нажимает на кнопку "Выполнить", и на экране в области, отведённой специально для графика, выводится график зависимости координат от времени обоих грузов. Серьёзной проблемой является то, что анимация выводится в активное окно. Если по какой-либо причине активным окном стало окно, отличное от окна демонстрации, анимация будет выводиться в ненадлежащее место.
Кнопочка "СТАРТ"
function pushbutton1_Callback(hObject, eventdata, handles)
global flag a b c d T Y
global flagexit
if exist('X1')
clear X1
clear Y1
end
flagexit = 0;
set(handles.pushbutton1,'Enable','off')
set(handles.pushbutton2,'Enable','on')
flag = 0; % Индикатор опции ПОШАГОВОЕ ИСПОЛНЕНИЕ
x = [-3 3 3 -3 -3];
y = [1 1 9 9 1];
y1 = [0 0 10 10 0];
ly = [5 8 2 8 2 8 2 8 2 8 2 8 5];
z=[];
l = [30 35 35 30 30];
timemax =30*pi;
hw = 3; % половина ширины бруска
cmr = 20; % положение цента масс правого бруска
supportleft = -20;
supportright = 40;
%X,Y смещение бруска из положения равновесия.
X1 = Y(:,1);
Y1 = Y(:,2);
%определили размер массива данных
n = length(X1);
for i=1:n
if flagexit
break
end
% Положение центра масс = displ
displ = X1(i); % смещение левого бруска
% Положение центра масс = dispr
dispr = cmr+Y1(i); % смещение правого бруска
%определили шаг пружины: расстояние от левой опоры до левого края бруска разделили на 12 звеньев
stepl = (displ - hw - supportleft)/12;
%определили шаг пружины: расстояние от правой опоры до правого края бруска разделили на 12 звеньев
stepr = (supportright - dispr - hw)/12;
%определили шаг пружины: расстояние от правого края левого бруска до левого края правого бруска разделили на 12 звеньев
stepc = ( dispr - (displ + 2 * hw) )/12;
%Задали координаты для рисования пружины
lx = supportleft : stepl : displ - hw;
lr = dispr + hw: stepr : supportright;
lc = displ + hw : stepc : dispr - hw;
%рисуем брусочки и опоры
fill(x + displ,y1 + 20,'r',x + dispr,y1 + 20,'r',supportleft - x/(4*hw),y + 20,'k',supportright + x/(4*hw),y + 20,'k')
% рисуем пружинки
line(lx , ly+20) % левая пружина
line(lr , ly+20) % правая пружина
line(lc , ly+20) % центральная пружина
%устанавливаем графический режим минимизирующий мерцание
set(gcf,'doublebuffer','on');
axis equal
axis off
%принудительно вывели рисунок на экран
drawnow
% Пошаговое исполнение
if flag
uiwait
% Остановка программы и ожидание команды uiresume
end
end
Кнопочка "СТОП"
function pushbutton2_Callback(hObject, eventdata, handles)
global flag
set(handles.pushbutton2,'Enable','off')
set(handles.pushbutton3,'Enable','on')
set(handles.pushbutton4,'Enable','on')
flag = 1;
Кнопочка "Следующий шаг"
function pushbutton3_Callback(hObject, eventdata, handles)
uiresume
Кнопочка "ПРОДОЛЖИТЬ"
function pushbutton4_Callback(hObject, eventdata, handles)
global flag
flag = 0;
uiresume
set(handles.pushbutton2,'Enable','on')
set(handles.pushbutton3,'Enable','off')
set(handles.pushbutton4,'Enable','off')
Кнопочка "ВЫХОД"
function pushbutton5_Callback(hObject, eventdata, handles)
global flagexit
my_closereq
Рис. 8. Окно демонстрации колебаний в локальном приложении
После того, как пользователь нажимает на кнопку "Демонстрация", на экран выводится окно, в котором показана анимация (рис.8) с учётом тех значений, которые были выбраны. В этом окне есть панель управления демонстрацией. В данный момент (рис.8) кнопка "СТАРТ" неактивна, так как происходит анимирование данных. Когда мы нажимаем на кнопку "СТОП" можно просмотреть демонстрацию по шагам (при нажатии на "Следующий шаг", которая становится активной после нажатия "СТОП"). Также можно продолжить демонстрацию посредством кнопки "ПРОДОЛЖИТЬ". В любой момент можно выйти из демонстрации и вернуться к интерфейсу, где можно снова поменять значения и просмотреть анимацию с другими значениями.
После остановки колебаний системы, окно может быть свёрнуто или закрыто, после чего работа с программой продолжается, и пользователь может вводить новые значения.
Теперь рассмотрим приложение для трёх осцилляторов, окно программы представлено на рис.9.
function pushbutton1_Callback(hObject, eventdata, handles)
global a b c d e f T Y
global hS1 hS2 hS3
set(handles.pushbutton4,'enable','on')
min1 = get(handles.slider1,'Min');
max1 = get(handles.slider1,'Max');
min2 = get(handles.slider2,'Min');
max2 = get(handles.slider2,'Max');
min3 = get(handles.slider3,'Min');
max3 = get(handles.slider3,'Max');
min4 = get(handles.slider4,'Min');
max4 = get(handles.slider4,'Max');
min5 = get(handles.slider5,'Min');
max5 = get(handles.slider5,'Max');
min6 = get(handles.slider6,'Min');
max6 = get(handles.slider6,'Max');
min7 = get(handles.slider7,'Min');
max7 = get(handles.slider7,'Max');
min8 = get(handles.slider8,'Min');
max8 = get(handles.slider8,'Max');
min9 = get(handles.slider9,'Min');
max9 = get(handles.slider9,'Max');
min10 = get(handles.slider10,'Min');
max10 = get(handles.slider10,'Max');
m1 = str2num(get(handles.edit1,'String'));
m2 = str2num(get(handles.edit2,'String'));
m3 = str2num(get(handles.edit3,'String'));
x01 = str2num(get(handles.edit4,'String'));
x02 = str2num(get(handles.edit5,'String'));
x03 = str2num(get(handles.edit6,'String'));
k1 = str2num(get(handles.edit7,'String'));
k2 = str2num(get(handles.edit8,'String'));
k3 = str2num(get(handles.edit9,'String'));
k4 = str2num(get(handles.edit10,'String'));
if (m1 > max1) | (m1 < min1) | (m2 > max2) | (m2 < min2) | (m3 > max3) | (m3 < min3) | (x01 > max4) | (x01 < min4) | (x02 > max5) | (x02 < min5) | (x03 > max6) | (x03 < min6)
m1
max1
min1
errordlg('Допустимый диапазон [-10;10]','Ошибка ввода данных')
set(handles.edit1,'String','10')
set(handles.slider1,'Value',10)
set(handles.edit2,'String','10')
set(handles.slider2,'Value',10)
set(handles.edit3,'String','10')
set(handles.slider3,'Value',10)
set(handles.edit4,'String','5')
set(handles.slider4,'Value',5)
set(handles.edit5,'String','5')
set(handles.slider5,'Value',5)
set(handles.edit6,'String','5')
set(handles.slider6,'Value',5)
set(handles.edit7,'String','1')
set(handles.slider7,'Value',1)
set(handles.edit8,'String','1')
set(handles.slider8,'Value',1)
set(handles.edit9,'String','1')
set(handles.slider9,'Value',1)
set(handles.edit10,'String','1')
set(handles.slider10,'Value',1)
else
% Считать данные о начальном смещении 1, 2 и 3 тел
% Вычисление смещения 1, 2 и 3 тел в зависимости от времени
a = (k1/m1);
b = (k2/m1);
c = (k2/m2);
d = (k3/m2);
e = (k4/m3);
f = (k3/m3);
[T,Y] = ode45(@syst1,[0 15*pi],[x01 x02 x03 0 0 0]);
hS1 = subplot(3,2,1);
plot(T,Y(:,1),'b-');
s1 = get(handles.checkbox1,'Value');
if s1
hold on
else
hold off
end
xlabel('t')
ylabel('x_1')
hS2 = subplot(3,2,3);
plot(T,Y(:,2),'m-');
s1 = get(handles.checkbox1,'Value');
if s1
hold on
else
hold off
end
xlabel('t')
ylabel('x_2')
hS3 = subplot(3,2,5);
plot(T,Y(:,3),'r-');
s1 = get(handles.checkbox1,'Value');
if s1
hold on
else
hold off
end
xlabel('t')
ylabel('x_3')
end
axis normal
function dy=syst1(t,x)
global a b c d e f
dy=zeros(6,1);
dy(1)=x(4);
dy(2)=x(5);
dy(3)=x(6);
dy(4)=-a*x(1)-b*(x(1)-x(2));
dy(5)=-c*(x(2)-x(1))-d*(x(2)-x(3));
dy(6)=-e*x(3)-f*(x(3)-x(2));
x1=dy(4);
x2=dy(5);
x3=dy(6);% Очистка осей координат
При нажатии на кнопку "Выполнить", на экран выходит окно (рис.9)
Рис.9. Окно программы после введения необходимых значений
После того, как пользователь введёт какие-то значения, в области для графика выводятся зависимости координат от времени всех трёх грузов. При нажатии на кнопку "Демонстрация", на экран выводится анимация колебаний трёх связанных осцилляторов (рис.10).
Кнопочка "СТАРТ"
function pushbutton1_Callback(hObject, eventdata, handles)
global flag a b c d T Y
global flagexit
if exist('X1')
clear X1
clear Y1
clear Z1
end
flagexit = 0;
set(handles.pushbutton1,'Enable','off')
set(handles.pushbutton2,'Enable','on')
flag = 0; % Индикатор опции ПОШАГОВОЕ ИСПОЛНЕНИЕ
x = [-3 3 3 -3 -3]; % Горизонтальные координаты
y = [0 0 12 12 0]; % Верхние и нижние границы опоры
y1 = [0 0 12 12 0]; % Верхние и нижние границы бруска
ly = [6 10 2 10 2 10 2 10 2 10 2 10 6]; % верхние и нижние границы пружины
z=[];
l = [30 35 35 30 30];
timemax =15*pi;
hw = 3; % половина ширины бруска
cml = -13; % положение цента масс левого бруска
cmc = 9; % положение цента масс центрального бруска
cmr = 31; % положение цента масс правого бруска
supportleft = -32; % Положение левой опоры
supportright = 50; % Положение правой опоры
%t = [0:0.1:timemax];
%X,Y,Z смещение бруска из положения равновесия.
X1=Y(:,1); % Смещение левого бруска
Y1=Y(:,2); % Смещение центрального бруска
Z1=Y(:,3); % Смещение правого бруска
%определили размер массива данных
n = length(X1);
for i=1:n
if flagexit
break
end
% Положение центра масс левого бруска = displ
displ = cml+X1(i); % смещение левого бруска
% Положение центра масс центрального бруска = dispс
dispc = cmc+Y1(i); % смещение центрального бруска
% Положение центра масс правого бруска = dispr
dispr = cmr+Z1(i); % смещение правого бруска
%определили шаг пружины: расстояние от левой опоры до левого края левого бруска разделили на 12 звеньев
stepl = (displ - hw - supportleft)/12;
%определили шаг пружины: расстояние от правой опоры до правого края правого бруска разделили на 12 звеньев
stepr = (supportright - dispr - hw)/12;
%определили шаг пружины: расстояние от правого края левого бруска до левого края центрального бруска разделили на 12 звеньев
stepc1 = ( dispc - displ - 2*hw)/12;
%определили шаг пружины: расстояние от правого края центрального бруска до левого края правого бруска разделили на 12 звеньев
stepc2 = ( dispr - dispc - 2 * hw)/12;
%Задали координаты для рисования пружины
l1 = supportleft : stepl : displ - hw; % Пружина между опорой и левым бруском
l2 = displ + hw: stepc1 : dispc-hw; % Пружина между левым бруском и центральным
l3 = dispc + hw : stepc2 : dispr - hw; % Пружина между центральным бруском и правым
l4 = dispr + hw : stepr : supportright; % Пружина между правым бруском и опорой
%рисуем брусочки и опоры
fill(x + displ,y1 + 20,'r',x + dispr,y1 + 20,'r',x + dispc,y1 + 20,'r',supportleft - x/(4*hw),y + 20,'k',supportright + x/(4*hw),y + 20,'k')
% рисуем пружинки
line(l1 , ly+20) % левая пружина
line(l3 , ly+20) % правая пружина
line(l4 , ly+20) % пружина между левым грузом и центральным
line(l2 , ly+20) % пружина между центральным грузом и правым
%устанавливаем графический режим минимизирующий мерцание
set(gcf,'doublebuffer','on');
axis equal
axis off
%принудительно вывели рисунок на экран
drawnow
% Пошаговое исполнение
if flag
uiwait
% Остановка программы и ожидание команды uiresume
end
end
Кнопочка "СТОП"
function pushbutton2_Callback(hObject, eventdata, handles)
global flag
set(handles.pushbutton2,'Enable','off')
set(handles.pushbutton3,'Enable','on')
set(handles.pushbutton4,'Enable','on')
flag = 1;
Кнопочка "Следующий шаг"
function pushbutton3_Callback(hObject, eventdata, handles)
uiresume
Кнопочка "ПРОДОЛЖИТЬ"
function pushbutton4_Callback(hObject, eventdata, handles)
global flag
flag = 0;
uiresume
set(handles.pushbutton2,'Enable','on')
set(handles.pushbutton3,'Enable','off')
set(handles.pushbutton4,'Enable','off')
Кнопочка "ВЫХОД"
function pushbutton5_Callback(hObject, eventdata, handles)
global flagexit
my_closereq
Рис.10. Окно демонстрации для трёх осцилляторов
На следующих рисунках представлены графики, получившиеся в результате проделанной работы.
Рис. 11. Синфазное движение грузов ( , )
Рис. 12. Движение грузов в противофазе ( , )
Рис. 13. Произвольное движение грузов ( , )
На рисунках 11 - 15 представлены графики движения для системы с двумя грузами. Теперь рассмотрим графики, которые получились для трёх грузов.
Рис.14. Одна из нормальных мод колебаний трёх связанных осцилляторов
Рис. 15. Колебание трёх осцилляторов.
Представленная локальная версия программы рассчитана для тех людей, которые не имеют на своём компьютере выход в Интернет. Эта программа предполагает, что пользователь умеет работать с системой MATLAB. Чтоб воспользоваться этой программой, необходимо открыть MATLAB и найти в списке предлагаемых папок ту, в которой располагается данная программа, а уже затем начинать работать. Это не очень удобно, так как не всякий пользователь, который захочет изучить данные процессы колебаний, умеет пользоваться системой MATLAB. К тому же, чтобы воспользоваться программой, необходимо иметь на компьютере установленную систему MATLAB. Но если человеку только один раз придётся использовать виртуальную демонстрацию, ему необходимо сначала установить программу на свой компьютер. Это приводит к мысли, что необходимо создать такое приложение, которое не требует никаких знаний программирования, и первое что приходит в голову - это Интернет. Именно поэтому нами было создано web-приложение данной программы на базе MATLAB Web Server [2,3]. Это приложение позволяет любому пользователю испробовать данную программу, не имея при этом установленной на компьютере системы MATLAB, для работы достаточно только иметь выход в Интернет. На рисунке (рис.16) представлен вид приложения на сайте математического моделирования (http://mathmod.aspu.ru).
Рис.16. Вид окна на сайте математического моделирования
Достоинством данного приложения является то, что этот продукт доступен любому пользователю, который может выйти в Интернет. Данное приложение может использоваться как преподавателями, так и студентами, оно позволяет наглядно увидеть и изучить явление колебаний двух грузов в отсутствии внешних воздействий (например, силы трения или вес пружины и т.д.). В этой программе рассмотрена идеализированная система, которую мы не можем увидеть в реальности. Графики, полученные в результате моделирования, приведены на рис. 11 - 15. Также данное приложение обеспечивает многопользовательский доступ, т.е. несколько пользователей могут одновременно работать с моделью, вводя свои данные и не мешая друг другу.
Анимация часто используется программистами в качестве метода отображения результатов. Никаких трудностей при создании анимации не возникает в случае представления результатов работы программы в виде матриц, MATLAB на их основе легко генерирует изображения, которые в свою очередь легко интегрируются в html-формы. Анимация в локальной версии сделана с помощью встроенных функций MATLAB.
В случае разработки web-приложения этот способ не подходит, так как созданная анимация не сохраняется в виде конечного файла, который можно было бы расположить на html-форме web-приложения. Естественно, MATLAB предоставляет возможность записи анимации в файл[4,5], например, с помощью функции imwrite (создает gif-файл). Данная функция работает совместно с функцией getframe, генерирующей кадры, которые последовательно дописываются в файл. Динамические gif-файлы не требуют никаких plug-in для их просмотра, могут быть помещены в кэш, не требуют повторного обращения к серверу, не требуют для работы постоянной связи с сервером, просто помещаются на страницу.
Но данная анимация имеет и ряд недостатков. Во-первых, она имеет большой размер (порядка мегабайта), из-за чего страница сайта очень долго загружается, пользователь даже иногда не может дождаться открытия страницы. Также из-за этой проблемы возникает неудобство, так как пользователь может истратить большой трафик Интернета, пока ждёт загрузки. Второй проблемой данного приложения является то, что анимация происходит с такой частотой, при которой пауза между кадрами очень заметна. Одним из возможных вариантов решения данной проблемы - передача результатов расчетов в виде текстовых файлов с данными, а не графиков, с последующим отображением (визуализацией) на стороне клиента.
Виртуальная физическая лаборатория может легко быть модифицирована для изучения более сложных явлений. Например, можно изучать вынужденные колебания связанных осцилляторов или влияние нелинейности на колебания.
Созданная виртуальная демонстрация используется в учебном процессе как составная часть сайта математического моделирования http://mathmod.aspu.ru.
Литература
1. Мандельштам Л.И. Лекции по теории колебаний. М. Наука. 1972.
2. Котельников И.А., Черкасский В.С. MATLAB Web Server: вычисления в Интернете. // Exponenta Pro. Математика в приложениях. 2004, 1 (5), с. 4-11.
3. Пономарева И.С. ,Зелепухина В.А., Тарасевич Ю.Ю. Некоторые аспекты создания Web-приложения на базе MATLAB Web Server // Информационные технологии, №9, 2006, С. 68-72
4. Тарасевич Ю.Ю., Пономарева И.С., Зелепухина В.А., Манжосова Е.Н., Панченко Т. В. Применение ВЕБ-технологий в физическом практикуме. // Физическое образование в вузах, 2006, Т. 12, № 1, с. 103-114.
5. Пономарева И.С., Зелепухина В.А., Тарасевич Ю.Ю. Разработка приложений для MATLAB Web Server // Компьютерные инструменты в образовании, 2005, №4, с. 48-56.
|