IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите решить задачу, Написал программу для расчета температурной зависимости угольной части
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Здравствуйте прошу помочь изменить код программы. Постановка задачи такова: Частица угля (шар) начинает прогреваться на границе действует лучистый и конвективный теплообмен. Решается методом сеток. По мере нагревания с температуры 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.



Прикрепленные файлы
Прикрепленный файл  izluchenie111.pas ( 2.32 килобайт ) Кол-во скачиваний: 267
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


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

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

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





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Цитата(Федосеев Павел @ 7.05.2012 19:55) *

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

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

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


Программу писал сам методом проб и ошибок а паскалем пользуюсь от силы неделю. Вот я и не могу свои мысли в код записать. Здесь дело в том программа считает все что нужно. необходимо вывести время процесса с шагом по времени в файл. и при каждом промежутке времени считать v[i] при условии которое уже записано. на следующем временном промежутке так же посчитать v[i] но в результат выводить сумму значений ряда в каждой точке. то есть физически выглядит так в каждой точке происходит реакция разложения при одной температуре разложится столько при другой в этой же точке разложится еще больше но они должны сложится. что бы процесс завершился
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Прогнал текст через 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}

Потом для нормальной программы уберёшь верхнюю строку и перекомпилируешь.


Сообщение отредактировано: Федосеев Павел -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Да я реализовал то о чем говорили выше. получается что значение 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 так как оно не должно зависеть от предыдущих.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Цитата
мне в общем нужна на каждом интервале времени сумма значений 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);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Благодарю за помощь!Очень помогло!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 11.05.2024 22:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name