1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Помогите решить задачу, Написал программу для расчета температурной зависимости угольной части
Здравствуйте прошу помочь изменить код программы. Постановка задачи такова: Частица угля (шар) начинает прогреваться на границе действует лучистый и конвективный теплообмен. Решается методом сеток. По мере нагревания с температуры 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.
Здесь какая-то пугающая меня мат.модель физического явления.
Но раз в одном из циклов всё и так расчитывается, то 1) инициализацию файла вынеси в начало программы 2) в нужное место цикла добавь проверку на температуру и при выполнении условия выводи в файл
Пожалуй, больше ничего не могу посоветовать, иначе прийдется самому вникать в физику происходящего, разбираться с хитросплетением 20 переменных.
Здесь какая-то пугающая меня мат.модель физического явления.
Но раз в одном из циклов всё и так расчитывается, то 1) инициализацию файла вынеси в начало программы 2) в нужное место цикла добавь проверку на температуру и при выполнении условия выводи в файл
Пожалуй, больше ничего не могу посоветовать, иначе прийдется самому вникать в физику происходящего, разбираться с хитросплетением 20 переменных.
Программу писал сам методом проб и ошибок а паскалем пользуюсь от силы неделю. Вот я и не могу свои мысли в код записать. Здесь дело в том программа считает все что нужно. необходимо вывести время процесса с шагом по времени в файл. и при каждом промежутке времени считать v[i] при условии которое уже записано. на следующем временном промежутке так же посчитать v[i] но в результат выводить сумму значений ряда в каждой точке. то есть физически выглядит так в каждой точке происходит реакция разложения при одной температуре разложится столько при другой в этой же точке разложится еще больше но они должны сложится. что бы процесс завершился
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}, а ввод параметров оформи
Да я реализовал то о чем говорили выше. получается что значение 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 так как оно не должно зависеть от предыдущих.