Автор: Пользователь скрыл имя, 10 Марта 2013 в 21:45, дипломная работа
В данной работе рассматривается задача с подвижной границей, описывающая поведение испаряющегося слоя двухкомпонентной жидкости. При решении задачи необходимо находить функции концентрации и температуры, связанные нелинейной зависимостью на границе. При этом следует определить положение границы слоя, изменение которого происходит с течением времени в результате испарения растворителя из раствора под действием постоянного теплового потока.
ВВЕДЕНИЕ………………………………………………………………………3
1. ПОСТАНОВКА ЗАДАЧИ…………………………………………………5
1.1. Описание физического процесса ……...……………………………….5
1.2. Математическая постановка……………………………………………6
1.3. Приведение задачи к безразмерному виду……………………………..9
2. РАЗРАБОТКА АЛГОРИТМА ЧИСЛЕННОГО РЕШЕНИЯ…………..12
2.1. Построение системы решения уравнений. Метод сеток……………12
2.1.1. Разностные соотношения для уравнения теплопроводности...13
2.1.2. Разностные соотношения для уравнения диффузии…………..15
2.1.3. Метод прогонки………………………...………………………..16
2.1.4. Аппроксимация уравнения движения границы………………..18
2.1.5. Метод Эйлера…………………………………………………….18
2.2. Алгоритм решения задачи…………………………………………….21
3. Программная реализация предложенного решения задачи……….23
3.1. Разработка программы………………………………………………23
3.2. Тестирование программы…………………………………………...25
3.3. Численный анализ задачи……………………………………………27
Заключение……………………………………………………………………..34
Список используемых источников…..………………………………………35
Приложение……………………………………………………………………..36
F[nx-1]:=Tm[nx-1,j-1]-kc*Tm[
vc[nx-1]:=0;
end;
end;
for i:=2 to nx-1 do //прямой ход преобразований к единичной
begin
vb[i]:=vb[i]-ka*vc[i-1];
F[i]:=F[i]-ka*F[i-1];
va[i]:=0;
//двумя предыдущими
vc[i]:=vc[i]/vb[i];
if i=nx-1 then vc[i]:=0;
F[i]:=F[i]/vb[i];
vb[i]:=1;
//двумя предыдущими
end;
for i:=nx-2 downto 1 do //обратный ход
begin
F[i]:=F[i]-vc[i]*F[i+1];
vc[i]:=0; // предыдущим действием привели vc[i] к нулю
end;
for i:=1 to nx-1 do
Tm[i,j]:=F[i]; //запись результатов в массив температур в начальный момент (не нулевой, а первый)
//расчет и запись в массив толщины слоя
if Tm[nx-1,j-1]>Tm[nx,j] then //температура по слою понижается
S[j]:=S[j-1]+Q*dt-R*dt*(Tm[nx-
else S[j]:=S[j-1]+Q*dt-R*dt*(Tm[nx,
if S[j]<0 then //произошло полное испарение - останов
begin
S[j]:=0;
j:=nt;
boolAll:=true;
end;
progonK.Progon1step(j);
end;
procedure Tprogon.Execute; //температура
var i,j,new_nx:integer;
begin
Progon1step(1); //для первого
момента времени методом
for j:=2 to nt do //j-счетчик по времени
begin
Progon1step(j);
if nx>1 then
begin
new_nx:=ceil(xk*S[j] / dx)+1; //округление - кол-во узлов уместившихся в слой
if new_nx<nx then
begin
old_nx:=old_nx+(nx-new_nx); //кол-во узлов не уместившихся в слой
nx:=new_nx;
for i:=j to nt do
begin
//Tm[nx-1,i]:= Tmk/Tm0;
Tm[nx,i]:= Tmk/Tm0;
Kn[nx,i]:= Kn[nx,j];
end;
Progon1step(j); //перерасчет по новому количеству узлов
end;
end;
end;
end;
///////////////////// реализация Tprogon конец
///////////////////// реализация TprogonK
constructor TprogonK.Create; //конструктор потока
var i,j:integer;
begin
inherited Create; //конструктор родителя
//многие параметры установлены конструктором объкта progon
setlength(Kn,nx+1,nt+1); //установка размерности массивов
Knk:=Kn0;
for j:=0 to nt do //j-счетчик по времени
begin
Kn[0,j]:=1; //изначально концентрация у дна заполняется 1, это равносильно начальной концентрации
Kn[nx,j]:=Knk/Kn0; //граничные условия
end;
for i:=0 to nx do //i-счетчик по координате
begin Kn[i,0]:=1; //изначально вся среда (слой) заполняется 1, это равносильно начальной концентрации
end;
setlength(va,nx+1); setlength(vb,nx+1); setlength(vc,nx+1);
setlength(F,nx+1);
Kn[0,1]:=Kn0/Kn0; Kn[nx,1]:=Knk/Kn0; //граничные условия температур
F[0]:= Kn[0,1]; //F[nx]:= Kn[nx,1]; //свободные члены уравнений матрицы
//расчет коэффициентов уравнений на основе разностной схемы
kc:=20*(Q-R/dx)*dx/aD;
//остается умножить на
end;
procedure TprogonK.Progon1step(j:
var i :integer;
begin
//для j-го момента времени
F[0]:= Kn[0,j]; //F[nx]:= Kn[nx,j]; //свободные члены уравнений матрицы
for i:=1 to nx do //i-счетчик по координате до последнего узла
begin
va[i]:=-1; vb[i]:=1-kc*(Tm[i,j]-Tm[i-1,j]
F[i]:=kc*(Tm[i,j]-Tm[i-1,j])/
if i=1 then
begin
F[1]:= Kn0; //это свободный член F для уравнения верхней строки матрицы (левая область или дно)
va[1]:=0; vc[1]:=0;
F[1]:= F[1]/vb[1];
vb[1]:=1;
end;
end;
for i:=2 to nx do //прямой ход преобразований к единичной
begin
F[i]:=F[i]-va[i]*F[i-1];
va[i]:=0; //предыдущими действиями привели va[i] к нулю
F[i]:=F[i]/vb[i];
vb[i]:=1;
//предыдущими действиями
end;
//обратный ход не нужен
for i:=1 to nx do
Kn[i,j]:=F[i]; //запись результатов в массив концентраций в j-момент (не нулевой, а первый и далее)
end;
///////////////////// реализация TprogonK конец
/////////////////// закрытые Переменные модуля
var progon: Tprogon; // глобальная переменная
// реализация главной формы
procedure TFormMain.FormCreate(Sender: TObject);
begin
Chart1.BottomAxis.Automatic:= false; Chart1.LeftAxis.Automatic := false;
Button7Click(Sender); //очистка
end;
procedure TFormMain.Button7Click(Sender: TObject); //очистка
begin
Series1.Clear();
Series2.Clear();
Series3.Clear();
Ypmax:=-High(integer); //изначально очень маленькие значения
Ypmin:=High(integer); //изначально очень большие значения
edit2.text:='0'; //время в ноль
CheckBox1.Checked:=false;
CheckBox1.Visible:=false;
boolAll:=false;
end;
procedure TFormMain.CheckBox1Click(
begin
if CheckBox1.Checked then OutChartG;
end;
procedure TFormMain.Button5Click(Sender: TObject); //масштаб +
var l0,pr:extended;
begin
pr:=(Chart1.LeftAxis.Maximum - Chart1.LeftAxis.Minimum)/2; //полуразмах (полуамплитуда)
l0:= Chart1.LeftAxis.Minimum + pr;
Chart1.LeftAxis.Maximum:=l0+
Chart1.LeftAxis.Minimum:=l0-
end;
procedure TFormMain.Button6Click(Sender: TObject); //масштаб -
var l0,pr:extended;
begin
pr:=(Chart1.LeftAxis.Maximum - Chart1.LeftAxis.Minimum)/2; //полуразмах (полуамплитуда)
l0:= Chart1.LeftAxis.Minimum + pr;
Chart1.LeftAxis.Maximum:=l0+
Chart1.LeftAxis.Minimum:=l0-
end;
procedure TFormMain.Button1Click(Sender: TObject); // один шаг; время окончания равно tk+dt
begin
CheckBox1.Checked:=false; //снятие галочки
CheckBox1.Visible:=true;//видн
Series1.Clear();
Series2.Clear();
Series3.Clear(); //Диаграмма
xk:=strtofloat(PointOrComma(
if xk<=0 then xk:=xk_min;
tk:=strtofloat(PointOrComma(
nx:=strtoint(PointOrComma(
nt:=strtoint(PointOrComma(
Tm0:=strtofloat(PointOrComma(
Kn0:=strtofloat(PointOrComma(
Tmk:=strtofloat(PointOrComma(
Knk:=strtofloat(PointOrComma(
A:=strtofloat(PointOrComma(
aD:=strtofloat(PointOrComma(
Q:=strtofloat(PointOrComma(
R:=strtofloat(PointOrComma(
progon:=Tprogon.Create;
if (tk<=0) or (xk<=0) then
begin
progon.Progon1step(1);
OutChart(1);
OutChartS(1);
end
else
begin
progon.Execute;
OutChart(nt);
OutChartS(nt);
end;
//изменение времени на один (10*dt) шаг если слой еще есть
if not boolAll then edit2.text:=floattostr(nt*dt+
end;
procedure TFormMain.OutChart(j:integer);
var i:integer;
x:Extended;
begin
for i:=0 to (nx+old_nx) do
begin
x:=i/(nx+old_nx); //отображаемая относительная координата x*=x/б0
if (Ypmax<Tm[i,j]) Then Ypmax:=Tm[i,j];
if (Ypmin>Tm[i,j]) Then Ypmin:=Tm[i,j];
if (Ypmax<Kn[i,j]) Then Ypmax:=Kn[i,j];
if (Ypmin>Kn[i,j]) Then Ypmin:=Kn[i,j];
if Ypmin=0 then
Ypmin:=1;
if x<S[j]+(dx/2) then
//точка в график вставляется,
begin
formMain.Chart1.Series[0].
formMain.Chart1.Series[1].
end;
end;
SetChartRange(1,0,Ypmax,Ypmin)
end;
procedure TFormMain.OutChartG; //отображение на графике положения границы во времени
var i:integer;
x:Extended;
begin
Series1.Clear();
Series2.Clear();
Series3.Clear();
Ypmax:=-High(integer); //изначально очень маленькие значения
Ypmin:=High(integer); //изначально очень большие значения
for i:=0 to nt do
begin
x:=i/nt; //отображаемая относительная координата x*=x/б0
if (Ypmax<S[i]) Then Ypmax:=S[i];
if (Ypmin>S[i]) Then Ypmin:=S[i];
formMain.Chart1.Series[2].
end;
SetChartRange(1,0,Ypmax,Ypmin)
end;
procedure TFormMain.OutChartS(j:integer)
begin
formMain.Chart1.Series[2].
formMain.Chart1.Series[2].
SetChartRange(formMain.Chart1.
end;
procedure TFormMain.EdsChange(Sender: TObject);
begin
Button7Click(Sender); //очистка, при изменении исходных данных
end;
end.