Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите решить задачу
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Александр89
Здравствуйте прошу помочь изменить код программы. Постановка задачи такова: Частица угля (шар) начинает прогреваться на границе действует лучистый и конвективный теплообмен. Решается методом сеток. По мере нагревания с температуры 400 градусов происходит реакция разложения. Проблема в том что программа вводит значения температуры от радиуса и степень разложения в конечный момент времени. А нужно что бы в каждый момент времени при выполнении условия 400 градусов считалась степень разложения и выводилась в файл( тоесть надо получить график изменение степени разложения от температуры) при этом на каждом промежутке степень разложения суммировалась. Вот код:


uses crt;

const mf=1000;
sigma=5.669e-8;
eps=1e-5;
R=8.31;


type
vector=array[1..mf] of real;
var
i, j, N : integer;
T, Tn,Tr: vector;
alfa, beta,v: vector;
ai, bi, ci, fi, d: real;
lamda, ro, c, E, k0 : real;
kapa, Te, eps1: real;
h, tau, t_end, time : real;
T0, R1, qxim : real;
f, g : text;
begin
clrscr;
Writeln(' , N');
Readln(N);
Writeln(' , t_end');
Readln(t_end);
Writeln(' , R1');
Readln(R1);
Writeln(' , lamda');
Readln(lamda);
Writeln(' , ro');
Readln(ro);
Writeln(' , c');
Readln©;
Writeln(' , kapa');
Readln(kapa);
Writeln(' , Te');
Readln(Te);
Writeln(' , eps1');
Readln(eps1);
Writeln(' , T0');
Readln(T0);
Writeln(' , k0');
Readln(k0);
Writeln(' , qxim');
Readln(qxim);
Writeln(' , E');
Readln(E);
h:=R1/(N-1);
tau:=t_end/1000.0;
for i:= 1 to N do
T[i]:=T0;
time:=0;

while time<t_end do
begin
time:=time+tau;
for i:=1 to N do
if T[i]<=373 then
v[i]:=0
else
v[i]:=(exp(-k0*exp(-E/(R*T[i]))*tau));
{ for i:=1 to N do

writeln(v[i]); }

begin
for i:=1 to N do
alfa[1]:=1.0;
beta[1]:=0.0;
for i:= 2 to N-1 do
begin
ai:=(lamda/(h*h))+(lamda/((i-1)*h*h));
ci:=(lamda/(h*h))-lamda/((i-1)*h*h);
bi:=ai+ci+ro*c/tau;
fi:=(-ro*c*T[i]/tau)-qxim*v[i];
alfa[i]:=ai/(bi-ci*alfa[i-1]);
beta[i]:=(ci*beta[i-1]-fi)/(bi-ci*alfa[i-1]);
end;
repeat
d:=T[N];
T[N]:=(lamda*beta[N-1]+h*kapa*Te+eps1*sigma*h*((sqr(sqr(Te)))-(sqr(sqr(d)))))/(h*kapa+lamda*(1-alfa[N-1]));
until abs(d-T[N])<=eps;
for i:= N-1 downto 1 do
T[i]:=alfa[i]*T[i+1]+beta[i];
end;
end;

Assign(f,'res.txt');
Rewrite(f);
Writeln(f,' R1 = ',R1:6:4);
Writeln(f,' N = ',N);
Writeln(f,' lamda = ',lamda:6:4);
Writeln(f,' ro = ',ro:6:4);
Writeln(f,' c = ',c:6:4);
Writeln(f,' T0 = ',T0:6:4);
Writeln(f,' kapa = ',kapa:6:4);
Writeln(f,' Te = ',Te:6:4);
Writeln(f,' eps = ',eps:6:4);
Writeln(f,' xh = ',h:6:4);
Writeln(f,' tau = ',tau:6:4);
Writeln(f,' t = ',t_end:6:4);
close(f);
Assign(g,'tempr.txt');
Rewrite(g);
for i:=1 to N do
writeln(g,' ',h*(i-1)10.gif8,' ',T[i]:8:5, ' ', v[i]:10:10);
close(g);
end.

Федосеев Павел
Здесь какая-то пугающая меня мат.модель физического явления.

Но раз в одном из циклов всё и так расчитывается, то
1) инициализацию файла вынеси в начало программы
2) в нужное место цикла добавь проверку на температуру и при выполнении условия выводи в файл

Пожалуй, больше ничего не могу посоветовать, иначе прийдется самому вникать в физику происходящего, разбираться с хитросплетением 20 переменных.
Александр89
Цитата(Федосеев Павел @ 7.05.2012 19:55) *

Здесь какая-то пугающая меня мат.модель физического явления.

Но раз в одном из циклов всё и так расчитывается, то
1) инициализацию файла вынеси в начало программы
2) в нужное место цикла добавь проверку на температуру и при выполнении условия выводи в файл

Пожалуй, больше ничего не могу посоветовать, иначе прийдется самому вникать в физику происходящего, разбираться с хитросплетением 20 переменных.


Программу писал сам методом проб и ошибок а паскалем пользуюсь от силы неделю. Вот я и не могу свои мысли в код записать. Здесь дело в том программа считает все что нужно. необходимо вывести время процесса с шагом по времени в файл. и при каждом промежутке времени считать v[i] при условии которое уже записано. на следующем временном промежутке так же посчитать v[i] но в результат выводить сумму значений ряда в каждой точке. то есть физически выглядит так в каждой точке происходит реакция разложения при одной температуре разложится столько при другой в этой же точке разложится еще больше но они должны сложится. что бы процесс завершился
Федосеев Павел
Прогнал текст через ptop (из FPC) для читабельности
Тогда, может быть


