Дослідження перехідних процесів та частотних характеристик електричних кіл методами математичного моделювання, страница 2

    Button1: TButton; Image1: TImage; GroupBox1: TGroupBox; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Label3: TLabel; Edit2: TEdit; Label4: TLabel; Label5: TLabel; Edit3: TEdit; Label6: TLabel; Label7: TLabel; Edit4: TEdit; Label8: TLabel; Label9: TLabel; Edit5: TEdit; Label10: TLabel; Label11: TLabel; Edit6: TEdit; Label12: TLabel; Label13: TLabel; Edit7: TEdit; Label14: TLabel; Memo1: TMemo; Gauge1: TGauge; Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure FormResize(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  end;

var

  Form1: TForm1;

  E,U1,Un:array of double;

  Em,R1,Rn,L1,L2,C2:double;

  i,i1,i2,i3,Inagr:array of double;

  f,f1,f2,Fmax,dt,di1,dInagr,dUn:double;

  N:LongInt;

  t:array of Double;

  Dliti1:LongInt=0;

  DlitInagr:LongInt=0;

  DlitUn:LongInt=0;

implementation

uses Kpr_2;

procedure TForm1.Button1Click(Sender: TObject);

var j:LongInt;   

    St:TStringList;    

begin

 with GroupBox1 do

  begin

   Em:=StrToFloat(Edit1.Text);

   R1:=StrToFloat(Edit2.Text);

   Rn:=StrToFloat(Edit3.Text);

   L1:=StrToFloat(Edit4.Text);

   L2:=StrToFloat(Edit5.Text);

   C2:=0.000001*StrToFloat(Edit6.Text);

   f:=StrToFloat(Edit7.Text);

  end;

 St:=TStringList.Create;

 with St do

 begin

  Clear;

  Add('Определение передаточной функции');

  Add('K/(K*T1^2*p+K*T2*p+K*T3*p+1)');

  Add('K='+FloatToStr(Rn/(R1+Rn)));

  Add('T1='+FloatToStr(sqrt(L1*C2)));

  Add('T2='+FloatToStr(R1*C2));

  Add('T3='+FloatToStr(L1/Rn));

  Add('Расчет цепи по методу Эйлера');

  Add('Определение максимальной частоты цепи');

  f1:=1/(2*3.1415926*sqrt(L1*C2));

  f2:=1/(2*3.1415926*sqrt((L1+L2)*C2));

  Fmax:=Max(Max(f1,f2),f);

  Add('Максимальная частота 1-го контура (E-L1-C2)  '+

       FloatToStr(f1)+' Гц');

  Add('Максимальная частота 2-го контура (L1-L2-C2)  '+

       FloatToStr(f2)+' Гц');

  Add('Максимальная частота цепи  '+

       FloatToStr(Fmax)+' Гц');

  dt:=1/(100*Fmax);

  Add('Выбираем шаг интегрирования: '+FloatToStr(dt));

  N:=Round(10/(dt*f));

  Add('Вычисляем количество шагов интегрирования: '+IntToStr(N));

  Add('Вычисляем токи и напряжения при постоянном значении ЭДС...');

  Add('t= i1= i2= i3= Inagr= Un= ');

  SetLength(E,N); SetLength(U1,N); SetLength(Un,N);  SetLength(i,N); SetLength(i1,N); SetLength(i2,N); SetLength(i3,N); SetLength(Inagr,N); SetLength(t,N);

  Un[0]:=0; i[0]:=0; i1[0]:=0; i2[0]:=0; i3[0]:=0; Inagr[0]:=0; E[0]:=Em; t[0]:=0;

  for j:=1 to N-1 do

   begin

    i1[j]:=i1[j-1]+dt*(E[j-1]/L1-R1*i1[j-1]/L1-Un[j-1]/L1);

    i2[j]:=i2[j-1]+dt*E[j-1]/L2;

    Un[j]:=Un[j-1]+dt*i3[j-1]/C2;

    Inagr[j]:=Un[j]/Rn;

    i[j]:=i1[j]+i2[j];

    i3[j]:=i1[j]-Inagr[j];

    t[j]:=t[j-1]+dt;

    E[j]:=E[j-1];

    Add(FloatToStr(t[j])+' '+FloatToStr(i1[j])+' '+FloatToStr(i2[j-1])

        +' '+FloatToStr(i3[j-1])+' '+FloatToStr(Inagr[j-1])+' '+FloatToStr(Un[j-1]));

    Application.ProcessMessages;

    Gauge1.Progress:=j*100 div (N-1);

   end;

  for j:=N-1 downto 1 do if i1[j]-i1[j-1]=0 then begin di1:=t[j];Dliti1:=j;end;

  for j:=N-1 downto 1 do if Un[j]-Un[j-1]=0 then begin dUn:=t[j];DlitUn:=j;end;

  for j:=N-1 downto 1 do if Inagr[j]-Inagr[j-1]=0 then begin dInagr:=t[j];DlitInagr:=j;end;

  Add('Длительность переходного процесса по i1: '+FloatToStr(di1));

  Add('Длительность переходного процесса по Inagr: '+FloatToStr(dInagr));

  Add('Длительность переходного процесса по Un: '+FloatToStr(dUn));

 end;

 Memo1.Lines:=St;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

 Form2.ShowModal;

end;

end.

unit Kpr_2;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,