Bug #12138 fixed - eigs(A,B) returned incorrect eigenvectors for dense matrices.
[scilab.git] / scilab / modules / arnoldi / tests / nonreg_tests / bug_12138.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2012 - Scilab Enterprises - Sylvestre Ledru
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7
8 // <-- CLI SHELL MODE -->
9
10 // <-- Non-regression test for bug 12138 -->
11 //
12 // <-- Bugzilla URL -->
13 // http://bugzilla.scilab.org/show_bug.cgi?id=12138
14 //
15 // <-- Short Description -->
16 //    eigs(A,B) returns incorrect eigenvectors for dense matrices
17 // =============================================================================
18
19 //non symmetric case
20 A = rand(10,10);
21 [d v] = eigs(A);
22 assert_checkalmostequal(norm(A*v-v*d),0,[], 1D-8);
23 [d v] = eigs(A,[],8,'SM');
24 assert_checkalmostequal(norm(A*v-v*d),0,[], 1D-8);
25 [d v] = eigs(A,[],8,1);
26 assert_checkalmostequal(norm(A*v-v*d),0,[], 1D-8);
27 [d v] = eigs(A,[],8,%i);
28 assert_checkalmostequal(norm(A*v-v*d),0,[], 1D-8);
29
30 //symmetric case
31 A=rand(10,10);
32 A = A*A';
33 [d v] = eigs(A);
34 assert_checkalmostequal(norm(A*v-v*d),0,[], 1D-8);
35
36 //general eigenvalue problem
37 B = rand(10,10);
38 B = B*B';
39 A = rand(10,10);
40 [d v] = eigs(A,B);
41 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
42 [d v] = eigs(A,B,8,'SM');
43 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
44 [d v] = eigs(A,B,8, 1);
45 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
46 [d v] = eigs(A,B, 8, %i);
47 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
48
49 opts.cholB = %t;
50 R = chol(B);
51 [d v] = eigs(A, R, 8, 'LM', opts);
52 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
53 [d v] = eigs(A, R, 8,'SM', opts);
54 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
55 [d v] = eigs(A, R, 8, 1, opts);
56 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
57 [d v] = eigs(A, R, 8, %i, opts);
58 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
59
60 A=A*A';
61 [d v] = eigs(A,B);
62 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
63 [d v] = eigs(A,B,8,'SM');
64 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
65 [d v] = eigs(A,B,8,1);
66 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
67 [d v] = eigs(A,B,8,%i);
68 assert_checkalmostequal(norm(A*v-B*v*d),0,[],1D-8);
69
70
71 //complex case
72 A1 = rand(10,10);
73 A2 = rand(10,10);
74 B1 = rand(10,10);
75 B2 = rand(10,10);
76 C1 = A1+%i*A2;
77 [d v] = eigs(C1);
78 assert_checkalmostequal(norm(C1*v-v*d),0,[],1D-8);
79 [d v] = eigs(C1,[], 8,'SM');
80 assert_checkalmostequal(norm(C1*v-v*d),0,[],1D-8);
81 [d v] = eigs(C1, [],8, 1+%i);
82 assert_checkalmostequal(norm(C1*v-v*d),0,[],1D-8);
83 C2 = B1+%i*B2;
84 C2=C2*C2';
85 [d v] = eigs(C1, C2);
86 assert_checkalmostequal(norm(C1*v-C2*v*d),0,[],1D-8);
87 [d v] = eigs(C1, C2, 8, 'SM');
88 assert_checkalmostequal(norm(C1*v-C2*v*d),0,[],1D-8);
89 [d v] = eigs(C1, C2, 8, %i);
90 assert_checkalmostequal(norm(C1*v-C2*v*d),0,[],1D-8);