Моделирование колебаний горизонтального маятника на двух пружинах

Автор работы: Пользователь скрыл имя, 14 Марта 2015 в 21:52, курсовая работа

Краткое описание

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

Вложенные файлы: 1 файл

курсовик граф системы (1).doc

— 606.50 Кб (Скачать файл)

  

   if abs(MyHSP.V(T)*100)>ChartRes.LeftAxis.Maximum then

   begin

      ChartRes.LeftAxis.Maximum:=abs(MyHSP.V(T)*100*1.05);

      ChartRes.LeftAxis.Minimum:=-abs(MyHSP.V(T)*100*1.05);

   end;

ChartRes.Series[0].AddXY(T,MyHSP.X(T)*100);

   ChartRes.Series[1].AddXY(T,MyHSP.V(T)*100);

   chartEnergy.Series[0].Clear;

   chartEnergy.Series[1].Clear;

   chartEnergy.Series[0].AddY(MyHSP.EnergyKinetik(T));

   chartEnergy.Series[1].AddY(MyHSP.EnergyPotential(T));;

end;

procedure TMainForm.bStartPauseClick(Sender: TObject);

begin

   Tmr.Enabled := not Tmr.Enabled;       

   if Tmr.Enabled then

      bStartPause.Caption := 'Пауза'

   else

      bStartPause.Caption := 'Старт'

end;

 

procedure TMainForm.bResetClick(Sender: TObject);

var

   flag:boolean;

begin

   flag := Tmr.Enabled;          

   Tmr.Enabled := false;         

   eMassa.Text := FloatToStr(MyHSP.M);

   eL.Text := IntToStr(MyHSP.Length);

   eK1.Text := FloatToStr(MyHSP.Kleft);

   eK2.Text := FloatToStr(MyHSP.Kright);

   eX0.Text:= IntToStr(Round(MyHSP.X0*100));

   eAlfa.Text := FloatToStr(MyHSP.Alfa);

 

   upd1.Position := MyHSP.TurnsCnt_1;

   upd2.Position := MyHSP.TurnsCnt_2;

 

   MyHSP.Print(img, 0);

   T := 0;                     

   ChartRes.Series[0].Clear;

   ChartRes.Series[1].Clear;

 

   ChartRes.LeftAxis.Minimum:= -MyHSP.Length;

   ChartRes.LeftAxis.Maximum:= MyHSP.Length;

   ChartRes.BottomAxis.Minimum := 0;

   ChartRes.BottomAxis.Maximum := 10;

 

   chartEnergy.LeftAxis.Minimum := 0;

   chartEnergy.LeftAxis.Maximum:= MyHSP.EnergyPotential(0);

 

 

   bStartPause.Enabled := true;        

   Tmr.Enabled := flag;            

end;

 

procedure TMainForm.bIniValueClick(Sender: TObject);

var

   res:boolean;

begin

   Tmr.Enabled:=false;                 

   bStartPause.Enabled:=false;        

   bStartPause.Caption:='Старт';       

   T:=0;                               

   Series1.Clear;

   Series2.Clear;

   Series3.Clear;

   Series4.Clear;

   if InitValue then    

   begin

      bReset.Enabled:=true;                      

      bStartPause.Enabled:=true;                 

      MyHSP.Print(img,0);      end;

end;

 

end.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

unit HSP;

 

interface

uses Graphics, ExtCtrls, Math, SysUtils;

type

   THSP = class

      private

         LArea:integer;

         SH:real;                   

         Hw, Ww:real;                

         Hf,Wf:real;                       

         Wcargo:real;                

         Cnt1, Cnt2:byte;            

         _CargoColor,

        _SpringColor, _WallFoundationColor:TColor;   

         _k1, _k2:real;               

  

 

 

     massa:real;                     

 

       _X0:real

         _alfa:real;                 

 

      public

         property Length: integer read LArea write LArea;

         property TurnsCnt_1: byte read Cnt1 write Cnt1;

         property TurnsCnt_2: byte read Cnt2 write Cnt2;

         property CargoColor: TColor read _CargoColor write _CargoColor;

         property SpringColor: TColor read _SpringColor write _SpringColor;

         property WallFoundationColor: TColor read _WallFoundationColor write _WallFoundationColor;

         property SpringHeight: real read SH write SH;

         property WallHeight: real read Hw write Hw;

         property WallWidth: real read Ww write Ww;

         property FoundationHeight: real read Hf write Hf;

         property FoundationWidth: real read Wf write Wf;

         property CargoWidth: real read WCargo write WCargo;

         property X0: real read _X0 write _X0;

         property Kleft: real read _k1 write _k1;

         property Kright: real read _k2 write _k2;

         property M: real read massa write massa;

         property Alfa: real read _alfa write _alfa;

 

 

 

         constructor Create;                             

         procedure Print(var img:TImage;  t:real);      

         function X(t:real):real;                        

         function V(t:real):real;                        

         function EnergyKinetik(t:real):real;                       

         function EnergyPotential(t:real):real;                       

   end;

 

 

