Real Eigenvalues & Eigenvectors

Contributions to this software library are always welcome. Please ensure that you post program listings rather than .raw files. They give a reasonable idea of what your program does without having to load them into a DM42 and you can also include comments in your code. Check out the following link for a decoder/encoder: https://technical.swissmicros.com/decoders/dm42/

You can then copy/paste the listing and post it in "code" tags.
Post Reply
HPMike
Posts: 439
Joined: Fri Jul 21, 2017 11:01 pm
Location: DFW, Texas

Real Eigenvalues & Eigenvectors

Post by HPMike »

There is already a program written by Pierre Gillet, but this is a simpler albeit less automatic scheme that I originally implemented on my HP 15c.

The general eigenvalue problem that is solved here is the solution to the equation:

A Φ = λ I Β Φ

Where, A and B are real square matrices, I is the identity matrix, Φ is the eigenvector (modeshape) and λ is an eigenvalue scalar that satisfies the relationship:

| A - λ I B | = 0

The basic algorithm of this program uses the Root Solver to find the values of λ that satisfy this condition. A guess value is entered in the X register and the program EGVAL is then executed:

00 { 40-Byte Prgm }
01 LBL "EgVal"
02 PGMSLV "ZEROS"
03 STO "lambda" @ Store initial guess for λ
04 SOLVE "lambda" @ Solves for λ
05 VIEW "lambda"
06 END

00 { 40-Byte Prgm }
01 LBL "ZEROS" @ Computes | λ I B - A |
02 MVAR "lambda"
03 RCL "lambda"
04 RCLx "Ident" @Multiply scalar λ by the identity matrix Ident to ensure that only the diagonal elements of B are multiplied by λ
05 RCLx "B"
06 RCL- "A"
07 DET
08 END

Note that MVAR "lambda" is unnecessary if the program EGVAL is executed. It is there to permit direct solution of ZEROS using the root solver (SOLVER).

If B = I (Identity matrix), then this program solves the problem A Φ = λ Φ.

Edit on 4/2/2022. I added line 04 to the ZEROS program to ensure that only the diagonal elements of B are multiplied by λ. When I originally wrote this program, the B matrix was always diagonal, such that I could multiply it directly by the scalar λ since the off-diagonal elements were all zero.

Edit on 4/7/2022. I've added a program to compute the Eigenvectors Φ for the Eigenvalues λ. The eigenvectors are arbitrarily normalized such that the last element is unity (1). The solution steps are as follows:

1) Create the matrix C = λ I B - A

2) Create reduced n-1 x n-1 matrix D by deleting the last row and column of matrix C.

3) Create reduced n-1 x 1 vector E from the first n-1 elements of the nth column of matrix C.

4) Compute the first n-1 elements of the Eigenvector Φ = E / D.

5) Expand Φ to n x 1, and store 1 as the nth element.

00 { 106-Byte Prgm }
01 LBL "EgVec"
02 RCL "lambda"
03 RCLx "Ident" @Multiply scalar λ by the identity matrix Ident to ensure that only the diagonal elements of B are multiplied by λ
04 RCLx "B"
05 RCL- "A"
06 STO "C"
07 INDEX "C"
08 DIM?
09 1
10 -
11 X<>Y
12 1
13 -
14 GETM @Create n-1 x n-1 matrix D from first n-1 rows and columns of C
15 STO "D"
16 RCL "C"
17 DIM?
18 1
19 X<>Y
20 STOIJ
21 X<>Y
22 -
23 1
24 GETM @Create n-1 x 1 vector E from the first n-1 elements of the nth column of C
25 -1
26 x
27 RCL÷ "D"
28 STO "Phi" @Compute first n-1 elements of Eigenvector Φ
29 DIM?
30 X<>Y
31 1
32 +
33 X<>Y
34 DIM "Phi" @Expand Φ to n x 1, and store 1 as the nth element.
35 INDEX "Phi"
36 STOIJ
37 1
38 STOEL
39 RCL "Phi" @Eigenvector Φ
40 END

Upon completion, the program displays the n x 1 Eigenvector Φ in the X register.

Edit on 4/8/2022. I've added a program to generate the identity matrix for use with the EgVal and EgVec programs. At the prompt type n R/S, and the program will generate an n x n diagonal matrix with 1 for all the diagonal elements.

00 { 79-Byte Prgm }
01 LBL "UNIT"
02 INPUT "N"
03 ENTER
04 NEWMAT
05 STO "Ident"
06 INDEX "Ident"
07 1
08 RCL "N"
09 1ᴇ3
10 ÷
11 +
12 STO "CountI"
13 0
14 STO "I"
15▸LBL 01
16 RCL "I"
17 1
18 +
19 STO "I"
20 ENTER
21 STOIJ
22 1
23 STOEL
24 ISG "CountI"
25 GTO 01
26 END

Edit on 4/10/2022. Replaced X with Φ for consistency. Also deleted unnecessary ENTER in line 08 of UNIT program.
DM15L, S/N 00548. DM42, SN: 00159. DM41X, SN: 00973. DM32, SN 00054.
Post Reply