Программа для демонстрации шаблона для численного интегрирования уравнения прогиба плоской пластины (двумерный случай)

Страницы работы

Содержание работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра ПП и МЭ

Nstu

РГЗ по механике твердого тела

Программа для демонстрации шаблона для численного интегрирования уравнения прогиба плоской пластины (двумерный случай)

Факультет:              РЭФ

Группа:                   РМС7-71

Студент:                 Кохно К.C.

Преподаватель:      Усольцев Н.В.

Новосибирск 2010

Задача:

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

Проще говоря сделать более удобный Windows аналог предоставленного консольного приложения.

В программе должно быть:

- Сетка 4х4 точек

- Должна быть возможность перемещать шаблон по этой сетке произвольным образом

- Для каждого положения шаблона должно быть выведено соответствующее уравнение

- После демонстрации всех положений шаблона должна быть выведена на экран матрица полученных уравнений

Математическое описание:

Уравнение на прогиб пластины (уравнение Софи Жермен):

В нашем случае:

;            ;

И тогда уравнение сокращается до:

Сделаем замену:

;      ;

;

И для удобства С=-(4+2B); 

В итоге:

;

Разбиваем пластину на n+4 точек и получаем следующую картину для одномерного случая:

-a i a
х,-1,0,1,2,0,n,n+1,n+2
0
i
-4
i-1
 


Где 2a – длина балки.

1/21/2Для выбранной i-той точки:

i+1i-1

Считая аналогично другие составляющие полученного ранее уравнения получаем шаблон для одномерного случая:

1 1,-4,6
i+1,i,i+2
i-2
 


Числа наверху – множители а снизу – индексы.

Таким образом, перемещая шаблон по точкам разбиения и составляя по нему уравнения получаем систему уравнений для поиска W.

Рассуждая аналогично можно получить шаблон для двумерного случая:

Расположение точек шаблона в двумерной системе координат:

j+2,j+1,j-1,j-2,i+1,i+2,i-1,i-2,x,y
 


Общий вид шаблона:

1,1,1,1,C



,C


,D


,C

,C


,B,B,B,B,X

,Y
 


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

Инструкция:

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

Кнопки << и >> служат для перехода на 1 шаг назад и вперед соответственно.

Кнопки <<<< и >>>> служат для перехода в начало и в конец соответственно.

Между кнопками показывается номер текущего узла.

Для смены узла можно пользоваться как кнопками вперед и назад, так и левым щелчком мыши на выбранном узле для перехода.

Разработка программы:

Во первых определимся с окном графики – оно квадратное с размерами 600x600 точек экрана.

Вся графика рисуется не в пространстве экрана а в «Узловом» пространстве, т.е. вместо x y фигурируют i j пространства узлов, которые соответствуют положению текущего узла. Это позволяет рисовать картину используя не 600 значений по х и у а всего по 9 значений а также сразу определить координаты текущего узла используя обратный переход от индексного пространства к пространству экрана.

Пример использования:

// Определяем координаты узла в индексном пространстве

int stp;  // номер текущего узла

k=0;  // прогоночный коэффициент

for (j=3; j<=6; j++)

for (i=3; i<=6; i++)

{

k++;

if (k==stp)

{

x=i;

y=j;

}

else break();

}

Здесь перебираются узлы сетки (их всего 9) и запоминаются индексные координаты нужного узла.

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

Пример:

im->Canvas->MoveTo(   x*100   /1.5 ,  ((y-2)*100)/1.5 );

поставит кисть в точку удаленную от текущего узла на 2 узла вверх.

Умножение на 100/1.5 соответствует переходу к пространству экрана.

По этому принципу реализуется вся графика данной программы.

600x
9i
600y
9j
 


0X 

Y
 


Названия визуальных компонентов лучше выводить на экран или в их заголовок и потом менять в одном месте программы. Это дает возможность программисту сразу видеть на форме названия соответствующих видимых компонентов (меньше задумываться о вводе/выводе). А также используя данную технику можно с легкостью перевести программу на разные языки…

Пример:

fm1->Caption="KR Шаблон"; // заголовок формы программы

bn1->Caption="<<"; // надпись на кнопке

bn2->Caption=">>"; // надпись на кнопке

lb->Caption="";  // надпись между кнопками (номер узла) изначально не нужна

re1->Lines->Clear();  // текст в TRichEdit *re1 изначально отсутствует

Эта часть кода выполняется сразу при загрузке формы программы и производит все исходные надписи на форме.

На форме содержится TRichEdit *re1 для вывода формул. Нижний регистр индексов ставится следующим нетривиальным образом:

1)  Определяем индексы символов с нижним регистром

2)  Ставим этим символам нижний регистр

Обычными билдеровскими методами определить нижний регистр (переместить символ вниз) невозможно. Для этого составим формат текста и применим его с помощью WinApi функции SendMessage(handle компонента с выделенным форматируемым текстом, EM_SETCHARFORMAT, SCF_SELECTION, Integer(Адрес нашего формата))

TCharFormat CF;      // Формат текста

CF.cbSize= sizeof(CF);  // размер формата (байт)

CF.yHeight=5; //высота текста

CF.dwMask= CFM_OFFSET; // стиль текста (нижний регистр)

CF.yOffset=-70; // смещение по У, направленному вверх

SendMessage(re1->Handle,EM_SETCHARFORMAT, SCF_SELECTION, Integer(&CF) ); //применяем созданный формат

Непосредственный пример из кода программы:

bool Nlow[50];       // индексы символов в re1, которые имеют нижний регистр (true)

// форматируем формулу

re1->SelAttributes->Size=12;  // выбираем размер обычного символа

// идем по всем символм поля re1

for (i=1;i<=re1->Text.Length();i++)

if (Nlow[i])

{

re1->SelStart  = i-1; // старт выделения текста

re1->SelLength = 1; // конец выделения текста (выделен 1 символ)

re1->SelAttributes->Size=12;

CF.cbSize= sizeof(CF);

CF.yHeight=5;

CF.dwMask= CFM_OFFSET;

CF.yOffset=-70;

SendMessage(re1->Handle,EM_SETCHARFORMAT, SCF_SELECTION, Integer(&CF) );

}

Аналогично ставится верхний регистр, только составляется формат следующим образом.

CF.cbSize= sizeof(CF);

CF.yHeight=5;

CF.dwMask= CFM_OFFSET;

CF.yOffset=200; // знак «+» говорит о том, что символ смещается вверх

На следующих 12 страницах приводится код программы

Похожие материалы

Информация о работе

Тип:
Расчетно-графические работы
Размер файла:
136 Kb
Скачали:
0