unit LSimplediffuz; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Label3: TLabel; Edit3: TEdit; Label5: TLabel; Edit4: TEdit; Label6: TLabel; Edit5: TEdit; Label7: TLabel; Edit6: TEdit; Label8: TLabel; Edit7: TEdit; Label9: TLabel; Edit8: TEdit; Label10: TLabel; Button1: TButton; Label11: TLabel; Label12: TLabel; Label13: TLabel; procedure FormActivate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit3KeyPress(Sender: TObject; var Key: Char); procedure Edit4KeyPress(Sender: TObject; var Key: Char); procedure Edit5KeyPress(Sender: TObject; var Key: Char); procedure Edit6KeyPress(Sender: TObject; var Key: Char); procedure Edit7KeyPress(Sender: TObject; var Key: Char); procedure Edit8KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation procedure PSimpleDiffuz; var L: real; { Значение L - длина промежутка } b: real; { Значение b } D: real; { Значение коэффициента диффузии D } A0: real; { Значение начальной концентрации } N: integer; { Количество членов ряда} K: integer; { Номер члена ряда } x: real; { Координата x } t:real; { Время t } W: real; { Корни уравнения cos(W*L)=0 } a: real; { Коэффициенты разложения единицы в ряд по cos(wx) } V: real; { K-й член ряда в сумме n(x, t) } Q: real; { n(x, t) - концентрация } G: real; { K-й член ряда в сумме dn(x, t)/dx } U: real; { dn(x, t)/dx - производная от концентрации по координате x } { Данные для проверки правильности решения диф. уравнения } C1: real; { K-й член ряда в сумме dn(x, t)/dt } F1: real; { dn(x, t)/dt - производная от концентрации по времени t} C2: real; { K-й член ряда в сумме d2n(x, t)/dx2 } F2: real; { d2n(x, t)/dx2 - вторая производная от концентрации по x } begin U:=0; L:= StrToFloat(Form1.Edit1.Text); b:= StrToFloat(Form1.Edit3.Text); D:= StrToFloat(Form1.Edit4.Text); A0:=StrToFloat(Form1.Edit5.Text); x:= StrToFloat(Form1.Edit6.Text); t:= StrToFloat(Form1.Edit7.Text); N:= StrToInt(Form1.Edit8.Text); Q:= A0*exp(-b*t); U:= 0; F1:= -A0*b*exp(-b*t); F2:= 0; if x>L then begin x:=L; Form1.Edit6.Text:=FloatToStr(x); end; for K:=1 to N do begin W:= Pi*(2*K-1)/2/L; a:= sin(W*L)/(W*L/2+sin(2*W*L)/4); V:= A0*b*a/(D*W*W-b)*(exp(-b*t)-exp(-D*W*W*t))*cos(W*x); Q:= Q+V; G:= -A0*b*a*W/(D*W*W-b)*(exp(-b*t)-exp(-D*W*W*t))*sin(W*x); U:= U+G; C1:= A0*b*a/(D*W*W-b)*(-b*exp(-b*t)+D*W*W*exp(-D*W*W*t))*cos(W*x); F1:= F1+C1; C2:= -A0*b*a*W*W/(D*W*W-b)*(exp(-b*t)-exp(-D*W*W*t))*cos(W*x); F2:= F2+C2; end; Form1.Label10.Caption:=' Концентрация n(x, t) = '+FloatTostr(Q)+ #13+#13+'Градиент концентрации dn(x,t)/dx = '+ FloatTostr(U) ; Form1.Label11.Caption:='Проверка: '; if x=L then Form1.Label11.Caption:=Form1.Label11.Caption + #13 + 'на границе A0*exp(-b*t) = ' +FloatToStr(A0*exp(-b*t)) else Form1.Label11.Caption:=Form1.Label11.Caption + #13 + ' dn/dt = '+ FloatToStr(F1)+ #13+ ' D*d2n/dx2 = '+ FloatToStr(D*F2); end; {$R *.dfm} procedure TForm1.FormActivate(Sender: TObject); begin Label1.Caption:= 'Решение n(x,t) дифференциального уравнения dn/dt=D*d2n/dx2 ,'+#13+ 'удовлетворяющего граничным и начальным условиям:'+ #13+ 'n(x,0)=A0 ; dn/dx(0,t)=0 ; n(L,t)=A0*exp(-b*t)'; Edit8.Text:='100000'; Label2.Caption:= 'Схема вычислений: ' + 'W[K]= Pi*(2*K-1)/2/L ;'+#13+ 'a[K]:= sin(W[K]*L)/(L*W[K]/2+sin(2*W[K]*L)/4)*cos(W[K]*x) ;'+#13+ 'V[K]:=A0*b*a[K]/(D*W[K]*W[K]-b)*(exp(-b*t)-exp(-D*W[K]*W[K]*t))*cos(W[K]*x)' +#13+ 'n(x,t)=A0*exp(-b*t)+{сумма K=1 до N} V[K] - решение'+ ' (концентрация) ;'+#13+ 'dn/dx - градиент концентрации'; end; procedure TForm1.Button1Click(Sender: TObject); begin PSimpleDiffuz; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': begin Label10.Caption := ''; label11.caption:=''end; #13: Form1.Edit3.SetFocus; '.',',': begin Label10.Caption := ''; label11.caption:=''; if Key <> DecimalSeparator then Key:=DecimalSeparator;//заменим разделитель на допустимый if Pos(DecimalSeparator, Edit1.Text)<>0 then Key := Chr(0); //запрет на ввод второго разделителя end; else Key:=Chr(0);//остальные символы запрещены end; end; procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': begin Label10.Caption := ''; label11.caption:=''end; #13: Form1.Edit4.SetFocus; '.',',': begin Label10.Caption := ''; label11.caption:='' ; if Key <> DecimalSeparator then Key:=DecimalSeparator;//заменим разделитель на допустимый if Pos(DecimalSeparator, Edit3.Text)<>0 then Key := Chr(0); //запрет на ввод второго разделителя end; else Key:=Chr(0);//остальные символы запрещены end; end; procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': begin Label10.Caption := ''; label11.caption:=''end; #13: Form1.Edit6.SetFocus; '.',',': begin Label10.Caption := ''; label11.caption:='' ; if Key <> DecimalSeparator then Key:=DecimalSeparator;//заменим разделитель на допустимый if Pos(DecimalSeparator, Edit4.Text)<>0 then Key := Chr(0); //запрет на ввод второго разделителя end; else Key:=Chr(0);//остальные символы запрещены end; end; procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': begin Label10.Caption := ''; label11.caption:=''end; #13: Form1.Edit6.SetFocus; '.',',': begin Label10.Caption := ''; label11.caption:=''; if Key <> DecimalSeparator then Key:=DecimalSeparator;//заменим разделитель на допустимый if Pos(DecimalSeparator, Edit5.Text)<>0 then Key := Chr(0); //запрет на ввод второго разделителя end; else Key:=Chr(0);//остальные символы запрещены end; end; procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': begin Label10.Caption := ''; label11.caption:=''end; #13: Form1.Edit7.SetFocus; '.',',': begin Label10.Caption := ''; label11.caption:=''; if Key <> DecimalSeparator then Key:=DecimalSeparator;//заменим разделитель на допустимый if Pos(DecimalSeparator, Edit6.Text)<>0 then Key := Chr(0); //запрет на ввод второго разделителя end; else Key:=Chr(0);//остальные символы запрещены end; end; procedure TForm1.Edit7KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': begin Label10.Caption := ''; label11.caption:=''end; #13: PSimpleDiffuz; '.',',': begin Label10.Caption := ''; label11.caption:=''; if Key <> DecimalSeparator then Key:=DecimalSeparator;//заменим разделитель на допустимый if Pos(DecimalSeparator, Edit7.Text)<>0 then Key := Chr(0); //запрет на ввод второго разделителя end; else Key:=Chr(0);//остальные символы запрещены end; end; procedure TForm1.Edit8KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': begin Label10.Caption := ''; label11.caption:=''end; #13: PSimpleDiffuz; else Key:=Chr(0);//остальные символы запрещены end; end; end.