Маятник. Исходник на DELPHI. (Исходники)

Спробуємо змоделювати рух фізичного маятника, тобто будемо вирішувати чисельними методами рівняння руху.
Що маємо:
– Вантаж масою 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.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*