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,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.