
- •Моделирование движения голономных механических систем в пакете Matlab
- •Введение
- •Основы программирования в системе Matlab
- •Работа с матрицами
- •Построение графиков
- •Дескрипторная графика [2] Графические объекты
- •Использование дескрипторов объектов
- •Функции для работы с графическими объектами
- •Установка свойств объекта
- •Определение осей или рисунка
- •Нахождение дескрипторов существующих объектов
- •Скрипты и функции
- •Полезные команды
- •Решение систем дифференциальных уравнений
- •Визуализация движения в Матлабе
- •Библиотека примитивов
- •Окружность
- •Заштрихованная кривая
- •Спираль
- •Пружина
- •Примеры моделирования голономных систем Диск с маятником
- •Визуализация динамики механической системы.
- •Уравнения равновесия системы
- •Динамические эффекты на примере диска с маятником
- •Цилиндр, катающийся в подвижном желобе
- •Заключение
- •Литература
Полезные команды
Пара команд tic и toc позволяет вычислить время выполнения системой той или иной операции. Если в командной строке набрать приведенную ниже последовательность команд:
tic, операция, toc
где операция – это команда или набор команд, то будет отображен не только результат выполнения заданной операции, но и приблизительное время ее выполнения (в секундах). При этом функция tic запускает секундомер, а функция toc выводит вычисленное время. Это время зависит от нескольких различных факторов и может изменяться, поэтому для получения более точных значений времени следует провести несколько измерений, а результаты усреднить.
Пары команд tic-toc могут вкладываться друг в друга.
Команда rand(m,n) возвращает матрицу размерностью m×n, содержащую псевдослучайные числа из равномерного распределения на открытом интервале (0, 1).
Пример вычисления числа π методом Монте-Карло:
Команда comet(x) отображает график кометы вектора x. Это анимированный график, в котором кружок (голова кометы) вычерчивает точки на экране. Тело кометы – это замыкающий участок, следующий за головой кометы. Хвост кометы – это сплошная линия, фиксирующая целую функцию.
Команда comet3(x) отображает 3-D график кометы вектора x.
Команда rotate(h,direction,alpha) вращает графический объект с дескриптором h в трехмерном пространстве в соответствии с правилом правой руки. Здесь alpha – угол вращения, direction – двух-или трех-мерный вектор, определяющий ось вращения
Решение систем дифференциальных уравнений
Используемая в следующих разделах стандартная функция ode45 предназначена для решения задачи Коши обыкновенных дифференциальных уравнений методом Рунге-Кутты 4 и 5 порядка.
Синтаксис:
[t, Y]=ode45(odefun,tspan,y0)
[t, Y]=ode45(odefun,tspan,y0,options)
Входные параметры:
odefun – указатель функции, которая возвращает правые части обыкновенных дифференциальных уравнений;
tspan – вектор, содержащий значения моментов времени, для которых интегрируется система.
y0 – вектор начальных условий;
options – параметр, предназначенный для изменения свойств интегрирования по умолчанию. Структура параметра option получается в результате выполнения стандартной функции odeset, которая принимает в качестве параметров пары «свойство»-«значение».
Выходные параметры: t – вектор временных точек; Y – вектор результатов интегрирования, соответствующих временным точкам из t.
Для настройки в программном коде используются следующие свойства интегратора [2]:
Свойство |
Значение |
Описание |
RelTol |
Положительная скалярная величина (значение по умолчанию 1e-3) |
Допустимая относительная погрешность, которая относится ко всем компонентам вектора решения. |
AbsTol |
Положительная скалярная величина или вектор (значение по умолчанию 1e-6) |
Допустимые абсолютные погрешности, которые относятся к отдельным компонентам вектора решения. |
OutputFcn |
Указатель функции |
Функция, которую должен вызывать ode45 после каждого успешного шага интегрирования. |
OutputSel |
Вектор индексов |
Указывает, какие компоненты вектора решения должны быть переданы функции вывода (OutputFcn). |
Refine |
Целое положительное |
Увеличивает количество точек вывода на коэффициент Refine. |
InitialStep |
Положительная скалярная величина |
Предлагаемый начальный размер шага. |
В
качестве примера работы функции ode45
будет рассмотрена задача визуализации
движения математического маятника.
Вектор фазовых переменных данной системы
.
В качестве параметров системы задаются длина l маятника, начальные условия интегрирования:
global l;
l = 2;
y0= [0.5 0]
Следующими командами интегрируются дифференциальные уравнения движения с начальными условиями y0 в промежутке времени от 0 до 20 с шагом 0.01.
tout=[0:0.01:20];
options = odeset('RelTol',1.e-4,'AbsTol', [1e-5 1e-5],'OutputFcn','odeplot');
[t,y]=ode45(@f,tout,y0,options)
Символом @ обозначается указатель на функцию. Физически указатель хранит адрес функции. Правые части уравнений движения являются выходными параметрами функции f, описанной ниже.
Результатом вызова функции odeplot на каждом шаге интегрирования будет следующий график:
Далее для визуализации маятника понадобятся значения угла отклонения маятника от вертикали – y(:,1), вектор этих значений трансформируется и сохраняется в переменную q:
q=y(:,1)'
Далее строится изображение.
figure('Name', 'Математический маятник');
Устанавливаются свойства осей
xlim([-3 3]);
axis('equal')
hold on;
ylim([-3 0.5]);
Чертится подвес маятника со штриховкой:
line([0 -0.1 0.1 0],[0 0.1 0.1 0],'LineWidth',2,'Color','k');
line([-0.1 0],[0.1 0.2 ],'LineWidth',2,'Color','k')
line([0 0.1],[0.1 0.2 ],'LineWidth',2,'Color','k')
line([0.1 0.2],[0.1 0.2 ],'LineWidth',2,'Color','k')
text(0.1,0,'O')
Чертится вертикальная линия:
line([0 0],[0.5 -3],'LineWidth',1,'Color','k','LineStyle','--')
Вычисляются координаты конца маятника
xo = l*sin(q(1,1));
yo = l*cos(q(1,1));
Рисуется маятник:
h_sterjen1 = line([0 -xo],[0 -yo],'LineWidth',2,'Color','k');
На рисунке ставится точка А:
dist = 0.2;
a_txt = text(-xo-dist ,-yo-dist ,'A');
R=0.5 %расстояние от т.О до метки угла фи.
Указывается угол ϕ:
fi_txt = text(-(R+dist)*sin(q(1,1)/2),-(R+dist)*cos(q(1,1)/2),'\phi');
fi=0:0.01:q(1,1)
h_angle=line(-R*sin(fi),-R*cos(fi),'Color','k', 'LineStyle', '--')
Указывается текущее время:
info_txt = text(-2,1,'t = 0');
Рисуется точка на конце маятника:
h_circle=line(xo,yo, 'Marker','.','MarkerSize',30,'Color','k');
Далее с использованием дескрипторов визуализируется положение маятника в каждый момент времени (len – конечный момент времени)
len=length(t);
for i=1:len
xo = l*sin(q(1,i)); %Координаты центра диска
yo = l*cos(q(1,i));
x_fi_txt=(R+dist)*sin(q(1,i)/2);% Координаты метки угла фи
y_fi_txt=(R+dist)*cos(q(1,i)/2);
set(h_sterjen1,'XData',[0 -xo]);
set(h_sterjen1,'YData',[0 -yo]);
set(h_circle,'XData',-xo);
set(h_circle,'YData',-yo);
if q(1,i)>0
fi = 0:0.01:q(1,i);
else
fi = - (0:0.01:-q(1,i));
end
set(h_angle,'XData',-R*sin(fi));
set(h_angle,'YData',-R*cos(fi));
set(a_txt,'Position',[-xo-dist -yo-dist]);
set(fi_txt, 'Position', [-x_fi_txt, -y_fi_txt]);
set(info_txt,'String',['t = ',num2str(t(i))]);% Текущее время
pause(0.02);
end;
Ниже указан программный код функции, возвращающей правые части уравнений движения.
function dydt = f(t, y)
g = 9.8
global l
fi = y(1)
fit = y(2)
dydt(1)=fit;
dydt(2)= -g/l * sin(fi);
dydt=dydt';
В следующих главах рассматривается визуализация более сложных примеров с такими дополнительными возможностями, как ввод численных значений параметров пользователем, вывод графиков системы, визуализация системы при помощи определенных пользователей функций – графических примитивов.
Задания.
Выведите на экран графики решений систем дифференциальных уравнений:
при
,
,
,
;
при ,
,
,
;
при ,
,
,
.