|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 5248 (0x1480)
Types: TextFile
Names: »HARMON.PAS«
└─⟦a1337913c⟧ Bits:30002679 PGM1 - indeholder forskellige undervisningsprogrammer
└─⟦this⟧ »HARMON.PAS«
program harmonisk_svingning;
(*$I gsx*)
type tekst =string(.40.);
var h,k,f,xscale,yscale,xmin,xmax,ymin,ymax,xny,yny,vny :real;
dt,tmax, xstart,vstart,a1,a2:real;
n, i :integer;
svar : char;
k1,m:real;
n1, xenhed,yenhed, amplitude,svingtid :real;
procedure forklaring;
begin
writeln(clrhom,' HARMONISK SVINGNING.');
WRITELN;
writeln(' Programmet foretager en løsning af bevægelsesligningen for en har');
writeln('monisk svingning : ');
writeln(' x''''= k/m*x-f*x'' ');
writeln;
writeln('Til at fastlægge ligningen skal masse,fjederkonstant og friktion');
writeln('indtastes.Ligeledes skal begyndelsespunktet angives med sted og ');
writeln('hastighed.');
writeln('Til bestemmelse af beregningen skal sluttidspunktet angives.');
writeln('Grafen tegnes som rette linier mellem de beregnede punkter.');
writeln('Tidsrummet mellem disse skal derfor også angives. Antallet af underindelinger');
writeln('skal ligeledes indtastes. Dette kan ofte være 1');
writeln;
writeln('For at kunne tegne koordinatsystemet skal enhederne opgives.');
writeln;
writeln(' Overalt vil programmet selv foreslå nogle værdier.');
writeln('Disse vælges ved tryk på <RETURN> ellers tastes den nye værdi.');
writeln('Til en vis grad vil programmet selv frasortere tåbelige værdier.');
writeln('Bemærk dog, at vælges antallet af underindelinger stort vil beregningerne');
writeln('tage lang tid.');
writeln;
write('tast <RETURN> når du er klar.');readln;
end;
function g(x,y,v:real):real;
begin
g:=-k*y-f*v;
end;
function fv(x,y,v:real):real;
begin
fv:=v;
end;
procedure takeastep;
var k1,l1,k2,l2,k3,l3,k4,l4,x,y,v,xgl,ygl,vgl :real;
begin
xgl:=xny; ygl:=yny; vgl:=vny;
k1:=fv(xgl,ygl,vgl); l1:=g(xgl,ygl,vgl);
x:=xgl+h/2; y:=ygl+h*k1/2; v:=vgl+h*l1/2;
k2:=fv(x,y,v); l2:=g(x,y,v);
y:=ygl+h*k2/2; v:=vgl+h*l2/2;
k3:=fv(x,y,v); l3:=g(x,y,v);
x:=xgl+h; y:=ygl+h*k3; v:=vgl+h*l3;
k4:=fv(x,y,v); l4:=g(x,y,v);
xny:=x;
yny:=ygl+h*(k1+2*k2+2*k3+k4)/6;
vny:=vgl+h*(l1+2*l2+2*l3+l4)/6;
end;
procedure draw(a1,a2,b1,b2 :real);
(* procedure der tegner en linie fra (a1,a2) til (b1,b2) *)
var a:array(.1..2.) of coor;
begin
if a1<xmin then a1:=xmin; if b1<xmin then b1:=xmin;
if a1>xmax then a1:=xmax;if b1>xmax then b1:=xmax;
if a2<ymin then a2:=ymin;if b2<ymin then b2:=ymin;
if a2>ymax then a2:=ymax;if b2>ymax then b2:=ymax;
a(.1.).x:=round((a1-xmin)*xscale);
a(.1.).y:=round((a2-ymin)*yscale);
a(.2.).x:=round((b1-xmin)*xscale);
a(.2.).y:=round((b2-ymin)*yscale);
polyline(2,a);
end;
procedure koordinatsystem(xcentrum,ycentrum,xenhed,yenhed :real);
var x,y : real;
begin
(*x-aksen tegnes *)
draw(xmin,0,xmax,0);
x:=xcentrum;
while x>=xmin+xenhed do x:=x-xenhed;
while x<=xmax do
begin
draw(x,0,x,(ymax-ymin)/60);
x:=x+xenhed;
end;
(*y-aksen tegnes *)
draw(0,ymin,0,ymax);
y:=ycentrum;
while y>=ymin+yenhed do y:=y-yenhed;
while y<=ymax do
begin
draw(0,y,xmax/80,y);
y:=y+yenhed;
end;
end;
procedure inputat(x,y:integer;s:tekst;var tal:real);
begin
gotoxy(x,y);write(s,' ---> ',tal:4:2,' nyt tal ---> ' );readln(tal);
end;
function dekade(x:real):real;
begin
dekade:=pwrten(trunc(ln(x)/ln(10)));
end;
begin (* HOVEDPROGRAM *)
forklaring;
k1:=18;m:=0.2;f:=0;xstart:=9;vstart:=0;
repeat
write(chr(27),chr(69));
inputat(5,2,'Indtast fjederkonstanten ',k1);
inputat(5,4,'Indtast massen ',m );
inputat(5,6,'Indtast friktionen ',f);
inputat(5,8,'Indtast startsted ',xstart);
inputat(5,10,'Indtast starthastighed ',vstart);
svingtid:=2*pi*sqrt(m/k1); k:=k1/m;
amplitude:=sqrt(sqr(xstart)+m*sqr(vstart)/k1);tmax:=round(10*svingtid+0.5);
ymax:=round(amplitude+0.5);ymin:=-ymax;xmax:=tmax;
xenhed:=dekade(xmax);yenhed:=dekade(ymax);
writeln(' Beregnet svingningstid :',svingtid:4:2,' sek');
writeln(' Beregnet maximalt udsving :',amplitude :4:2,' m');
inputat(5,14,'Indtast sluttidspunktet ',tmax);
if tmax<=0 then tmax:=svingtid;
dt:=tmax/150;xmin:=0;
inputat(5,16,'Indtast tidsrum mellem punkter ',dt);
n1:=1;n:=round(n1);
inputat(5,18,'Indtast antallet af underindelinger' ,n1);
if n1>1 then n:=round(n1);
inputat(5,20,'Indtast enhed på tidsaksen ',xenhed);
inputat(5,21,'Indtast enhed på x-aksen ',yenhed);
h:=dt/n;xmax:=tmax;
xscale:=maxint/(xmax-xmin); yscale:=maxint/(ymax-ymin);
xny:=0;yny:=xstart;vny:=vstart;
openws(1);
koordinatsystem(0,0,xenhed,yenhed) ;
while xny<tmax do
begin
a1:=xny;a2:=yny;
for i:=1 to n do takeastep;
if (xny>=xmin) and (xny<=xmax) and (yny>=ymin) and (yny<=ymax) then
draw(a1,a2,xny,yny);
end;
gtext(50,0,'<RETURN>'); readln;
closews;
write('Tast q for at slutte programmet ');read(kbd,svar);
until svar in (.'Q','q'.);
end. «eof»