Маятник. Исходник на Delphi

Думкин

exp(-at)*sin(b0+bt)

----------------------------------------
jeer А мы пойдем другим путем:))

Попробуем смоделировать движение физического маятника, т.е. будем решать
численными методами уравнения движения.
Что имеем:
- груз массой m в условиях действия гравитационного поля подвешен на нерастяжимом безинерционном стержне длиной l и отклонен от нормали на угол a0;
- во время движения под действием силы тяжести на груз действуют тормозящие силы:
- аэродинамическая fa = cx * vt^2;
- кулоновская сила трения в оси качения fk
- в момент времени t=0 груз приобретает свободу движения, ограниченную силой реакции стержня.

На груз действуют:
- тангенциальная составляющая сила тяжести ft = p * sin(a);
- аэродинамическая сила fa = cx * vt^2;
- кулоновская сила трения fk;
Итого:
fs = ft - sgn(vt) * fa - sgn(vt) * fk

sgn = 1 при vt > 0
sgn = -1 при vt < 0
sgn = 0 при vt = 0

В начальный момент времени:
vt = 0
a = a0
x = l * sin(a)
y = l*cos(a)


Начало моделирования с шагом по времени dt.
//*****************************
Груз приобретает ускорение at = fs / m
Скорость vt = vt + at * dt
Элементарный путь ds = vt * dt
Элементарный угол da = ds / l
Полный угол a = a + da
Координаты
x = x + l * sin(a)
y = y + l * cos(a)
//*****************************

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

dt = дискретность по времени, можно константой
fs - суммарная сила, действующая на груз

--------------------------------------------------------------------------------
slymro


unit unit1;  
  
interface  
  
uses  
windows, sysutils, classes, graphics, forms,  
stdctrls, extctrls, actnlist, controls, menus, appevnts;  
  
type  
tform1 = class(tform)  
groupbox1: tgroupbox;  
label1: tlabel;  
u_edit: tedit;  
label2: tlabel;  
l_edit: tedit;  
label3: tlabel;  
g_edit: tedit;  
image: timage;  
button1: tbutton;  
button2: tbutton;  
label4: tlabel;  
t_edit: tedit;  
image1: timage;  
timer1: ttimer;  
actionlist1: tactionlist;  
startacnt: taction;  
stopacnt: taction;  
log: tmemo;  
procedure startacntexecute(sender: tobject);  
procedure startacntupdate(sender: tobject);  
procedure stopacntexecute(sender: tobject);  
procedure stopacntupdate(sender: tobject);  
procedure timer1timer(sender: tobject);  
private  
u,l,g,t,a:extended;  
dt0:dword;  
public  
{ public declarations }  
end;  
  
var  
form1: tform1;  
  
implementation  
uses sysconst;  
{$r *.dfm}  
  
procedure tform1.startacntexecute(sender: tobject);  
begin  
u:=strtofloat(u_edit.text);  
l:=strtofloat(l_edit.text);  
g:=strtofloat(g_edit.text);  
a:=l*sin(u*pi/180);  
t:=2*pi*sqrt(l/g);  
dt0:=gettickcount;  
t_edit.text:=format('%f',[t]);  
doublebuffered:=true;  
timer1.enabled:=true;  
end;  
  
procedure tform1.startacntupdate(sender: tobject);  
begin  
taction(sender).enabled:=not timer1.enabled;  
end;  
  
procedure tform1.stopacntexecute(sender: tobject);  
begin  
timer1.enabled:=false;  
end;  
  
procedure tform1.stopacntupdate(sender: tobject);  
begin  
taction(sender).enabled:=timer1.enabled;  
end;  
  
procedure tform1.timer1timer(sender: tobject);  
const pr:integer=7;  
var  
dt,x,y,k:extended;  
px,py,cx,cy:integer;  
begin  
if not timer1.enabled then exit;  
//Математика маятника  
dt:=(gettickcount-dt0)/1000;  
x:=a*cos(dt/t*2*pi);  
y:=sqrt(l*l-x*x);  
  
log.lines[0]:='x/y: '+format('%f',[x])+'/'+format('%f',[y]);  
  
//Перевод в координаты отрисовки  
k:=trunc(image.height*0.9);  
cx:=image.width div 2;  
cy:=20;  
px:=trunc(x*k/l)+cx;  
py:=trunc(y*k/l)+cy;  
  
//Отрисовка  
with image.canvas do  
begin  
brush.color:=rgb(0,0,0);  
pen.color:=rgb(255,255,255);  
fillrect(cliprect);  
moveto(cx,cy);  
lineto(px,py);  
brush.color:=pen.color;  
ellipse(px-pr,py-pr,px+pr,py+pr);  
end;  
end;  
  
end.  
Теги:
Клавиатурный шпион
Добавлено: 26 Июля 2018 20:47:42 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...