% MATLAB Demo (Determinants)
% File: detdemo
%
% Let's calculate the determinants of a sequence of 
% tridiagonal matrices with n rows and n columns:
%
% An = [ 2  -1                ]  
%      [-1   2  -1            ]
%      [    -1   2  -1        ]
%      [         -1  2        ]
%
%      [                 2 -1 ]
%      [                -1  2 ]
% Each diagonal entry is a 2; 
% each superdiagonal and subdiagonal entry is a -1.
%
>> diary detdemo
>> A1 = [2]
A1 =
     2
>> D1 = determ(A1)
D1 =
     2
%%%%%%
>> A2 = [2 -1; -1 2]
A2 =
     2    -1
    -1     2
>> D2 = determ(A2)
D2 =
     3
%%%%%%
>> n = 3;
>> e = ones(n-1, 1);
>> A3 = 2*eye(n, n) - diag(e, 1) - diag(e, -1)
A3 =
     2    -1     0
    -1     2    -1
     0    -1     2
>> D3 = determ(A3)
D3 =
     4
%%%%%%
%
% Do you see a pattern?:  D1 = 2; D2 = 3; D3 = 4; ....
%
>> n = 6;
>> e = ones(n-1, 1);
>> A6 = 2*eye(n, n) - diag(e, 1) - diag(e, -1)
A6 =
     2    -1     0     0     0     0
    -1     2    -1     0     0     0
     0    -1     2    -1     0     0
     0     0    -1     2    -1     0
     0     0     0    -1     2    -1
     0     0     0     0    -1     2
>> D6 = determ(A6)
D6 =
    7.0000
%
% Let An be a tridiagonal matrix with n rows and n columns.
% Each diagonal entry of An is 2; each superdiagonal and subdiagonal 
% entry of An is -1.
%
% RESULT: det(An) = n+1.
% PROOF:
%
% det(An) = 2 * (-1)^(1+1)*det(M11) +  -1  * (-1)^(1+2)*det(M12).
%               ^^^^^^^^^^^^^^^^^^^          ^^^^^^^^^^^^^^^^^^^ 
%         a11 *          C11        +  a12 *          C12
%
% is the cofactor expansion along row 1 for det(An).
% Recall that the cofactor Cij is  (-1)^(i+j) * det(Mij).
%
% Observe that C11 simplifies to det(A_n-1).
%
% det(M12) can be obtained by a cofactor expansion along column 1 of M12.
%
% det(M12) = -1  * (-1)^(1+1)*det(A_n-2) =  - det(A_n-2).
%                  ^^^^^^^^^^^^^^^^^^^^^
%            a11 *       C11             of the matrix M12 
%
% The pattern is det(An) = 2*det(A_n-1) - det(A_n-2) with the
% initial conditions: det(A1) = 2 and det(A2) = 3.
% det(An) = 2*(n)-(n-1) = n+1.  
%
% One important consequence is that the symmetric matrix An is
% always INVERTIBLE because its determinant is always nonzero.
%
% Verify that the inverse of A6 is also symmetric.
% Verify that the matrix of cofactors of A6 is symmetric.
%
>> format rat
>> invA6 = inv(A6)
invA6 =
     6/7          5/7          4/7          3/7          2/7          1/7     
     5/7         10/7          8/7          6/7          4/7          2/7     
     4/7          8/7         12/7          9/7          6/7          3/7     
     3/7          6/7          9/7         12/7          8/7          4/7     
     2/7          4/7          6/7          8/7         10/7          5/7     
     1/7          2/7          3/7          4/7          5/7          6/7     

>> cofactA6 = cofactor(A6)
cofactA6 =
      6            5            4            3            2            1      
      5           10            8            6            4            2      
      4            8           12            9            6            3      
      3            6            9           12            8            4      
      2            4            6            8           10            5      
      1            2            3            4            5            6      
%
%%% Verify that inv(A6) = 1/det(A6) * adjoint(A6).
%%% The adjoint is the transpose of the matrix of cofactors.
%
>> adjA6 = cofactA6'
adjA6 =
      6            5            4            3            2            1      
      5           10            8            6            4            2      
      4            8           12            9            6            3      
      3            6            9           12            8            4      
      2            4            6            8           10            5      
      1            2            3            4            5            6      

>> temp = 1/det(A6) * adjA6
temp =
     6/7          5/7          4/7          3/7          2/7          1/7     
     5/7         10/7          8/7          6/7          4/7          2/7     
     4/7          8/7         12/7          9/7          6/7          3/7     
     3/7          6/7          9/7         12/7          8/7          4/7     
     2/7          4/7          6/7          8/7         10/7          5/7     
     1/7          2/7          3/7          4/7          5/7          6/7     
>> A6 * temp
ans =
      1            0            0            0            0            0      
      *            1            0            0            0            0      
      *            *            1            *            0            0      
      0            0            *            1            0            0      
      0            0            *            0            1            *      
      0            0            0            0            0            1      
%
%%% Each "*" is presumed to be zero. Evidently some rounding errors
%%% were present in multiplying A and its inverse.
%
>> quit