Uses crt;

Const mf = 1000;
sigma = 5.669e-8;
eps = 1e-5;
R = 8.31;


Type
vector = array[1..mf] Of real;

Var
i, j, N : integer;
T, Tn,Tr: vector;
alfa, beta,v: vector;
ai, bi, ci, fi, d: real;
lamda, ro, c, E, k0 : real;
kapa, Te, eps1: real;
h, tau, t_end, time : real;
T0, R1, qxim : real;
f, g : text;
Begin
clrscr;
Writeln(' , N');
Readln(N);
Writeln(' , t_end');
Readln(t_end);
Writeln(' , R1');
Readln(R1);
Writeln(' , lamda');
Readln(lamda);
Writeln(' , ro');
Readln(ro);
Writeln(' , c');
Readln( c);
Writeln(' , kapa');
Readln(kapa);
Writeln(' , Te');
Readln(Te);
Writeln(' , eps1');
Readln(eps1);
Writeln(' , T0');
Readln(T0);
Writeln(' , k0');
Readln(k0);
Writeln(' , qxim');
Readln(qxim);
Writeln(' , E');
Readln(E);
h := R1/(N-1);
tau := t_end/1000.0;
For i:= 1 To N Do
T[i] := T0;
time := 0;

Assign(f,'res.txt');
Rewrite(f);

While time<t_end Do {цикл по времени}
Begin
time := time+tau;
writeln(f, 'time=', time:6:3);
For i:=1 To N Do
Begin
If T[i]<=373 Then <-------------- это 400 градусов?
v[i] := v[i]+0 <-------------- это требуется?
Else
v[i] := v[i]+(exp(-k0*exp(-E/(R*T[i]))*tau)); <------------- это требуется?
write(f, v[i]:6:3); <------------ это требуется?
End;
Writeln(f);
{ for i:=1 to N do

writeln(v[i]); }

Begin
For i:=1 To N Do
alfa[1] := 1.0; <--------- эта строка правильная? (индекс массива единица)
beta[1] := 0.0; <--------- эта строка правильная? (индекс массива единица+вне цикла)
For i:= 2 To N-1 Do
Begin
ai := (lamda/(h*h))+(lamda/((i-1)*h*h));
ci := (lamda/(h*h))-lamda/((i-1)*h*h);
bi := ai+ci+ro*c/tau;
fi := (-ro*c*T[i]/tau)-qxim*v[i];
alfa[i] := ai/(bi-ci*alfa[i-1]);
beta[i] := (ci*beta[i-1]-fi)/(bi-ci*alfa[i-1]);
End;
Repeat
d := T[N];
T[N] := (lamda*beta[N-1]+h*kapa*Te+eps1*sigma*h*((sqr(sqr(Te)))-(sqr(sqr(d)))))/(h*kapa+
lamda*(1-alfa[N-1]));
Until abs(d-T[N])<=eps;
For i:= N-1 Downto 1 Do
T[i] := alfa[i]*T[i+1]+beta[i];
End;
End;

Writeln(f,' R1 = ',R1:6:4);
Writeln(f,' N = ',N);
Writeln(f,' lamda = ',lamda:6:4);
Writeln(f,' ro = ',ro:6:4);
Writeln(f,' c = ',c:6:4);
Writeln(f,' T0 = ',T0:6:4);
Writeln(f,' kapa = ',kapa:6:4);
Writeln(f,' Te = ',Te:6:4);
Writeln(f,' eps = ',eps:6:4);
Writeln(f,' xh = ',h:6:4);
Writeln(f,' tau = ',tau:6:4);
Writeln(f,' t = ',t_end:6:4);
close(f);
Assign(g,'tempr.txt');
Rewrite(g);
For i:=1 To N Do
writeln(g,' ',h*( i - 1 )
8,' ',T[i]: 8: 5, ' ', v[i]: 10: 10);
close(g);
End.


Тебуется чтобы на каждом временном шаге для всех i выполнялось v[i]:=v[i] +0 или +(exp(-k0*exp(-E/(R*T[i]))*tau))? Ну тогда и запиши
      For i:=1 To N Do
If T[i]<=373 Then <-------------- это 400 градусов?
v[i] := v[i]+0
Else
v[i] := v[i]+(exp(-k0*exp(-E/(R*T[i]))*tau));


И ещё, просто совет. На время отладки избавься от ввода значений с клавиатуры:
Если ты в TP7 то добавь в начале программы строку {$define Debug}, а ввод параметров оформи
{$ifdef Debug}
N:=5;
...........
{$else}
Writeln(' , N');
Readln(N);
..................
{$endif}

Потом для нормальной программы уберёшь верхнюю строку и перекомпилируешь.
Александр89
Да я реализовал то о чем говорили выше. получается что значение v[i] складывается с предыдущем при выполнении условия. Это то же хорошо но мне в общем нужна на каждом интервале времени сумма значений v[1]+v[2]+v[3]....v[i] при тех же условиях что бы считала после 374 градуса так и получится график v[i](time)

Добавлено через 2 мин.
For i:=1 To N Do
If T[i]<=373 Then <-------------- это 400 градусов?
v[i] := v[i]+0
Else
v[i] := v[i]+(exp(-k0*exp(-E/(R*T[i]))*tau));
сделал так же только дальше изменил
выражение для fi так как оно не должно зависеть от предыдущих.
Федосеев Павел
Цитата
мне в общем нужна на каждом интервале времени сумма значений v[1]+v[2]+v[3]....v[i]

  SumV:=0;
for i:=1 to N do SumV:=SumV+v[i];
Writeln(f, SumV:6:3);
Александр89
Благодарю за помощь!Очень помогло!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.