- •1.2. Важность графики
- •2. Задача об остывании кофе
- •2.1. Основные понятия
- •2.2. Алгоритм Эйлера
- •2.4. Программа для компьютера
- •2.5. Программа для решения задачи об остывании кофе
- •Задача 2.1. Программа для решения задачи об остывании кофе
- •Задача 2.2. Анализ данных
- •2.6. Устойчивость и точность
- •Задача 2.3. Точность и устойчивость метода Эйлера
Задача 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.