implementation

constructor THSP.Create;

begin

   Ww := 0.05;

   Wf := 1;

   Hw := 0.6;

   Hf := 0.2;

   WCargo := 0.1;

   _WallFoundationColor := clBlue;

   _SpringColor:=clBlack;

   _CargoColor:=clGreen;

 

   sh := 0.1;

 

   Cnt1:=7;

   Cnt2:=9

 

end;

 

procedure THSP.Print(var img:TImage; t:real);

var

   pX, pY, W_cargo, H_cargo, X0, Y0 :integer;

   L, i, L_spring, Cnt:integer;

   sh_curr:integer;

   dx:real;

begin

   if LArea<>0 then

      dx:=X(t)*100/LArea

   else

      dx:=0;

 

   img.Picture := nil;                           

 

  

   img.Canvas.Brush.Color:= _WallFoundationColor;

   img.Canvas.Pen.Color:= _WallFoundationColor;

   img.Canvas.Pen.Width := 1;

 

   img.Canvas.Rectangle(0, Round( img.Height*(1-Hw) ) , Round(img.Width*Ww), img.Height);

   img.Canvas.Rectangle(img.Width, Round( img.Height*(1-Hw) ) , Round(img.Width*(1-Ww) ), img.Height);

   img.Canvas.Rectangle(0, Round( img.Height*(1-Hf) ) , img.Width, img.Height);

 

 

   pY := Round (img.Height * (1-(Hf+Hw)/2) );

 

   sh_curr := Round( min(sh, (Hw - Hf)/2 ) * img.Height );

  

   W_cargo:= Round( min(0.5, Wcargo)*img.Width );

   H_cargo := Round( img.Height * (Hw - Hf) );

  

   L:= max(5, Round(img.Width*0.01));

   Y0 := pY;

   X0 := img.Width div 2 + Round( dx * ( img.Width - 2*(img.Width * Ww + L) )/2  );

 

  

   img.Canvas.Brush.Color := _CargoColor;

   img.Canvas.Pen.Color := _CargoColor;

   img.Canvas.Pen.Width := 3;

 

   img.Canvas.Rectangle(X0 - W_cargo div 2, Y0 - H_cargo div 2, X0 + W_cargo div 2, Y0 + H_cargo div 2);

 

  

   img.Canvas.Brush.Color := _SpringColor;

   img.Canvas.Pen.Color := _SpringColor;

 

  

   pX := Round(img.Width * Ww);

   img.Canvas.MoveTo(pX,Y0);

   img.Canvas.LineTo(pX+L,Y0);

 

   pX := Round(img.Width * (1 - Ww) );

   img.Canvas.MoveTo(pX,Y0);

   img.Canvas.LineTo(pX-L,Y0);

 

 

   pX := X0 - W_cargo div 2;

   img.Canvas.MoveTo(pX,Y0);

   img.Canvas.LineTo(pX-L,Y0);

 

   pX := X0 + W_cargo div 2;

   img.Canvas.MoveTo(pX,Y0);

   img.Canvas.LineTo(pX+L,Y0);

 

   pX := Round(img.Width * Ww) + L;

   L_Spring := X0 - W_cargo div 2 - L - pX + 1;

 

     img.Canvas.MoveTo(pX,Y0);

   for i:=1 to Cnt1 do

      if i mod 2 = 0 then

         img.Canvas.LineTo(Round(pX + i/(Cnt1+1)*L_Spring), Y0 -sh_curr )

      else

         img.Canvas.LineTo(Round(pX + i/(Cnt1+1)*L_Spring), Y0 +sh_curr );

   img.Canvas.LineTo(X0 - W_cargo div 2 - L + 1,Y0);

 

 

   pX := Round(img.Width * (1 - Ww) ) - L;

   L_Spring := pX - (X0 + W_cargo div 2 + L)  + 1;

   img.Canvas.MoveTo(pX,Y0);

   for i:=1 to Cnt2 do

      if i mod 2 = 1 then

         img.Canvas.LineTo(Round(pX - i/(Cnt2+1)*L_Spring), Y0 -sh_curr )

      else

         img.Canvas.LineTo(Round(pX - i/(Cnt2+1)*L_Spring), Y0 +sh_curr );

   img.Canvas.LineTo(X0 + W_cargo div 2 + L - 1,Y0);

 

  

   if L>0 then

   begin

      img.Canvas.Brush.Color := clWhite;

      img.Canvas.Pen.Color := clBlack;

      img.Canvas.Pen.Width := 3;

      X0:=img.Width div 2;

     pX := Round(img.Width * Ww) + L;

      pY:=30;

      img.Canvas.MoveTo(pX,pY);

      img.Canvas.LineTo(img.Width-pX,pY);

      Cnt := LArea div 2;                 

 

     

      for i:=1 to Cnt do

      begin

         img.Canvas.Pen.Width := 3;

        img.Canvas.MoveTo(Round( X0+(X0-pX)*2*i/LArea ), pY-3 );

         img.Canvas.LineTo(Round( X0+(X0-pX)*2*i/LArea ), pY+3 );

         img.Canvas.MoveTo(Round( X0-(X0-pX)*2*i/LArea ), pY-3 );

         img.Canvas.LineTo(Round( X0-(X0-pX)*2*i/LArea ), pY+3 );

         img.Canvas.Pen.Width := 1;

         img.Canvas.TextOut(Round( X0+(X0-pX)*2*i/LArea)-5 , pY+6-30*(i mod 2), IntToStr(i*2));

         img.Canvas.TextOut(Round( X0-(X0-pX)*2*i/LArea)-10 , pY+6-30*(i mod 2), IntToStr(-i*2));

      end;

     

      img.Canvas.Pen.Width := 3;

      img.Canvas.MoveTo(X0, pY-3 );

      img.Canvas.LineTo(X0, pY+3 );

      img.Canvas.MoveTo(pX,pY-3);

      img.Canvas.LineTo(pX,pY+3);

      img.Canvas.MoveTo(img.Width-pX,pY-3);

      img.Canvas.LineTo(img.Width-pX,pY+3);

      img.Canvas.TextOut( X0-5 , pY+6, '0');

     

      if LArea mod 2 =1 then

      begin

         img.Canvas.TextOut(Round( X0+(X0-pX))-5 , pY+6-30*((Cnt+1) mod 2), IntToStr(LArea));

         img.Canvas.TextOut(Round( X0-(X0-pX))-10 , pY+6-30*((Cnt+1) mod 2), IntToStr(-LArea));

      end;

   end;

 

