{$N+}
Uses Graph,Crt;
Type type_mayat=record {tip mayatnika}
      DlinaNiti:real;
      MassaNiti:real;
      MassaSharika:real;
      RadiusSharika:real;
      a_begin,a_new,a_old:real;
      J,w0:real;
     end;
Var
   p_menu:pointer;
  
Var T, curr_t: Integer;
   main_mayat:type_mayat; {Maytnik}
   dT,fT,g,b:real;{Shag po vremeni, Polnoe vremya, g, koef triniya}
   tmp_1:integer; {svobodnie peremennie}
   tmp_2,tmp_3,tmp_4,tmp_5:real;{svobodnie peremennie}
   Key:char;
   graphtmp2,graphtmp3:integer; {graficheskie peremenie}
Procedure GraphOn; {vklyuchenie graphiki}
Var
   Gd,Gm,ErrorCode:integer;
Begin
     Gd:=detect;
     initgraph(Gd,Gm,'d:\pascal\bgi');
     ErrorCode:=GraphResult;
     if ErrorCode <> grOk then
     begin
      WriteLn('oshibka:');
      WriteLn(GraphErrorMsg(ErrorCode));
      Halt(1);
     end;
End;
Procedure GraphOff;{Otklu4enie graphiki}
Begin
     CloseGraph;
End;
Procedure mayatnik(DlinaNiti_:integer;
  MassaNiti_,MassaSharika_,RadiusSharika_,a_begin_:real);
Begin
     with main_mayat do
     begin
      DlinaNiti:=DlinaNiti_;
      MassaNiti:=MassaNiti_;
      MassaSharika:=MassaSharika_;
      RadiusSharika:=RadiusSharika_;
      a_begin:=a_begin_;
      a_new:=a_begin_;
      J:=(1/3)*MassaNiti*sqr(DlinaNiti)+MassaSharika*(2/5*sqr(RadiusSharika)+sqr(DlinaNiti));
      w0:=sqrt(g*(MassaSharika*DlinaNiti+MassaNiti*DlinaNiti/2)/J);
          {vi4islenie sobstvennoi 4astoti}
     end;
End;
Procedure dvizh_mayat; {phizika mayatnika}
Var
   costmp:double;
Begin
     with main_mayat do
     begin
      a_old:=a_new;
      a_new:=a_begin*cos(w0*fT);{novii ugol mayatnika}
      if a_begin>0 then
      begin
            costmp:=cos(a_begin)+(b*DlinaNiti*sqr(a_new-a_old))/(dT*MassaSharika*g);
            {vi4islenie novogo cos ugla amplitudi}
            if (costmp<>0) then
              a_begin:=arctan(sqrt(1-sqr(costmp))/costmp);
              {vi4islenie novoi amplitudi}
      end
      else a_begin:=0;
      fT:=fT+dT;
     end;
End;
Procedure ris_mayat; {risovanie mayatnika}
Var
   xNow,yNow:real;
Begin
     with main_mayat do
     begin
      xNow:=graphtmp2+DlinaNiti*cos(a_new-pi/2);
      yNow:=21-DlinaNiti*sin(a_new-pi/2);
      setfillstyle(0,0);
      bar(graphtmp2-round(DlinaNiti+RadiusSharika),21,
  graphtmp2+round(DlinaNiti+RadiusSharika),21+round(DlinaNiti+RadiusSharika));
      setcolor(7);
      setlinestyle(0,0,3);
      line(graphtmp2,21,round(xNow),round(yNow));
      setlinestyle(0,0,1);
      setcolor(1);
      setfillstyle(1,1);
      fillellipse(round(xNow),round(yNow),
  round(RadiusSharika),round(RadiusSharika));
     end;
End;
Begin
     GraphOFF;
     writeln('vvedite dlinu niti (recom. 250)');
     readln(tmp_1);
     writeln('vvedite massu niti (recom. 20)');
     readln(tmp_2);
     writeln('vvedite massu sharika (recom. 30)');
     readln(tmp_3);
     writeln('vvedite radis sharika (recom. 15)');
     readln(tmp_4);
     writeln('vvedite ugol otklonenia (recom. 0.5)');
     readln(tmp_5);
     writeln('vvedite shag po vremeni (recom. 0.1)');
     readln(dT);
     GraphOn;
     b:=0.1;
     fT:=0;
     Key:=#0;
     g:=9.8;
     GraphOn;
     graphtmp2:=round(getmaxx/2);
     graphtmp3:=round(getmaxx/3);
     cleardevice;
     mayatnik(tmp_1,tmp_2,tmp_3,tmp_4,tmp_5);
setcolor(15);
      setfillstyle(3,15);
      bar(graphtmp3,0,2*graphtmp3,20);
      line(graphtmp3,20,2*graphtmp3,20);
    repeat
        if(main_mayat.a_begin<>0)then
        begin
          dvizh_mayat;
          ris_mayat;
          delay(500);
          inc(T); if T = 10 then begin
            T := 0; inc(curr_t);
            putpixel(curr_t,
              (getmaxy - 240) + trunc(180 * cos(main_mayat.a_new)),
              red );
          end;
        end;
         if keypressed then key:=readkey;
     until (key=#27);
    GraphOff;
End.
 Взял его на вашем же форуме. Возник вопрос, на который я не могу ответить, и очень надеюсь на вашу помощь. Почему вычисление собственной частоты маятника выглядит здесь таким образом?
J :=(1/3)*MassaNiti*sqr(DlinaNiti)+MassaSharika*(2/5*sqr(RadiusSharika)+sqr(DlinaNiti));
w0:=sqrt(g*(MassaSharika*DlinaNiti+MassaNiti*DlinaNiti/2)/J);
Поясните, пожалуйста, очень нужно.