АНАЛИТИЧЕСКИЕ АЛГОРИТМЫ СФЕРИЧЕСКОГО ДВИЖЕНИЯ ТВЕРДОГО ТЕЛА - Студенческий научный форум

IV Международная студенческая научная конференция Студенческий научный форум - 2012

АНАЛИТИЧЕСКИЕ АЛГОРИТМЫ СФЕРИЧЕСКОГО ДВИЖЕНИЯ ТВЕРДОГО ТЕЛА

 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Стремительное развитие вычислительной техники и программного обеспечения, наблюдаемое в последнее время, существенно облегчило решение задач, связанных с математическим моделированием различных систем и процессов, в том числе и обусловленных механическим движением объектов.

Применение аналитических методов позволяет упростить и алгоритмизировать решение задач, использовать стандартные информационные ресурсы и получать результаты исследования в любом виде, включая визуализацию движения в реальном режиме времени.

Рассмотрим такое движение твердого тела, при котором одна его точка остается неподвижной во все время движения. Так как все точки тела при таком движении перемещаются вдоль траекторий, расположенных на поверхностях сфер, это движение называется сферическим.

Такое движение совершают конические барабаны специальных мельниц (рис.1), конические шестерни в дифференциальных передачах (рис.2), некоторые пространственные конструкции,  крестовина  универсального шарнира Кардано-Гука (рис.3), различные волчки (рис.5), конус (усеченный конус), катящийся по неподвижной поверхности (рис.6).  Более часто сферическое движение является составной частью сложного движения тела. Общий случай движения твердого тела рассматривается как совокупность поступательного и сферического движений.

Как известно, абсолютно твердое тело - это система материальных точек,

расстояния между которыми остаются неизменными при любых физических процессах. Пусть - система координат, жестко связанная с телом. Очевидно, изменение положения тела в пространстве относительно выбранной неподвижной системы отсчета (движение тела) абсолютно точно определяется изменением положения этой ( ) системы координат. Этот факт позволяет в дальнейшем в общем случае говорить о преобразованиях координатной системы  в трехмерном (линейном) пространстве . Понятие линейного преобразования  (отображения) векторного пространства достаточно подробно изучается в курсе линейной алгебры [1]. Несложно перенести классические утверждения теории линейных преобразований в традиционные разделы теоретической механики.

Покажем, что в любой момент времени движения существуют точки пространства, элементарные перемещения которых, а, следовательно, и скорости равны нулю. Так как выбор системы отсчета не является принципиальным, мы всегда можем считать, что начальное положение системы координат , жестко связанной с телом и перемещающейся вместе с ним в точности совпадает с положением неподвижной системы отсчета. Тогда движение подвижной системы отсчета относительно неподвижной полностью определяется заданием матрицы линейного преобразования

Элементы этой матрицы - направляющие косинусы ортов подвижной системы отсчета . Нетрудно показать, что одним из собственных значений этой матрицы является 1. Это означает, что найдется система коллинеарных  собственных векторов, удовлетворяющих равенству .То есть в каждый момент времени движения существует мгновенная ось вращения тела.

Пусть : , тогда для любого момента времени выполняются соотношения

Продифференцировав обе части равенства (2) по времени, с учетом зависимости (3), получим

Известная формула Эйлера, выражающая скорость точки тела при его повороте вокруг оси,

может быть записана в матричном виде [2]:

где

- матрица (тензор) угловой скорости тела,  - радиус-вектор точки, представленный в виде матрицы-столбца.

Сопоставление  выражений (4) и (5) дает

 Введем в рассмотрение  тензор углового ускорения , получаемый дифференцированием по времени тензора угловой скорости

Продифференцировав соотношение (6) по времени, получим формулу для определения ускорения точек тела, совершающего сферическое движение [2],

Для задания движения твердого тела относительно неподвижной точки  могут быть использованы обобщенные координаты, введенные Эйлером и называемые уг­лами Эйлера [3,4 и др.]. Эти углы обладают тем свойством, что через них легко выражаются координаты любой точки тела.

