Программа для решения задачи об остывании кофе

Вернемся к нашей чашечке кофе и разработаем компьютерную программу для численного решения уравнения теплопроводности Ньютона. Чтобы определить, разумна ли наша модель понижения температуры, приведем экспериментальные данные для остывания настоящей чашки кофе (табл. 2.2.)

Таблица 2.2

Остывание чашки кофе, помещенной

в керамический стакан.

Время, мин Т, град Время, мин Т, град  
 0 83.0   8.0 64.7
1.0  77.7  9.0  63.4
2.0  75.1 10.0 62.1
3.0 73.0 11.0   61.0
4.0  71.1  12.0  59.9
5.0 69.4 13.0 58.7
6.0 67.8 13.0   57.8
7.0 66.4  15.0  56.6 

Температура регистрировалась с точностью 0.1 град.

Температура окружающего воздуха 22 град.

Структура программы Сool, в которой реализован алгоритм Эйлера численного решения задачи ньютоновской теплопроводности, аналогична структуре программы Example. Единственное различие состоит в том, что вывод на экран осуществляется подпрограммой Output, которая вызывается из подпрограммы Euler. Модульный подход к программированию будет полезен при выводе графиков.

program Cool; {метод Эйлера для задачи об остывании кофе}

var                    

t, tmpr, room_tmpr, r, dt: real;        {описание}

ncalc: integer;                                     {переменных }

 

procedure Iinitial (var t, tmpr, room_tmpr, r, dt: real;

                                var ncalc: integer);

var tmax:real;

begin

 t:=0.0;                     {начальный момент времени}

 tmpr:=83;  {начальная температура кофе (С)}

room_tmpr:=22;    {комнатная температура (С)}

 r:=0.1;                     {коэффициент остывания (1/мин)}

 dt:=0.1;                   {шаг по времени (мин)}

 tmax:=2.0;             { длительность наблюдения (мин)}

ncalc:=trunc(tmax/dt); {общее количество шагов}

end;

 

procedure Output (t,tmpr: real);

begin

writeln(t, tmpr) { печать результатов }

end;

 

procedure Euler    (var t, tmpr, room_tmpr, r, dt: real;

                               var ncalc: integer);

var

change: real;

icalc: integer;

begin

for icalc:=1 to ncalc do    { цикл повторяется ncalc раз}

     begin

       change:= - r *(tmpr - room_tmpr);

       tmpr:= tmpr + change* dt;

       t:= t+dt;                           { время}

       Output (t,tmpr)

     end

end;

 

begin                {основная программа}

Initial (t, tmpr, room_tmpr, r, dt, ncalc);

Euler (t, tmpr, room_tmpr, r, dt, ncalc);

end.

Задача 2.1. Программа для решения задачи об остывании кофе

а). После того набора текста программы и устранения всех синтаксических ошибок, необходимо убедиться в правильной реализации в программе требуемого алгоритма. Самое простое, что можно сделать - это сравнить численные результаты с предельными случаями, для которых имеется аналитическое решение, или вычисления можно проделать вручную. Используйте метод Эйлера и калькулятор для численного решения задачи теплопроводности Ньютона с теми же параметрами, что и в программе Сool. Сравните свои расчеты с тем, что получилось по программе Cool, и проверьте свою программу в этом случае.

б). Модифицируйте программу Cool так, чтобы значения параметров r, dt, tmax можно было вводить с клавиатуры, а также, чтобы перед таблицей, содержащей время и температуру, печатался заголовок.

Поскольку приведенная задача программирования может оказаться для вас новой, ниже приводится “решение”. Заметим, что в модифицированной подпрограмме Euler  производится ncalc итерации между обращениями к подпрограмме Оutput. Конечно же, наше решение не единственное и должно рассматриваться только в качестве одного из вариантов.

program Сooler;       {модифицированная программа}

{все описанные ниже переменные являются глобальными}

var t, dt,tmax,

tmpr, tmpr_0, room_tmpr, r: real;

i, j, n_out, ncalc: integer;

{----------------------------------------------------------------------}

procedure Initial;  

begin

t:=0.0;                         { начальный момент времени }

tmpr_0:= 83;

tmpr:= tmpr_0;       {начальная температура кофе (С)}

room_tmpr:= 22;       {комнатная температура (С) }

             { Блок ввода с клавиатуры }

writeln ('        Введите входные данные ');

write ('коэффициент остывания r =    ');

readln(r);

write ('шаг по времени dt, мин =     ');

readln(dt);

write ('длительность наблюдения tmax, мин= ');

readln(tmax);

write ('через сколько шагов печатать = ');

readln(n_out);

ncalc:=trunc((tmax/dt)); {общее количество шагов }

end;

{----------------------------------------------------------------------}

procedure Output;

begin

writeln('! ',t:5:2, '! ',tmpr:6:3,'!');

end;

{-----------------------------------------------------------------------}

procedure Euler;

var change: real;

begin

change:= - r * (tmpr - room_tmpr);

tmpr:= tmpr + change * dt;

t:= t+dt;                           { время}

end;

{---------------------------------------------------------------------}

 

procedure Table;

begin

writeln;               {пропуск пустой строки}

writeln('-------------------------');

writeln('! время! температура!');

writeln('-------------------------');

j:=0;

for i:=1 to ncalc do

begin

j:=j+1;

Euler;

if j = n_out then

begin

Output;

j:=0;

end

end;

writeln('-------------------------');

readln;

end;

{----------------------- основная программа -------------------}

begin

Initial;

Table;

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: