printf( "Starting the eig test...\n" );
near = function (a; b)
{
return norm (a - unlabel(b)) / (norm (a) + norm (b)) < 1e-10;
};
rnd_pos = 0;
rnd_vec = fill (99^2; (magic(99)-0.5)/99^2);
rnd = function (n)
{
local (r);
if (n == NULL)
{
r = rnd_vec [rnd_pos += 1];
else
r = rnd_vec [rnd_pos+1 : rnd_pos+n];
rnd_pos += n;
}
return r;
};
assert = strip (function (t)
{
if (!test (t))
{
message ("...failed.\a");
exception ();
}
});
# standard, real, symmetric
a = symmetric( rand( 8,8 ) );
a[2;1]=a[2;1]; # force general symmetry
e=eig(a;{left});
assert( norm( sum(diag(a)) - sum(e.values) ) < 1e-8 );
assert( norm(e.vectors-e.left_vectors;"inf") < 1e-8 );
assert( norm(e.vectors-eig(a).vectors;"inf") < 1e-8 );
assert( norm(a*e.vectors-e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(a'*e.left_vectors-e.left_vectors*diag(e.values);"inf") < 1e-8 );
assert( norm( imag( e.values ) ) < 1e-8 );
a += diag( (1:8)+(8-2) );
e=eig(a;{left});
assert( norm( sum(diag(a)) - sum(e.values) ) < 1e-8 );
assert( norm(e.vectors-e.left_vectors;"inf") < 1e-8 );
assert( norm(e.vectors-eig(a).vectors;"inf") < 1e-8 );
assert( norm(a*e.vectors-e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(a'*e.left_vectors-e.left_vectors*diag(e.values);"inf") < 1e-8 );
assert( norm( imag( e.values ) ) < 1e-8 );
es=eig(symmetric(a));
assert( norm( sort( real( e.values ) ) - es.values ) < 1e-8 );
assert( norm( abs(e.vectors[;isort(real(e.values))]'*es.vectors)-ident(8); "inf" ) < 1e-8 );
a = symmetric( rand( 43,43 ) );
a[2;1]=a[2;1]; # force general symmetry
e=eig(a;{left});
assert( norm( sum(diag(a)) - sum(e.values) ) < 1e-8 );
assert( norm(e.vectors-e.left_vectors;"inf") < 1e-8 );
assert( norm(e.vectors-eig(a).vectors;"inf") < 1e-8 );
assert( norm(a*e.vectors-e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(a'*e.left_vectors-e.left_vectors*diag(e.values);"inf") < 1e-8 );
assert( norm( imag( e.values ) ) < 1e-8 );
a += diag( (1:43)+(43-2) );
e=eig(a;{left});
assert( norm( sum(diag(a)) - sum(e.values) ) < 1e-8 );
assert( norm(e.vectors-e.left_vectors;"inf") < 1e-8 );
assert( norm(e.vectors-eig(a).vectors;"inf") < 1e-8 );
assert( norm(a*e.vectors-e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(a'*e.left_vectors-e.left_vectors*diag(e.values);"inf") < 1e-8 );
assert( norm( imag( e.values ) ) < 1e-8 );
es=eig(symmetric(a));
assert( norm( sort( real( e.values ) ) - es.values ) < 1e-8 );
assert( norm( abs(e.vectors[;isort(real(e.values))]'*es.vectors)-ident(43); "inf" ) < 1e-8 );
# standard, complex, hermitian
a = hermitian( rand( 23,23 ) + sqrt(-1)*rand( 23, 23 ) );
a[2;1]=a[2;1]; # force general symmetry
e=eig(a;{left});
assert( norm( sum(diag(a)) - sum(e.values) ) < 1e-8 );
assert( norm(e.vectors-e.left_vectors;"inf") < 1e-8 );
assert( norm(e.vectors-eig(a).vectors;"inf") < 1e-8 );
assert( norm(a*e.vectors-e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(e.left_vectors'*a-diag(e.values)*e.left_vectors';"inf") < 1e-8 );
assert( norm( imag( e.values ) ) < 1e-8 );
es=eig(hermitian(a));
assert( norm( sort( real( e.values ) ) - es.values ) < 1e-8 );
assert( norm( abs(e.vectors[;isort(real(e.values))]'*es.vectors)-ident(23); "inf" ) < 1e-8 );
# standard, real, unsymmetric
a = rand( 51,51 );
e=eig(a;{left});
ee=eig(a';{left});
assert( norm( sum(diag(a)) - sum(e.values) ) < 1e-8 );
assert( norm(e.vectors-eig(a).vectors;"inf") < 1e-8 );
assert( norm(a*e.vectors-e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(e.left_vectors'*a-diag(e.values)*e.left_vectors';"inf") < 1e-8 );
# standard, complex, unsymmetric
a = rand( 17,17 ) + sqrt(-1) * rand( 17, 17 );
e = eig( a; {left} );
assert( norm( sum(diag(a)) - sum(e.values) ) < 1e-8 );
assert( norm(e.vectors-eig(a).vectors;"inf") < 1e-8 );
assert( norm(a*e.vectors-e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(e.left_vectors'*a-diag(e.values)*e.left_vectors';"inf") < 1e-8 );
# generalized, real, symmetric
a = symmetric( magic( 9 ) );
b = symmetric( bdiag( magic(3),magic(3),magic(3); 0; 3 ) ) + diag(11:19);
e = eig( a; b );
assert( norm(a*e.vectors-b*e.vectors*diag(e.values);"inf") < 1e-8 );
assert( norm(e.vectors'*a*e.vectors-diag(e.values);"inf") < 1e-8 );
assert( norm(e.vectors'*b*e.vectors-ident(9);"inf") < 1e-8 );
# generalized, real, unsymmetric
a = magic(28);
b = bdiag( fill( 7,28; magic(7) ); 0; 4 );
e = eig( a; b; {left} );
v = e.values.num / e.values.denom;
assert( norm(a*e.vectors-b*e.vectors*diag(v);"inf") < 1e-8 );
assert( norm(e.left_vectors'*a-diag(v)*e.left_vectors'*b;"inf") < 1e-8 );
a = symmetric( magic( 9 ) );
b = symmetric( bdiag( magic(3),magic(3),magic(3); 0; 3 ) ) + diag(11:19);
a[2;1] = -a[1;2];
e = eig( a; b; {left} );
v = e.values.num / e.values.denom;
assert( norm(a*e.vectors-b*e.vectors*diag(v);"inf") < 1e-8 );
assert( norm(e.left_vectors'*a-diag(v)*e.left_vectors'*b;"inf") < 1e-8 );
# generalized, complex, hermitian
a = symmetric (magic (61));
b = diag (1:61);
e = eig (a; b);
aa = hermitian (a+0*sqrt(-1));
bb = b+0*sqrt(-1);
ee = eig (aa; bb);
assert (near (e.values; ee.values));
assert (near (aa*ee.vectors; bb*ee.vectors*diag(ee.values)));
assert (near (a*ee.vectors; b*ee.vectors*diag(ee.values)));
n = 17;
a = hermitian (rand(n,n)+n*ident(n)+sqrt(-1)*rand(n,n));
b = hermitian (rand(n,n)+n*ident(n)+sqrt(-1)*rand(n,n));
e = eig (a; b);
assert (near (a*e.vectors; b*e.vectors*diag(e.values)));
# generalized, complex, general
a = symmetric (magic (57));
b = diag (1:57);
e = eig (a; b);
aa = symmetric (a+0*sqrt(-1));
bb = b+0*sqrt(-1);
ee = eig (aa; bb);
v = ee.values.num / ee.values.denom;
assert (near (e.values; sort(real(v))));
assert (near (aa*ee.vectors; bb*ee.vectors*diag(v)));
assert (near (a*ee.vectors; b*ee.vectors*diag(v)));
n = 21;
a = fill (n,n; rnd (n^2)) + sqrt(-1) * fill (n,n; rnd (n^2)) + n*ident(n);
b = diag (1:n);
e = eig (a; b; {left});
v = e.values.num / e.values.denom;
assert (near (a*e.vectors; b*e.vectors*diag(v)));
assert (near (e.left_vectors'*a; diag(v)*e.left_vectors'*b));
printf( "...passed.\n" );
syntax highlighted by Code2HTML, v. 0.9.1