unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
const mf=500;
type
vector=array[1..mf] of real;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Label4: TLabel;
Edit5: TEdit;
Label5: TLabel;
Edit6: TEdit;
Label6: TLabel;
Edit7: TEdit;
Label7: TLabel;
Edit8: TEdit;
Label8: TLabel;
Chart1: TChart;
Series1: TLineSeries;
Edit4: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function lamda(x:real):real;
{Функция вычисления коэффициента теплопроводности по формуле (31)}
begin
lamda:=5500/(560+x)+0.942*(1E-10)*x*sqr(x);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
{Раздел описания переменных, которые мы будем использовать в программе}
i,j,N:integer;
T,alfa,beta:vector;
ai,bi,ci,fi:real;
ro,ch,tau,h,kap:real;
Th,T0,Tc,L,t_end,time:real;
//f,g:text;
begin
N:=StrToInt(Edit1.Text);
t_end:=StrToFloat(Edit2.Text);
L:=StrToFloat(Edit3.Text);
ro:=StrToFloat(Edit4.Text);
kap:=StrToFloat(Edit5.Text);
T0:=StrToFloat(Edit6.Text);
Th:=StrToFloat(Edit7.Text);
Tc:=StrToFloat(Edit8.Text);
{определяем расчетный шаг сетки по пространственной координате}
h:=L/(N-1);
{определяем расчетный г=шаг сетки по времени}
tau:=t_end/100;
{определяем поле температуры в начальный момент времени}
for i:=1 to N do
T[i]:=T0;
{проводим интегрирование нестациораного уравнения теплопровдности}
for i:=1 to N do
T[i]:=T0;
time:=0;
Chart1.Series[0].Clear;
//Chart1.Series[1].Clear;
//Chart1.Series[2].Clear;
//Chart1.Series[3].Clear;
while time<t_end do {используем цикл с предусловием}
begin
{увеличиваем переменную времени шаг tau}
time:=time+tau;
{определяем начальные прогоночные коэффициенты на основе левого граничного условия}
alfa[1]:=0;
beta[1]:=Th;
{цикл с параметром для определения прогончных коэффициентов по формуле (8)}
for i:=2 to N-1 do
begin
{ai, bi, ci ,fi - коэффициенты канонического представления системы уравнений с трехдиагнальной матрицей}
ai:=0.5*(lamda(T[i])+lamda(T[i+1]))/sqr(h);
ci:=0.5*(lamda(T[i-1])+lamda(T[i]))/sqr(h);
bi:=ai+ci+ro*kap/tau;
fi:=-ro*kap*T[i]/tau;
{alfa[i], beta[i] - прогоночные коэффициенты}
alfa[i]:=ai/(bi-ci*alfa[i-1]);
beta[i]:=(ci*beta[i-1]-fi)/(bi-ci*alfa[i-1]);
end;
{определяем значение температуры на правой границе на основе правого граничного условия}
T[N]:=Tc;
{используя соотношения (7) определяем неизвестное поле температуры}
for i:=N-1 downto 1 do
T[i]:=alfa[i]*T[i+1]+beta[i];
Memo1.Lines.Clear;
for i:=1 to n do
begin
Chart1.Series[0].Add(T[i],'',clred);
Memo1.Lines.Add(FloatToStr(T[i]));
end;
end; {цикл с предусловием окончен}
{выводим результат в файл}
end;
end.