begin
library A0, A1, A4, A5, A12, A15;
comment Specimen ALGOL program from Appendix 1 of KDF9 ALGOL manual.
This is a program for a practically arising problem.
It illustrates the use of many of the facilities available to the
ALGOL user;
real alpha, lambda, Delta alpha;
integer i, f1, f2, f3, f4, f5;
real procedure erfc (z); value z; real z;
begin comment This procedure evaluates the complementary
error function of z using the trapezoidal rule.
It halves the interval until the required accuracy
is attained, but avoids repeating the evaluation of
ordinates more than once;
real x, h, J0, J1;
integer n, i;
h := 0.1; J0 := 0; n := 0; i := 1;
R: J1 := J0;
for n := n, n + i while n × h × (n × h + 2 × z) < 11.51 do
begin
x := z + n × h;
J0 := J0 + exp(-(x^2)) × (if n = 0 then 0.5 else 1);
end ;
if abs(1 - 2 × J1/J0) > 0.00001 then
begin
i := 2; n := 1; h := h/2;
goto R
end ;
erfc := 1.128379 × J0 × h
end erfc;
open (20);
Delta alpha := read (20); close (20);
comment Delta alpha is the only input data item required by the program;
open (10);
write text (10,
{
Propagation$of$an$Impulse$into$a$Viscous-locking$Medium
{cccc}
{ssss}
Delta$alpha$=$
}
);
write (10, format ({d.ddddccc}), Delta alpha);
write text(10,
{
{ssss}
alpha
{sssss}
{sssss}
{sss}
lambda
{sssssss}
{sssssss}
{ss}
lambda.sqrt(2alpha)
{s}
g
{cc}
{ssss}
0.0000
{sssss}
{sssss}
{sss}
INFINITY
{sssss}
{sssss}
{sss}
1.00000
{sssss}
{sssss}
{sss}
1.00000
{c}
}
);
f1 := format ({ssssd.dddd});
f2 := format ({12sd.ddddº+nd});
f3 := format ({12sd.ddddd});
f4 := format ({13sd.dddddcc});
f5 := format ({13sd.dddddc});
i := 1;
for alpha := Delta alpha step Delta alpha until 1.0 do
begin
real l1, l2;
i := i + 1;
lambda := (1 - alpha)/sqrt (2 × alpha);
if alpha = 1 then goto SKIP;
Repeat:
l1 := lambda;
l2 := sqrt (0.886227 × (1-alpha)/alpha × l1 × erfc (l1) × exp(+l1^2));
lambda := l2 + 0.835 × alpha × (l2-l1);
if abs (1-l2/lambda)>º-5 then goto Repeat;
SKIP:
write (10, f1, alpha);
write (10, f2, lambda);
write (10, f3, lambda × sqrt (2 × alpha));
write (10,
if i - i ÷ 5 × 5 = 0 then f4 else f5,
if lambda > .70710678
then 2 × lambda^2 × alpha × (1-alpha)
else
if lambda ± 0
then alpha × (1 - alpha) × exp (lambda^2) / (lambda × 2.3282180)
else 0.48394
)
end;
newline(10, 2);
close (10)
end
|
0.1;
|