46 lines
1.6 KiB
COBOL
46 lines
1.6 KiB
COBOL
DELEGATE-ID func.
|
|
PROCEDURE DIVISION USING VALUE t AS FLOAT-LONG
|
|
RETURNING ret AS FLOAT-LONG.
|
|
END DELEGATE.
|
|
|
|
CLASS-ID. MainClass.
|
|
|
|
78 T0 VALUE 100.0.
|
|
78 TR VALUE 20.0.
|
|
78 k VALUE 0.07.
|
|
|
|
01 delta-t INITIALIZE ONLY STATIC
|
|
FLOAT-LONG OCCURS 3 VALUES 2.0, 5.0, 10.0.
|
|
|
|
78 n VALUE 100.
|
|
|
|
METHOD-ID NewtonCooling STATIC.
|
|
PROCEDURE DIVISION USING VALUE t AS FLOAT-LONG
|
|
RETURNING ret AS FLOAT-LONG.
|
|
COMPUTE ret = - k * (t - TR)
|
|
END METHOD.
|
|
|
|
METHOD-ID Main STATIC.
|
|
DECLARE f AS TYPE func
|
|
SET f TO METHOD self::NewtonCooling
|
|
|
|
DECLARE delta-t-len AS BINARY-LONG
|
|
MOVE delta-t::Length TO delta-t-len
|
|
PERFORM VARYING i AS BINARY-LONG FROM 1 BY 1
|
|
UNTIL i > delta-t-len
|
|
DECLARE elt AS FLOAT-LONG = delta-t (i)
|
|
INVOKE TYPE Console::WriteLine("delta-t = {0:F4}", elt)
|
|
INVOKE self::Euler(f, T0, n, elt)
|
|
END-PERFORM
|
|
END METHOD.
|
|
|
|
METHOD-ID Euler STATIC.
|
|
PROCEDURE DIVISION USING VALUE f AS TYPE func, y AS FLOAT-LONG,
|
|
n AS BINARY-LONG, h AS FLOAT-LONG.
|
|
PERFORM VARYING x AS BINARY-LONG FROM 0 BY h UNTIL x >= n
|
|
INVOKE TYPE Console::WriteLine("x = {0:F4}, y = {1:F4}", x, y)
|
|
COMPUTE y = y + h * RUN f(y)
|
|
END-PERFORM
|
|
END METHOD.
|
|
END CLASS.
|