Компьютерное моделирование падения палочки

Физическое решение и компьютерная реализация задачи. Использование при заданных начальных условиях уравнения и системы реализации процесса движения палочки. Составление листинг-программы. Построение математической модели и визуального падения палочки.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.