Через неподвижную точку  твердо­го тела проведем неподвижную систему координат , относительно которой будем рас­сматривать движение тела (рис.7).

Другую систему координат  свяжем с самим телом, вращающимся вокруг неподвижной точки . Положение тела определится положением подвижной системы координат относительно неподвижной.

Подвижная плоскость   пересекает неподвижную  по некоторой линии OK, изменяющей свое положение на плоскости . Эту проходящую через неподвижную точку линию OK называют линией узлов. За положительное направление линии узлов выбирается то направление, с которого поворот от оси  к оси  на наименьший угол виден происходящим против часовой стрелки. 

Угол   определяет положение линии узлов относительно неподвижной координатной оси . Угол  между осью  и линией узлов OK называют углом прецессии. Угол     считается положительным, если он отсчитывается против часовой стрелки, если смотреть с положительного направления оси  (от оси  к оси ОК). Угол прецессии откладывают первым для определения положения подвижной системы относительно неподвижной. Линия узлов ОК определяет положение вертикальной плоскости, в которой находится ось собственного вращения тела.

Положение оси собственного вращения тела по отношению к неподвижной вертикальной оси  определяет угол нутации . Угол   будет считаться положительным, если он отсчитывается от оси   к оси   против хода часовой стрелки, если смотреть с положительного направления линии узлов.

Оси  и  подвижной системы координат расположены в плоскости, перпендикулярной оси  собственного вращения. Положение оси  по отношению к линии узлов в этой плоскости определяется углом , называемым углом собственного вращения. Угол   считается положительным, если он отсчитывается против хода часовой стрелки, если смотреть с положительного конца оси  .

При вращении тела вокруг неподвижной точки изменяются все три угла Эйлера. При этом тело можно перевести из одного положения в другое, изменяя углы Эйлера не все сразу, а последовательно, в любом порядке, начиная с любого угла.

Это позволяет утверждать, что углы Эйлера являются независимыми пара­метрами. Чтобы задать уравнения сферического движения, нужно представить углы Эйлера как непрерывные, однозначные функции времени:

Уравнения (8) являются кинематическими уравнениями вращения тела вокруг неподвижной точки.

Последовательность осуществляемых поворотов можно описать посредством соответствующих матричных выражений [5]:

 В результате получим матрицу преобразования P, которая получается путем последовательного перемножения матриц элементарных поворотов:

Результирующая матрица имеет следующий вид:

Для нахождения матрицы угловой скорости и углового ускорения в неподвижной системе отсчета воспользуемся  формулами (6) и (7):

Обратная (транспонированная) имеет вид:

Найдем производную по времени от оператора преобразования (матрица разбита на 3 слагаемых в связи с ограниченными возможностями редактора формул):

Для нахождения компонент вектора угловой скорости воспользуемся формулой (6):

Так как вектор, соответствующий матрице

имеет вид

то в результате вычислений получим

Продифференцировав полученный вектор-столбец по времени, найдем угловое ускорение:

Тогда вычисления по формуле (5) приводят к аналитическому выражению, позволяющему вычислить скорость точки , с радиусом-вектором  :

Наконец, запишем матрицу для нахождения ускорений точек твердого тела при его сферическом движении:

Пример 1.

Прямой круговой конус (рис. 8) с высотой  и углом 2α при вершине катится без скольжения по неподвижной горизонтальной плоскости. Ось симметрии конуса вращается равномерно вокруг вертикальной оси с угловой скоростью . Определить скорости и ускорения точек      и , расположенных на концах взаимно перпендикулярных диаметров в основании конуса так, что отрезок  горизонтален.

Решение

Конус совершает сферическое движение, при котором вершина  конуса остается неподвижной. Мгновенная ось вращения совпадает с образующей конуса, касающейся неподвижной плоскости. Выберем систему координат  так, чтобы ось  совпадала с мгновенной осью вращения. Изобразим векторы угловой скорости переносного (вокруг оси ) и относительного (вокруг оси ) вращений  и .

Определим угловую скорость конуса как сумму угловых скоростей составляющих вращений

