Euler method: Difference between revisions

Ada solution added
(Ada solution added)
Line 51:
[[Image:Euler_Method_Newton_Cooling.png|center|750px]]
 
=={{header|Ada}}==
The solution is generic, usable for any floating point type. The package specification:
<lang Ada>
generic
type Number is digits <>;
package Euler is
type Waveform is array (Integer range <>) of Number;
function Solve
( F : not null access function (T, Y : Number) return Number;
Y0 : Number;
T0, T1 : Number;
N : Positive
) return Waveform;
end Euler;
</lang>
The function Solve returns the solution of the differential equation for each of N+1 points, starting from the point T0. The implementation:
<lang Ada>
package body Euler is
function Solve
( F : not null access function (T, Y : Number) return Number;
Y0 : Number;
T0, T1 : Number;
N : Positive
) return Waveform is
dT : constant Number := (T1 - T0) / Number (N);
begin
return Y : Waveform (0..N) do
Y (0) := Y0;
for I in 1..Y'Last loop
Y (I) := Y (I - 1) + dT * F (T0 + dT * Number (I - 1), Y (I - 1));
end loop;
end return;
end Solve;
end Euler;
</lang>
The test program:
<lang Ada>
with Ada.Text_IO; use Ada.Text_IO;
with Euler;
 
procedure Test_Euler_Method is
package Float_Euler is new Euler (Float);
use Float_Euler;
 
function Newton_Cooling_Law (T, Y : Float) return Float is
begin
return -0.07 * (Y - 20.0);
end Newton_Cooling_Law;
Y : Waveform := Solve (Newton_Cooling_Law'Access, 100.0, 0.0, 100.0, 10);
begin
for I in Y'Range loop
Put_Line (Integer'Image (10 * I) & ":" & Float'Image (Y (I)));
end loop;
end Test_Euler_Method;
</lang>
Sample output:
<pre>
0: 1.00000E+02
10: 4.40000E+01
20: 2.72000E+01
30: 2.21600E+01
40: 2.06480E+01
50: 2.01944E+01
60: 2.00583E+01
70: 2.00175E+01
80: 2.00052E+01
90: 2.00016E+01
100: 2.00005E+01
</pre>
=={{header|ALGOL 68}}==
{{trans|D}} Note: This specimen retains the original [[#D|D]] coding style.