with TEXT_IO ; with GENERIC_REAL_ARRAYS; with GENERIC_COMPLEX_TYPES ; with GENERIC_COMPLEX_ELEMENTARY_FUNCTIONS; with GENERIC_COMPLEX_ARRAYS ; with GENERIC_COMPLEX_LINEAR_EQUATIONS ; with GENERIC_RANDOM_GENERATORS ; with GENERIC_COMPLEX_EIGEN_CHECK ; with GENERIC_COMPLEX_EIGENVALUES ; with COMPLEX_IO ; with COMPLEX_ARRAYS_IO ; generic type REAL is digits <>; procedure TEST_GENERIC_COMPLEX_EIGENVALUES; procedure TEST_GENERIC_COMPLEX_EIGENVALUES is -- complex_eigenvalues EXAMPLE PROGRAM TEXT --type REAL is digits 12; package REAL_ARRAYS is new GENERIC_REAL_ARRAYS(REAL); use REAL_ARRAYS; package COMPLEX_TYPES is new GENERIC_COMPLEX_TYPES(REAL); use COMPLEX_TYPES; package COMPLEX_FUNCTIONS is new GENERIC_COMPLEX_ELEMENTARY_FUNCTIONS (REAL, COMPLEX, IMAGINARY); use COMPLEX_FUNCTIONS; package COMPLEX_ARRAYS is new GENERIC_COMPLEX_ARRAYS (REAL, REAL_VECTOR, REAL_MATRIX, COMPLEX); use COMPLEX_ARRAYS; package COMPLEX_LINEAR_EQUATIONS is new GENERIC_COMPLEX_LINEAR_EQUATIONS (REAL, COMPLEX, COMPLEX_VECTOR, COMPLEX_MATRIX); package RANDOM_GENERATORS is new GENERIC_RANDOM_GENERATORS(REAL); package COMPLEX_EIGEN_CHECK is new GENERIC_COMPLEX_EIGEN_CHECK (REAL, COMPLEX, IMAGINARY, COMPLEX_VECTOR, COMPLEX_MATRIX); package COMPLEX_EIGENVALUES is new GENERIC_COMPLEX_EIGENVALUES (REAL, COMPLEX, IMAGINARY, COMPLEX_VECTOR, COMPLEX_MATRIX); package INT_IO is new TEXT_IO.INTEGER_IO(INTEGER); package CX_IO is new COMPLEX_IO(REAL, COMPLEX); package COMPLEX_ARR_IO is new COMPLEX_ARRAYS_IO (REAL, COMPLEX, COMPLEX_VECTOR, COMPLEX_MATRIX); FAIL : BOOLEAN ; X : REAL ; N : INTEGER ; begin X := RANDOM_GENERATORS.UDRNRT + RANDOM_GENERATORS.UDRNRT + RANDOM_GENERATORS.UDRNRT ; loop INT_IO.GET ( N ) ; INT_IO.PUT ( N ) ; TEXT_IO.PUT_LINE ( " = N" ) ; declare CX : COMPLEX_MATRIX ( 1 .. N , 1 .. N ) ; A : COMPLEX_MATRIX ( 1 .. N , 1 .. N ) ; P : COMPLEX_MATRIX ( 1 .. N , 1 .. N ) ; Q : COMPLEX_MATRIX ( 1 .. N , 1 .. N ) ; H : COMPLEX_MATRIX ( 1 .. N , 1 .. N ) ; V : COMPLEX_MATRIX ( 1 .. N , 1 .. N ) ; W : COMPLEX_VECTOR ( 1 .. N ) ; begin COMPLEX_ARR_IO.GET ( A ) ; TEXT_IO.PUT_LINE ( " A input data " ) ; COMPLEX_ARR_IO.PUT ( A ) ; for I in A'RANGE ( 1 ) loop for J in A'RANGE ( 2 ) loop P ( I , J ) := COMPOSE_FROM_CARTESIAN ( RANDOM_GENERATORS.UDRNRT , RANDOM_GENERATORS.UDRNRT ) ; end loop ; end loop ; Q := COMPLEX_LINEAR_EQUATIONS.INVERSE ( P ) ; CX := A ; H := A ; -- EIGENVALUES AND EIGENVECTORS OF ORIGINAL MATRIX COMPLEX_EIGENVALUES.EIGEN ( H , W , V , FAIL ) ; if FAIL then TEXT_IO.PUT_LINE ( " ******** EIGEN DID NOT CONVERGE ******** " ) ; end if ; TEXT_IO.PUT_LINE ( " W eigenvalues " ) ; COMPLEX_ARR_IO.PUT ( W ) ; TEXT_IO.PUT_LINE ( " V eigenvectors " ) ; COMPLEX_ARR_IO.PUT ( V ) ; -- CHECK ACCURACY COMPLEX_EIGEN_CHECK.EVALVEC ( CX , W , V ) ; -- FORM P*CX*Q SIMILAR TO ORIGIONAL MATRIX AND RUN AGAIN CX := P * A * Q ; -- EIGENVALUES AND EIGENVECTORS OF RANDOMIZED MATRIX H := CX ; COMPLEX_EIGENVALUES.EIGEN ( H , W , V , FAIL ) ; if FAIL then TEXT_IO.PUT_LINE ( " ******** EIGEN DID NOT CONVERGE ******** " ) ; end if ; TEXT_IO.PUT_LINE ( " W eigenvalues " ) ; COMPLEX_ARR_IO.PUT ( W ) ; TEXT_IO.PUT_LINE ( " V eigenvectors " ) ; COMPLEX_ARR_IO.PUT ( V ) ; -- CHECK ACCURACY COMPLEX_EIGEN_CHECK.EVALVEC ( CX , W , V ) ; end ; -- block that allocates storage end loop ; exception when TEXT_IO.END_ERROR => TEXT_IO.PUT_LINE ( "DONE test_generic_complex_eigenvalues." ) ; end TEST_GENERIC_COMPLEX_EIGENVALUES ;