При этом Откуда

Соответствующая матрица угловой скорости

Определим угловое ускорение конуса как скорость конца вектора , поворачивающегося вокруг вертикальной оси с угловой скоростью  по формуле Эйлера (5):

Откуда

Матрица углового ускорения при этом записывается по формуле (7):

4. Скорости точек  вычислим по формуле Эйлера  

где  - векторы-столбцы координат точки ;

Откуда

5. Ускорения точек  определим по формуле

 где               

Откуда

Для кинематического расчета аналогичных задач была составлена программа.

Программа предназначена для вычисления скоростей и ускорений точек конуса, совершающего сферическое движение.

Программа получает на вход:

 - половину угла раствора конуса, рад;

 h  - высоту конуса, м;

 - угловую скорость конуса относительно вертикальной оси, рад/с.

1. Генерируем вектор угловой скорости.

В рассматриваемом случае он равен

2. Вычисляем вектор углового ускорения конуса по формуле

3. Находим скорости и ускорения в требуемых точках по формулам:

где

- радиус -вектор рассматриваемой точки;

   - матрица угловой скорости конуса;

 - матрица углового ускорения конуса;

Математические процедуры описаны в листинге программы или входят в стандартную библиотеку

Программа написана на языке C++.

 

Листинг программы

#include "math.h"

#include "stdio.h"

/*

         Объявление типа матрицы 3 на 3

*/

typedef float  MAT3[3][3];

/*

         Обявление типа вектора

*/

typedef float VEC3[3];

 

#define _PI 3.1415926535

#define V_1 0

#define V_2 1

/*

 Умножение матриц 3 на 3

*/

void MxM_MULL(MAT3& out, MAT3& m1, MAT3& m2) {

         for (int i = 0; i < 3; i++)

                   for (int j = 0; j < 3; j++){

                            out[i][j] = 0;

                            for (int k = 0; k < 3; k++)

                                      out[i][j] += m1[i][k] * m2[k][j];                         

                   }

}

/*

         Суммирование матриц 3 на 3

*/

void MxM_SUMM(MAT3& out, MAT3& m1, MAT3& m2) {

         for (int i = 0; i < 3; i++)

                   for (int j = 0; j < 3; j++) {

                            out[i][j] = m1[i][j] + m2[i][j];

                   }

}

/*

         Складывает вектора

*/

void VxV_SUMM(VEC3& out, VEC3& v1, VEC3& v2) {

         out[0] = v1[0] + v2[0];

         out[1] = v1[1] + v2[1];

         out[2] = v2[2] + v2[2];

};

/*

         Умножение матрицы 3 на 3 на вектор столбец

*/

void MxV_MULL(VEC3& out, MAT3 m, VEC3& v) {

         for (int i = 0; i < 3; i++) {

                   out[i] = 0;

                   for (int k = 0; k < 3; k++)

                            out[i] += m[i][k] * v[k];

         }

};

/*

         Генерирует нулевую матрицу

*/

void MAT_Zero(MAT3& out) {

         for (int i = 0; i < 3; i++)

                   for (int j = 0; j < 3; j++) out[i][j] = 0;

};

/*

         Находит скорость в точке

*/

void _FindVelocity(VEC3& out, MAT3& mAngularVelocity, VEC3& vR) {

         MxV_MULL(out, mAngularVelocity, vR);

};

/*

         Находит ускорение в точке

*/

void _FindAcceleration(VEC3& Out, MAT3& mAngularVelocity, MAT3& mAngularAcceleration, VEC3& vR) {

         MAT3 Temp;

         MAT3 Temp2;

         MxM_MULL(Temp, mAngularVelocity, mAngularVelocity);

         MxM_SUMM(Temp2, Temp, mAngularAcceleration);

         MxV_MULL(Out, Temp2, vR);

};

/*

         Формирует кососимметричную матрицу из вектора

*/

void MAT_GenAntisymmetric(MAT3& out, VEC3& v) {

         MAT_Zero(out);

         out[0][1] = -v[2];

         out[1][0] = v[2];

         out[0][2] = v[1];

         out[2][0] = -v[1];

         out[1][2] = -v[0];

         out[2][1] = v[0];

};

