50 lines
1.0 KiB
ObjectPascal
50 lines
1.0 KiB
ObjectPascal
{$mode delphi}
|
|
PROGRAM Euler;
|
|
|
|
TYPE TNewtonCooling = FUNCTION (t: REAL) : REAL;
|
|
|
|
CONST T0 : REAL = 100.0;
|
|
CONST TR : REAL = 20.0;
|
|
CONST k : REAL = 0.07;
|
|
CONST time : INTEGER = 100;
|
|
CONST step : INTEGER = 10;
|
|
CONST dt : ARRAY[0..3] of REAL = (1.0,2.0,5.0,10.0);
|
|
|
|
VAR i : INTEGER;
|
|
|
|
FUNCTION NewtonCooling(t: REAL) : REAL;
|
|
BEGIN
|
|
NewtonCooling := -k * (t-TR);
|
|
END;
|
|
|
|
PROCEDURE Euler(F: TNewtonCooling; y, h : REAL; n: INTEGER);
|
|
VAR i: INTEGER = 0;
|
|
BEGIN
|
|
WRITE('dt=',trunc(h):2,':');
|
|
REPEAT
|
|
IF (i mod 10 = 0) THEN WRITE(' ',y:2:3);
|
|
INC(i,trunc(h));
|
|
y := y + h * F(y);
|
|
UNTIL (i >= n);
|
|
WRITELN;
|
|
END;
|
|
|
|
PROCEDURE Sigma;
|
|
VAR t: INTEGER = 0;
|
|
BEGIN
|
|
WRITE('Sigma:');
|
|
REPEAT
|
|
WRITE(' ',(20 + 80 * exp(-0.07 * t)):2:3);
|
|
INC(t,step);
|
|
UNTIL (t>=time);
|
|
WRITELN;
|
|
END;
|
|
|
|
BEGIN
|
|
WRITELN('Newton cooling function: Analytic solution (Sigma) with 3 Euler approximations.');
|
|
WRITELN('Time: ',0:7,10:7,20:7,30:7,40:7,50:7,60:7,70:7,80:7,90:7);
|
|
Sigma;
|
|
FOR i := 1 to 3 DO
|
|
Euler(NewtonCooling,T0,dt[i],time);
|
|
END.
|