#!/bin/perl.exe -w
BEGIN { use_ok(
'Math::Yapp'
) };
Yapp_testmode(0);
Yapp_decimals(2);
Yapp_print0(0);
Yapp_start_high(1);
my
$margin
= 1.0 / (10**10);
printf
(
"\nTesting Lagrange interpolation with 2 arrays of 7 points\n"
);
my
@X
= (-2.0, -1.0, 0.0, 1.0, 2.0, 4.0, 8.0);
my
@Y
= ( 3.0, 6.0, 9.0, -2.0, -1.0, -3.0, -3.0);
my
@Yp
= ( 5.0, 4.0, 0.0, -3.0, 2.0, 2.5, -4.5);
my
$inty
= Yapp_interpolate(\
@X
, \
@Y
);
printf
(
"Interpolated polynomial:\n<%s>\n"
,
$inty
->Ysprint());
my
$ok_count
= 0;
for
(
my
$xlc
= 0;
$xlc
<=
$#X
;
$xlc
++)
{
my
$y_val
=
$inty
->Yapp_eval(
$X
[
$xlc
]);
printf
(
"For X = %+f: Evaluates to %+17.15f, compared to %+17.15f\n"
,
$X
[
$xlc
],
$y_val
,
$Y
[
$xlc
]);
$ok_count
++
if
(
abs
(
$y_val
-
$Y
[
$xlc
]) <=
$margin
);
}
is(
$ok_count
, 7,
"Test correct 7-point Lagrange interpolation"
);
my
$int_size
=
length
(
pack
(
"p"
, 0));
printf
(
"\nint_size = %d\n"
,
$int_size
);
if
(
$int_size
== 4)
{
printf
(
"\nTesting Hermite interpolation with 3 arrays of 4 points\n"
);
splice
(
@X
, 4);
splice
(
@Y
, 4);
splice
(
@Yp
, 4);
my
$intyp
= Yapp_interpolate(\
@X
, \
@Y
, \
@Yp
);
my
$intyp_p
=
$intyp
->Yapp_derivative(1);
printf
(
"Interpolated polynomial:\n<%s>\n"
,
$intyp
->Ysprint());
printf
(
"Derivative of polynomial:\n<%s>\n"
,
$intyp_p
->Ysprint());
$ok_count
= 0;
for
(
my
$xlc
= 0;
$xlc
<=
$#X
;
$xlc
++)
{
my
$y_val
=
$intyp
->Yapp_eval(
$X
[
$xlc
]);
printf
(
"For X = %+f: Evaluates to %+17.15f, compared to %+17.15f\n"
,
$X
[
$xlc
],
$y_val
,
$Y
[
$xlc
]);
$ok_count
++
if
(
abs
(
$y_val
-
$Y
[
$xlc
]) <=
$margin
);
my
$yp_val
=
$intyp_p
->Yapp_eval(
$X
[
$xlc
]);
printf
(
"For X = %+f: Derivative evals to %+17.15f, compared to %+17.15f\n"
,
$X
[
$xlc
],
$yp_val
,
$Yp
[
$xlc
]);
$ok_count
++
if
(
abs
(
$yp_val
-
$Yp
[
$xlc
]) <=
$margin
);
}
is(
$ok_count
, 8,
"Test correct 4-point Hermite interpolation"
);
}
elsif
(
$int_size
== 8)
{
splice
(
@X
, 6);
splice
(
@Y
, 6);
splice
(
@Yp
, 6);
printf
(
"\nTesting Hermite interpolation with 3 arrays of 6 points\n"
);
my
$intyp
= Yapp_interpolate(\
@X
, \
@Y
, \
@Yp
);
my
$intyp_p
=
$intyp
->Yapp_derivative(1);
printf
(
"Interpolated polynomial:\n<%s>\n"
,
$intyp
->Ysprint());
printf
(
"Derivative of polynomial:\n<%s>\n"
,
$intyp_p
->Ysprint());
$ok_count
= 0;
for
(
my
$xlc
= 0;
$xlc
<=
$#X
;
$xlc
++)
{
my
$y_val
=
$intyp
->Yapp_eval(
$X
[
$xlc
]);
printf
(
"For X = %+f: Evaluates to %+17.15f, compared to %+17.15f\n"
,
$X
[
$xlc
],
$y_val
,
$Y
[
$xlc
]);
$ok_count
++
if
(
abs
(
$y_val
-
$Y
[
$xlc
]) <=
$margin
);
my
$yp_val
=
$intyp_p
->Yapp_eval(
$X
[
$xlc
]);
printf
(
"For X = %+f: Derivative evals to %+17.15f, compared to %+17.15f\n"
,
$X
[
$xlc
],
$yp_val
,
$Yp
[
$xlc
]);
$ok_count
++
if
(
abs
(
$yp_val
-
$Yp
[
$xlc
]) <=
$margin
);
}
is(
$ok_count
, 2
*scalar
(
@X
),
"Test correct 6-point Hermite interpolation"
);
}
else
{
die
"This Perl seems to be neither 32 nor 64-bit"
; }
printf
(
"\nTest construct by roots\n"
);
my
@root_list
= (-1, 2, cplx(2,1), cplx(2, -1),
cplx(
sqrt
(3),
sqrt
(.5)), cplx(
sqrt
(3),-
sqrt
(.5)) );
my
$yapp6
= Yapp_by_roots(\
@root_list
);
printf
(
"Constructed:\n%s\n"
,
$yapp6
->Ysprint());
$ok_count
= 0;
for
(
my
$rlc
= 0;
$rlc
<
@root_list
;
$rlc
++)
{
my
$zero
=
$yapp6
->Yapp_eval(
$root_list
[
$rlc
]);
my
$root_string
;
$root_string
= Csprint(
$root_list
[
$rlc
]);
printf
(
"Evaluation at %s yields %s\n"
,
$root_string
, Csprint(
$zero
));
$ok_count
++
if
(
abs
(
$zero
) <=
$margin
);
}
is(
$ok_count
,
@root_list
,
"Success: Contructing polynomial by roots"
);
print
"End of interpolation and by-roots tests\n"
;
done_testing();
exit
;