/*

         Присваивает значения компонентам вектора

*/

void VEC_Set(VEC3& out, float x, float y, float z) {

         out[0] = x;

         out[1] = y;

         out[2] = z;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

         float fAngularVelocity;                    // Угловая скорость конуса относительно вертикальной оси

         float fH;                                                     // Высота конуса

         float fAlpha;                                              // Половина угла раствора конуса

         float fR;                                                     // Радиус конуса

 

         MAT3 mAngularVelocity;                        // Матрица угловой скорости

         MAT3 mAngularAcceleration;                  // Матрица углового ускорения

         MAT3 mAngularVelocity_2;           // Матрица углового ускорения относительно вертикальной оси

         MAT3 mTransform;                                 // Матрица поворота

         VEC3 vAngularVelocity;                          // Вектор угловой скорости 

         VEC3 vAngularAcceleration;          // Вектор углового ускорения

         VEC3 vAngularVelocity_2;             // Вектор угловой скорости относительно вертикальной оси

         VEC3 vCoord_Centr;                               // Вектор переноса

         VEC3 vVelocity;                                       // Вектор скорости точки

         VEC3 vAcceleration;                                // Вектор ускорения точки

         float fStep = 0.0f;                                      // Шаг, для расчета точек на ободе основания

         float fAngle;                                              // Угол, для расчет точек на ободе основания

         VEC3 vCoord_Local;                               // Координата точки в системе координат конуса

         VEC3 vCoord_Global;                             // Координата точки в неподвижной системе координат

         int chCommand;                                        // Выбранная команда

/*

         Ввод данных

*/

         printf("Введите высоту конуса, м ");

         scanf("%f", &fH);

         printf("Введите половину угла раствора конуса, рад ");

         scanf("%f", &fAlpha);

         printf("Введите угловую скорость вращения конуса, рад/с ");

         scanf("%f", &fAngularVelocity);

 

         fR = fH * sin(fAlpha);

 

         MAT_Zero(mTransform);

         /*

                   Генерируем матрицу преобразования координат

         */

         mTransform[0][0] = 1;

         mTransform[1][1] = cos(fAlpha);

         mTransform[1][2] = -sin(fAlpha);

         mTransform[2][1] = sin(fAlpha);

         mTransform[2][2] = cos(fAlpha);

         /*

                   Генерируем вектор переноса

         */

         VEC_Set(vCoord_Centr, 0, fH * cos(fAlpha), fH * sin(fAlpha));

         /*

                   Генерируем матрицу угловой скорости

         */

         VEC_Set(vAngularVelocity, 0, fAngularVelocity / tan(fAlpha), 0 );

         MAT_GenAntisymmetric(mAngularVelocity, vAngularVelocity);

 

         /*

                   Генерируем матрицу углового ускорения

         */

         VEC_Set(vAngularVelocity_2, 0, 0, fAngularVelocity);

 

         MAT_GenAntisymmetric(mAngularVelocity_2, vAngularVelocity_2);

        

         MxV_MULL(vAngularAcceleration, mAngularVelocity_2, vAngularVelocity);

        

         MAT_GenAntisymmetric(mAngularAcceleration, vAngularAcceleration);

         /*

                   Запрос действия

         */

         printf("Выберите действие ");

         printf("0 - Вывести значение скоростей и ускорений в точках на ободе основания конуса ");

         printf("1 - Вывести значение скорости и ускорения в определенной точке конуса ");

         scanf("%i", &chCommand);

 

         switch(chCommand) {

         case V_1:

         /*

                   Запрос шага

         */

                   printf("Введите шаг ");

                   scanf("%f", &fStep);

         /*

                   Нахождение скоростей и ускорений в точках на ободе основания конуса

         */

                   fAngle = 0.0f;

                   while (fAngle <= 2 * _PI) {

                            /*

                                      Переход от подвижной  к неподвижной  системе координат

                            */

                            VEC_Set(vCoord_Local, fR * cos(fAngle), fR * sin(fAngle), 0);

                            MxV_MULL(vCoord_Global, mTransform, vCoord_Local);

                            VxV_SUMM(vCoord_Global, vCoord_Centr, vCoord_Global);

                            /*

                                      Нахождение скоростей и ускорений в рассматриваемой точке

                            */

                            _FindVelocity(vVelocity, mAngularVelocity, vCoord_Global);

                            _FindAcceleration(vAcceleration, mAngularVelocity, mAngularAcceleration, vCoord_Global);

                            printf("Скорость точки {%f %f %f} ", vVelocity[0], vVelocity[1], vVelocity[2]);

                            printf("Ускорение точки {%f %f %f} ", vAcceleration[0], vAcceleration[1], vAcceleration[2]);

                            fAngle += fStep;

                   }

         break;

         case V_2:

                   printf("Введите координату в локальной системе координат ");

                   /*

                            Ввод координаты точки

                   */

                   scanf("%f %f %f", &vCoord_Local[0], &vCoord_Local[1], &vCoord_Local[2]);        

                            /*

                                      Переход от подвижной к неподвижной системе координат

                            */

                   MxV_MULL(vCoord_Global, mTransform, vCoord_Local);

                   VxV_SUMM(vCoord_Global, vCoord_Centr, vCoord_Global);

                            /*

                                      Нахождение скоростей и ускорений  рассматриваемой точки

                            */

                   _FindVelocity(vVelocity, mAngularVelocity, vCoord_Global);

                   _FindAcceleration(vAcceleration, mAngularVelocity, mAngularAcceleration, vCoord_Global);

                   printf("Скорость точки {%f %f %f} ", vVelocity[0], vVelocity[1], vVelocity[2]);

                   printf("Ускорение точки {%f %f %f} ", vAcceleration[0], vAcceleration[1], vAcceleration[2]);

         break;

         default:

                   printf("Завершение программы ");

                   return 0;

         break;

         }

         getchar();

 

         return 0;

}

 

