kill
'INT'
, $$
if
$ENV
{UNDER_DEBUGGER};
sub
tapprox {
my
(
$x
,
$y
,
$c
,
$d
) =
@_
;
$c
=
abs
(
$x
-
$y
);
$d
= max(
$c
);
$d
< 0.001;
}
my
$mat
= pdl [1,0.1],[0.1,2];
my
(
$eigvals
,
$eigvecs
) = eigsys(
$mat
);
ok(tapprox(
$eigvals
,pdl(0.9901,2.009)));
ok(!tapprox(
$eigvals
,pdl(0.99,2.5)));
ok(tapprox(
$eigvecs
,pdl([0.995,-0.0985],[0.0985,0.995])));
$mat
= pdl [2,3],[4,5];
my
$inv
= matinv(
$mat
);
inner(
$mat
->dummy(2),
$inv
->transpose->dummy(1),
my
$uni
=null);
ok(tapprox(
$uni
,pdl[1,0],[0,1]));
my
$det
=
$mat
->det;
my
$deti
=
$inv
->det;
ok(tapprox(
$det
,-2));
ok(tapprox(
$deti
,-0.5));
my
$y
= pdl (1,4,9,16,25,36,49,64.35,32);
my
$x
= pdl ( 1,2,3,4,5,6,7,8,9);
my
$w
= pdl ( 1,1,1,1,1,1,1,0.5,0.3);
my
$eps
= pdl(0);
my
$maxdeg
= 5;
$y
->inplace->setbadat(3);
my
(
$ndeg
,
$r
,
$ierr
,
$a1
) = polyfit(
$x
,
$y
,
$w
,
$maxdeg
,
$eps
);
ok((
$ierr
== 1));
$y
= zeroes(9)->setbadif(1);
(
$ndeg
,
$r
,
$ierr
,
$a1
) = polyfit(
$x
,
$y
,
$w
,
$maxdeg
,
$eps
);
ok((
$ierr
== 2));
$y
= pdl ([1,4,9,16,25,36,49,64.35,32],
[1,4,9,16,25,36,49,64.35,32],);
$x
= pdl ([1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9],);
$w
= pdl ([1,1,1,1,1,1,1,0.5,0.3],
[1,1,1,1,1,1,1,0.5,0.3],);
$y
->inplace->setbadat(3,0);
$y
->inplace->setbadat(4,1);
$eps
= pdl(0,0);
(
$ndeg
,
$r
,
$ierr
,
$a1
) = polyfit(
$x
,
$y
,
$w
,
$maxdeg
,
$eps
);
ok((sum(
$ierr
== 1) == 2));
$y
= pdl (1,4,9,16,25,36,49,64.35,32);
$x
= pdl ( 1,2,3,4,5,6,7,8,9);
$w
= pdl ( 1,1,1,1,1,1,1,0.5,0.3);
$maxdeg
= 7;
$eps
= pdl(0);
(
$ndeg
,
$r
,
$ierr
,
$a1
) = polyfit(
$x
,
$y
,
$w
,
$maxdeg
,
$eps
);
ok((
$ierr
== 1));
my
$c
= pdl(4);
my
$tc
= polycoef(
$ndeg
,
$c
,
$a1
);
my
@tc
=
$tc
->list;
my
@r
=
$r
->list;
my
$i
= 0;
foreach
my
$xpos
(
$x
->list) {
my
$ypos
= 0;
my
$n
= 0;
foreach
my
$bit
(
$tc
->list) {
$ypos
+=
$bit
* (
$xpos
- ((
$c
->list)[0]))*
*$n
;
$n
++;
}
ok(
sprintf
(
"%5.2f"
,
$ypos
) ==
sprintf
(
"%5.2f"
,
$r
[
$i
]));
$i
++;
}
my
$xx
= pdl([4]);
my
$nder
= 3;
my
(
$yfit
,
$yp
) = polyvalue(
$ndeg
,
$nder
,
$xx
,
$a1
);
ok(
int
(
$yp
->at(0)) == 8);
$nder
= 3;
$xx
= pdl(12,4,6.25,1.5);
(
$yfit
,
$yp
) = polyvalue(
$ndeg
,
$nder
,
$xx
,
$a1
);
ok(
int
(
$yfit
->at(1)) == 15);
$x
= float( 3 .. 10 );
my
$f
=
$x
*$x
*$x
+ 425.42352;
my
$answer
= 3.0
*$x
*$x
;
my
(
$d
,
$err
) = chim( float(
$x
), float(
$f
) );
ok((
$err
->getndims==0) & (
$err
->sum == 0));
ok(all( slice(
abs
((
$d
-
$answer
)/
$answer
),
'1:-2'
) < 0.05 ) );
my
$wk
=
$f
->zeroes( 2 *
$f
->nelem );
my
$d2
=
$f
->zeroes;
chic( pdl([0, 0]), pdl([0, 0]), 1,
$x
,
$f
,
$d2
,
$wk
,
my
$err2
=null );
ok((
$err2
->getndims==0) & (
$err2
->sum == 0));
ok(all(
abs
(
$d2
-
$d
) < 0.02 ) );
chsp( pdl([0, 0]), pdl([0, 0]),
$x
,
$f
,
my
$d3
=null,
$wk
,
my
$err3
=null );
ok((
$err3
->getndims==0) & (
$err3
->sum == 0));
ok(all(
abs
(
$d3
-
$d
) < 2 ) );
my
$xe
= float( pdl( 4 .. 8 ) + 0.5 );
my
(
$fe
,
$de
);
(
$fe
,
$de
,
$err
) = chfd(
$x
,
$f
,
$d
, 1,
$xe
);
ok((
$err
->getndims==0) & (
$err
->sum == 0));
$answer
=
$xe
*$xe
*$xe
+ 425.42352;
ok(all(
abs
((
$fe
-
$answer
)/
$answer
) < 1.0e-5 ) );
$answer
= 3.0
*$xe
*$xe
;
ok(all(
abs
((
$de
-
$answer
)/
$answer
) < 0.02 ) );
(
$fe
,
$err
) = chfe(
$x
,
$f
,
$d
, 1,
$xe
);
ok((
$err
->getndims==0) & (
$err
->sum == 0));
$answer
=
$xe
*$xe
*$xe
+ 425.42352;
ok(all(
abs
((
$fe
-
$answer
)/
$answer
) < 1.0e-5 ) );
$x
= float( 1, 2, 3, 5, 6, 7 );
$f
= float( 1, 2, 3, 4, 3, 4 );
my
$ans
= long( 1, 1, 1, -1, 1, 2 );
(
$d
,
$err
) = chim(
$x
,
$f
);
ok((
$err
->getndims==0) & (
$err
->sum == 2));
my
$ismon
;
(
$ismon
,
$err
) = chcm(
$x
,
$f
,
$d
, 1);
ok((
$err
->getndims==0) & (
$err
->sum == 0));
ok(
$ismon
->get_datatype == longlong->enum) or diag
$ismon
->type;
ok(tapprox(
$ismon
,
$ans
)) or diag
$ismon
,
"\nexpected:\n"
,
$ans
;
$x
= double( sequence(11) - 0.3 );
$f
=
$x
*
$x
;
(
$d
,
$err
) = chim(
$x
,
$f
);
$ans
= pdl( 9.0**3, (8.0**3-1.0**3) ) / 3.0;
(
my
$int
,
$err
) = chia(
$x
,
$f
,
$d
, 1, pdl(0.0,1.0), pdl(9.0,8.0));
ok(all(
$err
== 0));
ok(all(
abs
(
$int
-
$ans
) < 0.04 ) );
my
$hi
= pdl(
$x
->at(9),
$x
->at(7) );
my
$lo
= pdl(
$x
->at(0),
$x
->at(1) );
$ans
= (
$hi
**3 -
$lo
**3) / 3;
(
$int
,
$err
) = chid(
$x
,
$f
,
$d
, 1, pdl(0,1), pdl(9,7) );
ok(all(
$err
== 0));
ok(all(
abs
(
$int
-
$ans
) < 0.06 ) );
my
$A
= identity(4) + ones(4, 4);
$A
->slice(
'2,0'
) .= 0;
my
$B
= sequence(2, 4);
gefa(
my
$lu
=
$A
->copy,
my
$ipiv
=null,
my
$info
=null);
gesl(
$lu
,
$ipiv
,
$x
=
$B
->transpose->copy, 1);
$x
=
$x
->inplace->transpose;
my
$got
=
$A
x
$x
;
ok tapprox
$got
,
$B
or diag
"got: $got"
;
done_testing;