Здравствуйте прошу помочь изменить код программы. Постановка задачи такова: Частица угля (шар) начинает прогреваться на границе действует лучистый и конвективный теплообмен. Решается методом сеток. По мере нагревания с температуры 400 градусов происходит реакция разложения. Проблема в том что программа вводит значения температуры от радиуса и степень разложения в конечный момент времени. А нужно что бы в каждый момент времени при выполнении условия 400 градусов считалась степень разложения и выводилась в файл( тоесть надо получить график изменение степени разложения от температуры) при этом на каждом промежутке степень разложения суммировалась. Вот код:
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)8,' ',T[i]:8:5, ' ', v[i]:10:10); close(g); end.
Федосеев Павел
7.05.2012 19:55
Здесь какая-то пугающая меня мат.модель физического явления.
Но раз в одном из циклов всё и так расчитывается, то 1) инициализацию файла вынеси в начало программы 2) в нужное место цикла добавь проверку на температуру и при выполнении условия выводи в файл
Пожалуй, больше ничего не могу посоветовать, иначе прийдется самому вникать в физику происходящего, разбираться с хитросплетением 20 переменных.
Александр89
7.05.2012 20:07
Цитата(Федосеев Павел @ 7.05.2012 19:55)
Здесь какая-то пугающая меня мат.модель физического явления.
Но раз в одном из циклов всё и так расчитывается, то 1) инициализацию файла вынеси в начало программы 2) в нужное место цикла добавь проверку на температуру и при выполнении условия выводи в файл
Пожалуй, больше ничего не могу посоветовать, иначе прийдется самому вникать в физику происходящего, разбираться с хитросплетением 20 переменных.
Программу писал сам методом проб и ошибок а паскалем пользуюсь от силы неделю. Вот я и не могу свои мысли в код записать. Здесь дело в том программа считает все что нужно. необходимо вывести время процесса с шагом по времени в файл. и при каждом промежутке времени считать v[i] при условии которое уже записано. на следующем временном промежутке так же посчитать v[i] но в результат выводить сумму значений ряда в каждой точке. то есть физически выглядит так в каждой точке происходит реакция разложения при одной температуре разложится столько при другой в этой же точке разложится еще больше но они должны сложится. что бы процесс завершился
Федосеев Павел
7.05.2012 21:27
Прогнал текст через ptop (из FPC) для читабельности Тогда, может быть
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}, а ввод параметров оформи
Потом для нормальной программы уберёшь верхнюю строку и перекомпилируешь.
Александр89
7.05.2012 22:20
Да я реализовал то о чем говорили выше. получается что значение 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 так как оно не должно зависеть от предыдущих.
Федосеев Павел
7.05.2012 22:31
Цитата
мне в общем нужна на каждом интервале времени сумма значений 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
8.05.2012 6:24
Благодарю за помощь!Очень помогло!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.