Пример 2.

Заданы уравнения сферического движения  рад, рад,  рад, где - углы Эйлера. Определить для момента времени  угловую скорость и угловое ускорение тела, а также скорость и ускорение точки [6].

1) Для определения угловой скорости тела воспользуемся формулой (10):

 

 

 

 

2) Для определения углового ускорения воспользуемся формулой (11):

 

 

 

 

В заключение отметим, что часто аналитические методы решения являются наиболее эффективными по сравнению с геометрическими, в особенности для кинематических расчетов, связанных с определением ускорений произвольных точек при сферическом движении твердого тела.  Сложность составляют лишь математические преобразования, но это уже зависит от подготовленности исполнителя.

 

Список литературы:

1. Соболев, А. Б. Математика. Курс лекций для технических вузов. Книга 1 / А. Б. Соболев, А. Ф. Рыбалко. - Екатеринбург: ГОУ ВПО УГТУ-УПИ, 2004. - 180 с.;

2. Рощева, Т. А. Методические возможности использования теории линейных преобразований при изложении курса теоретической механики /      Т. А. Рощева, Е. А. Митюшов // Механика. Научные исследования и учебно-методические разработки. Международный  сборник научных трудов.     Выпуск 3. - Гомель, 2009. - С.199-207;

3. Митюшов, Е. А. Теоретическая механика / Е. А. Митюшов, С. А.  Берестова. - М.: Издательский центр «Академия», 2006. - 320 с.;

4. Тарг, С. М. Теоретическая механика / С. М. Тарг. - Москва: Высшая школа, 1982. - 111с.;

5. Голубев, Ю. Ф. Основы теоретической механики / Ю. Ф. Голубев. - М.: Издательство МГУ, 2000. - 720с.;

6. Яблонский, А. А. Сборник заданий для курсовых работ по теоретической механике. Издание седьмое / А. А. Яблонский. - Москва: ИНТЕГРАЛ-ПРЕСС, 2002. - 384с.

Просмотров работы: 17