end;

 

function THSP.X(t:real):real;

var

   w0, gamma, wf, fi, b1, b2, A, B:real;

   c:integer;

 

begin

   w0:=sqrt((_k1+_k2)/massa);

   gamma := _alfa / (2 * massa);

   if X0<>0 then

      fi := X0/abs(X0)*Pi/2

  else

      fi := 0;

   if gamma<w0 then c:=1;            

   if gamma=w0 then c:=2;            

   if gamma>w0 then c:=3;              

   case c of

      1: begin

            wf := sqrt(w0*w0-gamma*gamma);

            Result := abs(X0)*exp(-gamma*t)*sin(wf*t+fi);

         end;

      2: begin

            A := x0;

            B := gamma*x0;

            Result := (A+B*t)*exp(-gamma*t);

         end;

      3: begin

            b1:=gamma - sqrt(gamma*gamma - w0*w0);

            b2:=gamma + sqrt(gamma*gamma - w0*w0);

            A := b2*x0/(b2-b1);

            B := x0-b2*x0/(b2-b1);

            Result := A*exp(-b1*t)+B*exp(-b2*t);

         end;

   end;

 

end;

 

 

function THSP.V(t:real):real;

var

   w0, gamma, wf, fi, b1, b2, A, B:real;

   c:integer;

 

begin

   w0:=sqrt((_k1+_k2)/massa);

   gamma := _alfa / (2 * massa);

   if X0<>0 then

      fi := X0/abs(X0)*Pi/2

   else

      fi := 0;

   if gamma<w0 then c:=1;        

   if gamma=w0 then c:=2;      

   if gamma>w0 then c:=3;      

   case c of

      1: begin

            wf := sqrt(w0*w0-gamma*gamma);

            Result := -gamma*abs(X0)*exp(-gamma*t)*sin(wf*t+fi)

                       + abs(X0)*exp(-gamma*t)*wf*cos(wf*t+fi);

         end;

      2: begin

            A := x0;

            B := gamma*x0;

            Result := B*exp(-gamma*t) - gamma*(A+B*t)*exp(-gamma*t);

         end;

      3: begin

            b1:=gamma - sqrt(gamma*gamma - w0*w0);

            b2:=gamma + sqrt(gamma*gamma - w0*w0);

            A := b2*x0/(b2-b1);

            B := x0-b2*x0/(b2-b1);

            Result := -b1*A*exp(-b1*t)-b2*B*exp(-b2*t);

         end;

   end;

 

end;

 

function THSP.EnergyKinetik(t:real):real;

begin

   Result := 1/2*Massa*V(t)*V(t);

end;

 

function THSP.EnergyPotential(t:real):real;

begin

   Result := (_k1+_k2)/2*X(t)*X(t);end;end.

 


 


 


 



Информация о работе Моделирование колебаний горизонтального маятника на двух пружинах