Компьютерное моделирование падения палочки
Физическое решение и компьютерная реализация задачи. Использование при заданных начальных условиях уравнения и системы реализации процесса движения палочки. Составление листинг-программы. Построение математической модели и визуального падения палочки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 03.05.2019 |
Размер файла | 74,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ
М.В. ЛОМОНОСОВА
ФИЗИЧЕСКИЙ ФАКУЛЬТЕТ
КУРСОВАЯ РАБОТА
ПО ИНФОРМАТИКЕ
на тему:
"Компьютерное моделирование падения палочки"
Рудова Андрея Андреевича
1. Постановка задачи
Однородный тонкий стержень массой m и длинной 2l стоит вертикально на гладкой горизонтальной поверхности. Он начинает падать с начальной скоростью 0 м/с. Считая взаимодействие стержня с поверхностью абсолютно упругим, построить математическую модель и визуализировать падение палочки.
Физическое решение задачи.
Т.к. трение отсутствует, то уравнение для движения центра масс по оси ОХ выглядит следующим образом:
=> vx =const.
компьютерный палочка листинг программа
Т.к. в начальный момент времени v0x=0 => vx =0. Т.о. можно считать, что движение палочки выглядит так: палочка падает, вращаясь вокруг своего центра масс, который движется вертикально вниз (см. рис1.). Найдем координату центра масс, для этого рассмотрим палочку в вертикальном положении (см. рис1 а.). В этом случае можно записать:
( в общем случае ) (1)
Запишем закон сохранения моментов для центра масс:
,
где момент силы тяжести,(2)
а момент инерции.(3)
При ударе происходит изменение скоростей всех точек палочки на противоположные (это непосредственно следует из ЗСЭ и ЗСИ).
2. Компьютерная реализация задачи
Используя при заданных начальных условиях уравнения (2), (3) и систему (4), необходимо реализовать процесс движения палочки. Реализация процесса производится в обработке сообщения WM_TIMER главного окна. Параметр ц и ц` играют роль угла и угловой скорости палочки. В каждом новом сообщении WM_TIMER подчитываются новые значения ц и ц`.
В главном окне присутствуют следующие окна типа BUTTON: start, stop. Если пользователь нажимает на одну из этих кнопок, то в функцию главного окна приходит сообщение WM_COMMAND у которого HIWORD(wParam) = BN_CLICKED, а lParam несет информацию о названии окна, на которое нажал пользователь. Если (HWND) lParam = start, то вызывается функция SetTimer, которая периодически посылает сообщение WM_TIMER в функцию главного окна с периодом, задаваемым определенным параметром функции SetTimer. Если (HWND) lParam = stop, то вызывается функция KillTimer, останавливающая действие функции SetTimer.
При нажатии пользователем на options->property посылается сообщение в WM_COMMAND и при этом LOWORD(wParam) равен значению ID пункта меню OPTION_PROPERTY, то с помощью функции DialogBox вызывается функция диалога (LRESULT CALLBACK Properties(HWND, UINT, WPARAM, LPARAM);). Диалог изображен на рис.2. При запуске диалоговой функции в нее приходит сообщение WM_INITDIALOG, в обработке которого необходимо инициализировать все необходимое для данного диалога.
В данном случае необходимо заполнить все Edit Boxes текущими значениями определенных параметров. Это реализуется с помощью функций sprintf, которая записывает в некоторую строку с неким указателем значение нужного параметра, и SetDlgItemText, которая записывает в данный Edit Box строку с этим указателем. Для того чтобы заполнить Combo Boxes используется та же функция SendDlgItemMessage(hDlg, IDC_COMBO, CB_ADDSTRING, 0, (LPARAM) szNext[i])Здесь функция принимает параметры hDlg (handle диалогового окна, в которое посылается сообщение), CB_ADDSTRING (означает, что в Combo Box с IDC_COMBO необходимо добавить строку с указателем szNext[i]).
При каких-нибудь действиях пользователя в диалоговом окне вызывается соответствующие сообщения, обработка которых в диалоговой функции должна выполнять соответствующие действия. Если пользователь нажал на OK, то с помощью функции GetDlgItemText (hDlg,IDC_EDIT, «указатель»,10) в строку с указателем «указатель» записывается текст из Edit Box, а с помощью функции atof(«указатель») текст переводится в числовое значение соответствующего параметра. При выборе некоторого значения из Combo Box также посылаются сообщения, в обработке которых проверяется с помощью функции SendDlgItemMessage(hDlg, IDC_COMBO, CB_GETCURSEL, 0, 0) изменилось ли значение Combo Box.
3. Листинг
// ex2.cpp: Defines the entry point for the application.
#include "stdafx.h"
#include "resource.h"
#include "string.h"
#include "math.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst;// current instance
TCHAR szTitle[MAX_LOADSTRING];// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];// The title bar text
// Foward declarations of functions included in this code module:
HWND start, stop;
HWND hWnd;
UINT id;
ATOMMyRegisterClass(HINSTANCE hInstance);
BOOLInitInstance(HINSTANCE, int);
LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACKProperties(HWND, UINT, WPARAM, LPARAM);
double universal(int, double, int);
void draw(HDC, double, double, double, int, int, HPEN);
void c_of_m(HDC, double, double, double, int, int, HPEN);
double l=100;
double l11=0,l22=0;
double m=0.50;
double a=0.99;
int xS=10; int yS=250;
int xB=160; int yB=150;
int xH=160; int yH=250;
int xG=500; int yG=250;
doubley1B;
int i;
double pi=3.1415926535897932384626433832795;
double qqq;
int g=9.81;
double f=pi/2*a,tau=0,df=0;
int flag=0;
char *l1=new char(5);
char *a1=new char(5);
char *x1S=new char(5);
char *y1S=new char(5);
char szNext[5][10];
int Index=0;
unsigned long t=0;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_EX2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_EX2);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= (WNDPROC)WndProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInstance;
wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_EX2);
wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName= (LPCSTR)IDC_EX2;
wcex.lpszClassName= szWindowClass;
wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
start=CreateWindow("BUTTON","start",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,650,40,80,20,hWnd,NULL,hInstance,NULL);
stop=CreateWindow("BUTTON","stop",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,650,70,80,20,hWnd,NULL,hInstance,NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND- process the application menu
// WM_PAINT- Paint the main window
// WM_DESTROY- post a quit message and return
//
//
//double t=0;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
yB=yH-l;
yH=yS;
yG=yS;
xB=xS+1.5*l;
xH=xB;
l11=universal(Index,l,1);
l22=(l-l11);
for(i=0;i<3;i++) szNext[i][0]='\0';
strcat(szNext[0],"m/l");
strcat(szNext[1],"l^2");
strcat(szNext[2],"l^3");
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
if ((HIWORD (wParam) == BN_CLICKED) && ((HWND) lParam == start))
{
id=SetTimer(hWnd,1,1,NULL);
InvalidateRect(hWnd,NULL,TRUE);
}
else if ((HIWORD (wParam) == BN_CLICKED) && ((HWND) lParam == stop))
{
KillTimer(hWnd,id);
f=pi*a/2;
l11=universal(Index,l,1);
l22=(l-l11);
df=0;
}
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case ID_OPTIONS_PROPERTIES:
DialogBox(hInst, (LPCTSTR)IDD_DIALOG1, hWnd, (DLGPROC)Properties);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
srand( (unsigned)time( NULL ) );
HPEN pen2,pen;
pen2=CreatePen(PS_SOLID,1,RGB(0,0,0));
MoveToEx(hdc,xS,yS+1,NULL);
SelectObject(hdc,pen2);
LineTo(hdc,xS+3*l,yS+1);
for(i=0;i<3*l/10;i++)
{
MoveToEx(hdc,xS+i*10,yS+1,NULL);
LineTo(hdc,xS+(i-1)*10,yS+11);
}
MoveToEx(hdc,xG,yG,NULL);
LineTo(hdc,xG,yG-200);
MoveToEx(hdc,xG,yG,NULL);
LineTo(hdc,xG+200,yG);
DeleteObject(pen2);
DeleteObject(pen);
EndPaint(hWnd, &ps);
break;
case WM_TIMER:
hdc=GetDC(hWnd);
HPEN pen1,pen3;
pen1=CreatePen(PS_SOLID,1,RGB(0,0,128));
pen3=CreatePen(PS_SOLID,1,RGB(255,255,255));
pen=CreatePen(PS_SOLID,1,RGB(128,128,128));
SetPixel(hdc,xB-(l22*cos(f)),((yH-l*sin(f))),RGB(250,150,0));
SelectObject(hdc,pen);
for(i=0;i<10;i++)
{
MoveToEx(hdc,xH,(yH-(2*i+1)*10),NULL);
LineTo(hdc,xH,yH-i*2*10);
}
draw(hdc,f,l11,l22,xH, xB,pen3);
c_of_m(hdc,f,l11,l22,xH, xB,pen3);
if (flag==0)
{
df=df-cos(f+df*0.005)*g*universal(Index,l,2)*0.005;
f=f+df*0.005;
if (f<0) {flag=1; f=-f;}
}
if (flag==1)
{
df=df+cos(f-df*0.005)*g*universal(Index,l,2)*0.005;
f=f-df*0.005;
if (f>a*pi/2) {flag=0;df=0; f=a*pi/2;}
}
draw(hdc,f,l11,l22,xH, xB,pen1);
c_of_m(hdc,f,l11,l22,xH, xB,pen1);
SetPixel(hdc,(xG+f*50),(yG-l*cos(f)*sqrt(4*g*(1-sin(f))/(l*(1/3+cos(f)*cos(f))))),RGB(250,150,0));
DeleteObject(pen1);
ReleaseDC(hWnd,hdc);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
LRESULT CALLBACK Properties(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
sprintf(l1,"%.2lf",l);
sprintf(a1,"%.2lf",a);
SetDlgItemText(hDlg,IDC_EDIT1,a1);
SetDlgItemText(hDlg,IDC_EDIT2,l1);
sprintf(x1S,"%.2d",xS);
sprintf(y1S,"%.2d",yS);
SetDlgItemText(hDlg,IDC_EDIT3,x1S);
SetDlgItemText(hDlg,IDC_EDIT4,y1S);
for(i=0;i<3;i++)
{
SendDlgItemMessage(hDlg,IDC_COMBO1, CB_ADDSTRING,0,(LPARAM) szNext[i]);
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
GetDlgItemText(hDlg,IDC_EDIT1,a1,5);
GetDlgItemText(hDlg,IDC_EDIT2,l1,5);
l=atof(l1);
a=atof(a1);
GetDlgItemText(hDlg,IDC_EDIT3,x1S,5);
GetDlgItemText(hDlg,IDC_EDIT4,y1S,5);
xS=atof(x1S);
yS=atof(y1S);
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
break;
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
break;
case IDC_COMBO1:
Index= SendDlgItemMessage(hDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
break;
}
}
return FALSE;
}
void draw(HDC hdc, double f, double l11, double l22, int xH, int xB, HPEN pen)
{
SelectObject(hdc,pen);
MoveToEx(hdc,xH+l11*cos(f),yH,NULL);
LineTo(hdc,(xB-l22*cos(f)),(yB+l*(1-sin(f))));
}
void c_of_m(HDC hdc, double f, double l11, double l22, int xH, int xB, HPEN pen)
{
SelectObject(hdc,pen);
Ellipse(hdc,xB-3,((yH-l11*sin(f))-3),xB+3,((yH-l11*sin(f))+3));
}
double universal(int Index, double l, int Number)
{
double lm;
int N=100,n=0;
double dl=0,ll=0;
double MM_J=0, c=0;
double mm;
double MM;
double ll1;
double J;
lm=l/100;
dl=lm/N;
switch(Index)
{
case 2:
//mm=m;
//MM=mm*lm/2;
//J=mm*(lm*lm)/3;
//ll1=MM/mm;
//MM_J=MM/J;
mm=0;
MM=0;
J=0;
while (n<N)
{
ll=dl/2+n*dl;
mm=mm+dl;
n++;
}
c=m/mm;
n=0;
ll=0;
while (n<N)
{
ll=dl/2+n*dl;
MM=MM+ll*c*dl;
J=J+ll*ll*c*dl;
n++;
}
ll1=MM/m;
MM_J=MM/J;
break;
case 0:
mm=0;
MM=0;
J=0;
while (n<N)
{
ll=dl/2+n*dl;
mm=mm+(ll*ll)*dl;
n++;
}
c=m/mm;
n=0;
ll=0;
while (n<N)
{
ll=dl/2+n*dl;
MM=MM+(ll*ll)*ll*c*dl;
J=J+(ll*ll)*ll*ll*c*dl;
n++;
}
ll1=MM/m;
MM_J=MM/J;
break;
case 1:
mm=0;
MM=0;
J=0;
while (n<N)
{
ll=dl/2+n*dl;
mm=mm+(ll*ll*ll*ll*ll)*dl;
n++;
}
c=m/mm;
n=0;
ll=0;
while (n<N)
{
ll=dl/2+n*dl;
MM=MM+(ll*ll*ll*ll*ll)*ll*c*dl;
J=J+(ll*ll*ll*ll*ll)*ll*ll*c*dl;
n++;
}
ll1=MM/m;
MM_J=MM/J;
break;
break;
}
switch(Number)
{
case 1:
return (ll1*100);
break;
case 2:
return MM_J;
break;
}
}
Размещено на Allbest.ru
Подобные документы
Оптимизационные модели на производстве. Компьютерное моделирование и программные средства. Трехмерное моделирование в T-Flex. Инженерный анализ в ANSYS. Интерфейс табличного процессора MS Excel. Построение математической модели задачи, ее реализация.
курсовая работа [5,2 M], добавлен 13.04.2014Физическая и математическая модели уравнения движения материальной точки. Блок-схема алгоритма основной программы для решения задачи Коши и получения результатов с фиксированным количеством отрезков разбиения. Разработка программы для ЭВМ, ее листинг.
курсовая работа [212,3 K], добавлен 24.11.2014Создание математической модели бистабильной системы "нагреватель-охлаждающая жидкость". Решение задачи Коши для дифференциального уравнения второго порядка. Обзор особенностей компьютерного построения модели динамической системы развития двух популяций.
контрольная работа [1,1 M], добавлен 20.10.2014Разработка программы на языке С++ для решения дифференциального уравнения Лапласа в прямоугольной области методом сеток. Численное решение задачи Дирихле для уравнения Лапласа, построение сетки и итерационного процесса. Листинг и результат программы.
курсовая работа [307,5 K], добавлен 30.04.2012Решение в среде Microsoft Excel с помощью программной модели "Поиск решения" транспортной задачи, системы нелинейных уравнений, задачи о назначениях. Составление уравнения регрессии по заданным значениям. Математические и алгоритмические модели.
лабораторная работа [866,6 K], добавлен 23.07.2012Компьютерное моделирование - вид технологии. Анализ электрических процессов в цепях второго порядка с внешним воздействием с применением системы компьютерного моделирования. Численные методы аппроксимации и интерполяции и их реализация в Mathcad и Matlab.
курсовая работа [1,1 M], добавлен 21.12.2013Построение математической модели, описывающей движение тела. Составление алгоритма расчёта и визуализации временных диаграмм скорости, пути и движущей силы. Листинг программы, реализующей представленный алгоритм расчёта и построение графиков V, S и F.
контрольная работа [102,4 K], добавлен 05.11.2012Структура математической модели линейной задачи, алгоритм симплекс-метода. Разработка программы: выбор языка программирования, входные и выходные данные, пользовательский интерфейс. Описание программы по листингу, тестирование, инструкция по применению.
курсовая работа [1,2 M], добавлен 31.05.2013Понятие и условие устойчивости бистабильной системы. Исследование модели "нагреватель - охлаждающая жидкость", построение фазового портрета стационарных состояний нагревателя. Компьютерное моделирование данной системы в пакете model vision studium.
курсовая работа [1,1 M], добавлен 07.06.2013Особенности постановки задачи по вычислению значения алгебраического выражения, описание математической модели. Определение промежутков, на которых функция не определена, построение графика. Результат выполнения программы, ее листинг и схема алгоритма.
контрольная работа [115,9 K], добавлен 14.04.2012