You are on page 1of 49

-

2007


1 2
/
, . . . .
:

Bairstow, ( )
n- ,

Crout Cholesky, ,

Krylov,

.

&
Gauss.

FORTRAN 90/95.

2007

1. Bairstow
Bairstow
n-

f ( x) = an x n + an 1 x n 1 + an 2 x n 2 + ..... + a2 x 2 + a1 x + a0 = 0

(1.1)

, (1.1) , ,
. , .
,

1 = = y + zi

2 = = y zi

(1.2)

(1.1),

g ( x) = ( x )( x ) = x 2 ( + ) x +

(1.3)

f(x). , (1.1)

f ( x) = g ( x) b( x ) = g ( x) (bn2 x n2 + bn3 x n3 + ..... + b2 x 2 + b1 x + b0 )

(1.4)

b(x) n-2 ,
g(x) .
(1.1) , - g(x).
g(x) f(x). E,
, g1(x), ,
g2(x), b1(x) f(x). , g3(x),
b2(x), ...

f ( x ) = g1 ( x ) b1 ( x) = g1 ( x) (b1,n2 x n2 + b1,n3 x n3 + ..... + b1, 2 x 2 + b1,1 x + b1, 0 )

f ( x ) = g1 ( x ) [b1 ( x)] = g1 ( x ) [g 2 ( x) b2 ( x)] = g1 ( x ) g 2 ( x)

(b2,n4 x n4 + b2,n5 x n5 + ..... + b2, 2 x 2 + b2,1 x + b2, 0 )

f ( x ) = g1 ( x ) g 2 ( x) [b2 ( x)] = g1 ( x ) g 2 ( x) [g 3 ( x) b3 ( x )] = g1 ( x ) g 2 ( x) g 3 ( x)
(b3,n6 x

n 6

+ b3,n7 x

n 7

(1.5)

+ ..... + b3, 2 x + b3,1 x + b3, 0 )


2

.................... .......... .................... .................... .......... .................... .................... .................... .......... .


.................... .......... .................... .................... .......... .................... .................... .................... .......... .
f ( x ) = g1 ( x ) g 2 ( x) g k ( x) bk ( x )
k = n 2 bk ( x) = 1 n , , k = (n 1) 2 bk ( x) = ax + b n
. (1.3)
, . ,
f(x) g(x) , ,
, .

(1.2) (1.3), ,
g ( x ) = x 2 + px + q
p = 2 y , q = y + z
2

(1.6)

pk qk
gk(x) f(x), (1.5).
k .
, p q,
, p q,
. p q (
) f ( x) g ( x) , r(x). (1.4)
, ,

f ( x ) = g ( x ) b( x ) + r ( x ) =
= ( x 2 + px + q ) (bn2 x n2 + bn3 x n3 + ..... + b2 x 2 + b1 x + b0 ) + ( Rx + S )

(1.7)

r(x) = Rx + S (, ,
g(x), ). p q (
) , ,
r(x) .

r ( x ) = Rx + S 0 R , S

(1.8)

(.. 10-7 ). (1.8)



p q.
H (1.7)

f ( x) =

bn2 x n +
+

(bn3 + pbn2 ) x n1 +

+ (bn4 + pbn3 + qbn2 ) x n2 +


+ (bn5 + pbn4 + qbn3 ) x n3 +
+ .......... .......... ................... +
+

(b1 + pb2 + qb3 ) x 3

(b0 + pb1 + qb2 ) x

( pb0 + qb1 + R ) x

( qb0 + S )

x (1.1) (1.9)

(1.9)

bn2 = an pbn*1 qbn*

*
an1 = bn3 + pbn2
bn3 = an1 pbn2 qbn1

b = a pb qb

an2 = bn4 + pbn3 + qbn2


n2
n 3
n2
n 4

an3 = bn5 + pbn4 + qbn3


bn5 = an3 pbn4 qbn3

.......................................... ............................................ , bn* = bn*1 = 0

b = a pb qb

a3 = b1 + pb2 + qb3
3
2
3

a2 = b0 + pb1 + qb2

b0 = a2 pb1 qb2

a1 =
pb0 + qb1 + R
R = a1 pb0 qb1

S = a0
qb0
a0 =
qb0 + S

an = bn2

(1.10)

(1.10) n+1 n+3 R, S, p, q


n-1 bi b(x). M bn-2 bn-3
bn* bn*1 , n-1

bn = bn 1 = 0
bk = ak + 2 pbk +1 qbk + 2 , k = (n 2), (n 3),.....,2,1,0

(1.11)

R S ,

R = a1 pb0 qb1
S = a0 qb0

(1.12)

p q, (1.10), (1.11) (1.12),


R, S bi, k = n 2 . p q
( ), R S
,

R = R ( p, q ) 0
S = S ( p, q ) 0

(1.13)

(1.8), = 0,
p q, p q ,

R = R( p + p, q + q) = 0
S = S ( p + p, q + q) = 0

(1.14)

(1.14) Taylor, ,

R
R
q
p +
q
p
S
S
p +
q
S ( p + p , q + q ) = 0 S ( p , q ) +
p
q
R ( p + p , q + q ) = 0 R ( p , q ) +

(1.15)

(1.15) p q.
,

R
p

S
p
R
p
p

q
S
p

R
R ( p, q )
q p


S q
S ( p, q )
q
1

R
R ( p, q )
q R( p, q)
= [ A]1

S S ( p, q )
S ( p, q )
q

(1.16)

p q (1.16)
p q,

pi +1 = pi + p

(1.17)

qi +1 = qi + q

i . p q.
, (1.8),

p , q

p 0 , q 0

(1.18)

, (1.16),

R
R
S
S
,
,
,
p
q
p
q
(1.12) p q , (1.11)
bi = bi(p,q),

b
R
b
= b0 p 0 q 1
p
p
p
S
b
= q 0
p
p

R
b
b
= b1 p 0 q 1
q
q
q
S
b
= b0 q 0
q
q

,
,

(1.19)

(1.19) R S
p q, b0 b1 p q.
, (1.11) p q

bk
b
b
= bk +1 p k +1 q k + 2
p
p
p

bk
b
b
= bk + 2 p k +1 q k + 2
q
q
q

(1.20)

k = (n 2), (n 3),.....,2,1,0 . c = b p d = b q

bk

p = ck = bk +1 pck +1 qck + 2

, k = (n 2), (n 3),.....,2,1,0
bk = d = b pd qd
k
k +2
k +1
k +2
q

(1.21)

(1.21) ck dk.
ck dk, bk+1 bk+2,
. ,
, k = n 2:

bn 2
= cn 2 = bn 1 pcn 1 qcn
p
bn 2
= d n 2 = bn pd n 1 qd n
q

(1.22)

(1.11) () cn, cn-1, dn, dn-1


cn-2 dn-2 . ,

bn = bn1 = 0

bn bn1 bn bn1
=
=
= 0 cn = cn1 = d n = d n1 = 0
=
p
q
q
p

(1.23)

(1.22) , (1.11) (1.23),

cn 2 = d n 2 = 0

(1.24)

(1.21), ck+1 dk, ck dk ,

bk +1

p = ck +1 = bk + 2 pck + 2 qck + 3

, k = (n 3), (n 4),.....,2,1,0
bk = d = b pd qd
k
k +2
k +1
k +2
q

(1.25)

, ck+1 dk bk+2 ck+2, ck+3, dk+1, dk+2. (1.25), k = n 3,


:

bn 2
= cn 2 = bn 1 pcn 1 qcn
p
bn 3
= d n 3 = bn 1 pd n 2 qd n 1
q

(1.26)

(1.23) (1.24) cn-2 = dn-3

d k = ck +1 , k = (n 3), (n 4),.....,2,1,0

(1.27)

(1.21), (1.23) (1.27)

bn bn 1

p = p = cn = cn 1 = 0

bk
= ck = bk +1 pck +1 qck + 2 , k = (n 2), (n 3),.....,2,1,0

bk
= d k = ck +1

(1.28)

(1.28), (1.19) R S p q

R
= b0 pc0 qc1
p
S
= qc0
p

,
,

R
= b1 pc1 qc2
q
S
= b0 qc1
q

(1.29)

c0, c1 c2 ck (28),
k = n - 2. , p q p q ,
(1.16).
E p q (
)
.
(1.1) (.. Newton-Raphson,
) (1.1),
p q
. , ,
p q ( p = q = 0).
I , ,
/ (round off errors)
( )
. (1.8) (1.18),
, .
p q ,
(1.16), .
f(x) .

( ) ,

f ( i ) , i = 1,2,3,....., n

(1.30)

i (1.1) . (1.30)
,
p q i j
(1.30). (1.30)

ai (1.1). , , ,
p q .
,
(1.30)
p q, .
R S p q,
(1.8) p q,
p q
p q . (1.8)
(.. 10-12 ).
(1.18). , (1.14), (1.18)
(1.8).
, /,
.
1. (1.16)
0 det[ A] det[ A] = 0

(1.31)

2. (1.6)
0 p 2 4q p 2 4q = 0

(1.32)

3. (1.2)
0 z z = 0

(1.33)

,
BAIRSTOW ( FORTRAN 90/95) .

Bairstow
1:

p q.

2:

bk b(x), (1.11).

3:

R S r(x), (1.12).

4:

(1.8). ,
11.

5:

c0, c1 c2 (1.28).

6:

R S p q (1.29).

7:

(1.16) (1.31).

.

8:

p q (1.16).

9:

p q (1.17).

10:

(1.18). ,
2 p q 9.

11:

(1.6)
(1.32).

12:

(1.6).

13:

(1.33) .

14:

b(x)

3 ,

2 - b(x)
f(x) (-)
2. p q 9. 2 1
/ 15.
15:

(1.30) .
,
, 1 p q
(1.30). ,

.

f ( x ) = x 5 17 x 4 + 124 x 3 508 x 2 + 1035 x 875 = 0


: p0 = q0 = 0. (1.18)
p = 10 14 , q = 10 14 .

,
. 1
n

. 2
b

. 3

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

-17

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

124

1.00000

0.00000

1.00000

0.00000

1.00000

0.00000

-508

-17.00000

-1.00000

-15.38304

-1.00000

-14.13201

-1.00000

1035

124.00000

17.00000

97.40375

13.76607

80.16487

11.26402

-875 -508.00000

-124.00000

-324.00534

-73.42208

-231.38640

-44.55511

p1 = -1.61696
q1 = 1.72244

p2 = -2.86799
q2 = 3.30466

p3 = -3.67811
q3 = 4.48732

. 7 & 8
n

0.00000

0.00000

-17

0.00000

0.00000

124

1.00000

0.00000

-508

-13.00000

-1.00000

1035

67.00000

9.00000

-875

-175.00000

-26.00000

p7,8 = -4.00000
q7,8 = 5.00000
4, 5 6 .
A p = -4 q = 5. g(x)

g ( x) = x 2 + px + q = x 2 4 x + 5 = 0 x1, 2 = 2 i
H

b( x) = x 3 13x 2 + 67 x 175 = 0
f(x). p, q
, p = -4 q = 5.
,

10

. 1
n

. 2
b

. 3

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

-13

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

67

1.00000

0.00000

1.00000

0.00000

1.00000

0.00000

-175

-9.00000

-1.00000

-6.92000

-1.00000

-7.01500

-1.00000

p1 = -6.08000
q1 = 20.60000

p2 = -5.98500
q2 = 25.00620

p3 = -5.99995
q3 = 24.99983

. 5 & 6
n

0.00000

0.00000

-13

0.00000

0.00000

67

1.00000

0.00000

-175

-7.00000

-1.00000

p5,6 = -6.00000
q5,6 = 25.00000
4 .
, p = -6 q = 25. E
g(x)

g ( x ) = x 2 + px + q = x 2 6 x + 25 = 0 x3, 4 = 3 4i
,

b( x ) = x 7 = 0

x5 = 7

f ( x) = ( x 7)( x 2 i)( x 2 + i )( x 3 4i)( x 3 + 4i) = 0


Bairstow FORTRAN 90/95
BAIRSTOW FORTRAN 90/95.
, ,
(8 bytes).
H :
NDEG : n .
[A]0:NDEG : a0, a1, a2, .., an .
: :
(0) = a0, (1) = a1, (2) = a2, .., A(NDEG) = an.

11

P : p.
Q : q.
TOLPQRS : (1.8) (1.18).
TOLDETS : (1.31).
TOLDETR : (1.32).
TOLC : (1.33).
TOLFX : (1.30).
NITMAX : ax. p q.
NCYCMAX : ax. .
ISORT : :
1 = , 2 = .
IPRINT1 : :
0 = , -1 = , 1= .
IPRINT2 : :
0 = , 1 = .
H :
NREAL : .
NCOMPL : .
: NREAL + NCOMPL = n.
[XR]NDEG : y
( (1.2) ). NREAL
NREAL .
, ISORT.
NCOMPL y
.
y2 + z2, z ,
(1.2). .
[XIM]NDEG : z
( (1.2) ). NREAL
. NCOMPL
z . [XR]NDEG.
[FXR]NDEG : f() NREAL
. NCOMPL
f()
, f()

12

.
[FXIM]NDEG :
f() .
NREAL .
KSOLVE : (1.30):
0 = , 1 = .
, BAIRSTOW POLYR POLYC
f() , .
SORTR SORTC
, .

,
.
PROGRAM TEST
!
!
!
!
!

==================================================================
|
ROOTS OF POLYNOMIALS
|
==================================================================
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(0:100),XR(100),XIM(100),FXR(100),FXIM(100)

!
!
!
!
!
!

-----------------------------------------------------------------READ FROM FILE DEGREE & COEFFICIENTS OF POLYNOMIAL. ALSO, INITIAL


GUESSES FOR p & q, tolerances, solution & print parameters
-----------------------------------------------------------------OPEN (1,FILE='DATA',FORM='FORMATTED')

!
READ (1,*) NDEG
DO I=NDEG,0,-1
READ (1,*) A(I)
END DO
READ (1,*) P,Q
READ (1,*) TOLPQRS,TOLDETS,TOLDETR,TOLC,TOLFX
READ (1,*) NITMAX,NCYCMAX,ISORT,IPRINT1,IPRINT2
!
!
!
!
!

-----------------------------------------------------------------CALL SUBROUTINE BAIRSTOW TO FIND THE ROOTS OF THE POLYNOMIAL


-----------------------------------------------------------------CALL BAIRSTOW (NDEG,A,P,Q,TOLPQRS,TOLDETS,TOLDETR,TOLC,
&
&
TOLFX,NITMAX,NCYCMAX,ISORT,IPRINT1,IPRINT2, &
&
NREAL,NCOMPL,XR,XIM,FXR,FXIM,KSOLVE)

!
END
!

DATA
5
1.00
-17.00
124.00
-508.00
1035.00
-875.00
0.00 0.00
1.00D-14 1.00D-80 1.00D-07
1.00D-07 1.00D-07
100 3 1 -1 1

13

T
f(X) =
+
+
+
+
+
Cycle No.
Cycle No.

0.100000E+01
-.170000E+02
0.124000E+03
-.508000E+03
0.103500E+04
-.875000E+03

X**
X**
X**
X**
X**

1 - Division No.
1 - Division No.

5
4
3
2
1

+
+
+
+
+
1 - Total Iterations
2 - Total Iterations

8
6

==========================================================
Real Roots (Unsorted)
==========================================================
Root No.
1
= 0.700000E+01
f() = -.284217E-11
==========================================================
Complex Roots (Unsorted)
==========================================================
Root No.
1
= 0.200000E+01 +
f() = 0.227374E-12 +
0.100000E+01 i
-.568434E-13 i
Root No.
2
= 0.200000E+01 +
f() = 0.227374E-12 +
-.100000E+01 i
0.568434E-13 i
Root No.
3
= 0.300000E+01 +
f() = 0.454747E-12 +
0.400000E+01 i
0.852651E-12 i
Root No.
4
= 0.300000E+01 +
f() = 0.454747E-12 +
-.400000E+01 i
-.852651E-12 i
==========================================================
Real Roots (Sorted)
==========================================================
Root No.
1
= 0.700000E+01
f() = -.284217E-11
==========================================================
Complex Roots (Sorted)
==========================================================
Root No.
1
= 0.200000E+01 +
f() = 0.227374E-12 +
0.100000E+01 i
-.568434E-13 i
Root No.
2
= 0.200000E+01 +
f() = 0.227374E-12 +
-.100000E+01 i
0.568434E-13 i
Root No.
3
= 0.300000E+01 +
f() = 0.454747E-12 +
-.400000E+01 i
-.852651E-12 i
Root No.
4
= 0.300000E+01 +
f() = 0.454747E-12 +
0.400000E+01 i
0.852651E-12 i

BAIRSTOW, POLYR,
POLYC, SORTR SORTC.
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

==================================================================
|
SUBROUTINE TO FIND ALL REAL & COMPLEX ROOTS
|
|
OF AN n-th DEGREE POLYNOMIAL EQUATION
|
|
|
|
f(X) = anX**n + an-1X**n-1 + ..... + a2X**2 + a1X + ao = 0, |
|
|
|
where: n > 2
|
|
|
|
BAIRSTOW METHOD
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================
-----------------------------------------------------------------Variable Description
-------------------NDEG
[A]ndeg
[AA]ndeg
P
Q
[B]ndeg
[C]ndeg
TOLPQRS
TOLDETS
TOLDETR
TOLC
TOLFX
NITMAX
NCYCMAX
ISORT
IPRINT1
IPRINT2

: Polynomial Degree, n.
: Matrix of polynomial coefficients ao,a1,a2,..,an-1,an
Note that:
A(0)=ao, A(1)=a1,..., A(NDEG-1)=an-1, A(NDEG)=an.
: A copy of the original coefficients ao,a1,a2,...,an
: Initial estimation for p.
: Initial estimation for q.
: Matrix of polynomial coefficients
bo,b1,b2,..,bn-1,bn. Note that:
B(0)=Bo, B(1)=B1,..., B(NDEG-1)=Bn-1, B(NDEG)=Bn.
: Matrix of sequence ck terms
co,c1,c2,..,cn-1,cn. Note that:
C(0)=co, C(1)=c1,..., C(NDEG-1)=cn-1, C(NDEG)=cn.
: Tolerance to check if |p|<= & |q|<= , or, if
|R|<= & |S|<= .
: Tolerance to check if system determinant |a| <= .
: Tolerance to check if determinant |p**2-4q| <= .
: Tolerance to check for y+zi if |z|<= .
: Tolerance to check if |f()|<= .
: Max. permissible no. of iterations within a solytion
cycle.
: Max. permissible no. of solution cycles.
: Code for sorting (1=ascending order, 2=descending
order).
: Print code for printing intermidiate results
(0=No print, -1=partial print, 1=full print).
: Print code for printing final results

(0=No print, 1=print).


: Total number of computed real roots.
: Total number of computed complex roots.
: Matrix of computed real roots. Also, contains the
real part of complex roots (if any). Note that matrix
contains the real roots in a specified order
according to the value of ISORT. The real roots are
placed in the first NREAL positions of the matrix.
The real parts of any complex roots (also in an order
according to the magnitude of y**2+z**2, for y+zi)
are placed in the last NCOMPL positions of the
matrix.
[XIM]ndeg : Matrix of the imaginary part z of complex roots (if
any). Note that matrix contains the imaginary part of
the roots in the last NCOMPL positions.
[FXR]ndeg : Matrix of computed f() in its first NREAL positions,
if =real root. Also, in the last NCOMPL positions it
contains the real part of f(), if f() is a complex
number.
[FXIM]ndeg : Matrix of computed image part of f(), if f() is a
complex number.
KSOLVE
: Solution code (0=Not Very Good Solution, 1=Excellent
Solution)
-----------------------------------------------------------------NREAL
NCOMPL
[XR]ndeg

&
&

SUBROUTINE BAIRSTOW (NDEG,A,P,Q,TOLPQRS,TOLDETS,TOLDETR,TOLC,


&
TOLFX,NITMAX,NCYCMAX,ISORT,IPRINT1,IPRINT2, &
NREAL,NCOMPL,XR,XIM,FXR,FXIM,KSOLVE)

!
IMPLICIT REAL*8 (A-H,O-Z)
!
DIMENSION
&
!
!
!
!
!

!
!
!

14

A(0:NDEG),AA(0:NDEG),B(0:NDEG),C(0:NDEG),XR(NDEG), &
XIM(NDEG),FXR(NDEG),FXIM(NDEG)
COMPLEX*16 ZROOT
-----------------------------------------------------------------PRINT A MESSAGE IF ORDER NDEG<=2. THEN RETURN
-----------------------------------------------------------------IF (NDEG<=2) WRITE (*,"(/'***** Problem is of order n<=2'/)")
IF (NDEG<=2) RETURN
-----------------------------------------------------------------PRINT ALL DATA

!
!

------------------------------------------------------------------

1000
!
&
&
&
&

NREAL
DET
XR(NREAL)

NIT = 0
NIT = NIT + 1

!
&
&
&
&

!
!
!
!
!
25
!
!
!
!
!
!
!
!

DO I=N-2,0,-1
B(I) = A(I+2) - P*B(I+1) - Q*B(I+2)
END DO
-----------------------------------------------------------------CHECK IF REMAINDER Rx+S=0 (INITIAL GUESSES FOR p & q CORRECT)
------------------------------------------------------------------

&
&

!
!
!
!
!

IF (DABS(R)<=TOLPQRS.AND.DABS(S)<=TOLPQRS.AND.IPRINT1==1) &
WRITE (*,"(/'R = ',E12.6,' S = ',E12.6//
&
'Remainder Rx+S -> 0')") R,S

IF (DABS(R)<=TOLPQRS.AND.DABS(S)<=TOLPQRS) GO TO 20

-----------------------------------------------------------------COMPUTE TERMS ci of ck sequence.


------------------------------------------------------------------

DO I=N-2,0,-1
C(I) = -B(I+1) - P*C(I+1) - Q*C(I+2)
END DO
IF (IPRINT1==1) WRITE (*,
&
"(/'--- ------------ -----------&
' n
a
b
&
'--- ------------ -----------IF (IPRINT1<=0) GO TO 101

NREAL
XR(NREAL)

------------'/
c
'/
------------')")

!
!
!
!
!
101

&
&

DRDP
DRDQ
DSDP
DSDQ

!
!
!
!
!

=
=
=
=

-B(0) - P*C(0) - Q*C(1) ; A11 =


-B(1) - P*C(1) - Q*C(2) ; A12 =
-Q*C(0)
; A21 =
-B(0) - Q*C(1)
; A22 =

&
&

&
&

IF (IPRINT1==-1) &
WRITE (*,"('Cycle No. ',I3,' - Division No. ',I3,
&
' - Total Iterations ',I3)") NCYCLE,NDIV,NIT

DO I=N,0,-1
A(I) = B(I)
END DO
GO TO 2000
KOD
NREAL
XR(NREAL)

= 1
= NREAL + 1
= -B(0)/B(1) ; ROOT = XR(NREAL)

CALL POLYR (AA,NDEG,ROOT,FXR1)


FXR(NREAL) = FXR1
FXIM(NREAL) = 0.00D+00
GO TO 30
DET = B(1)**2 - 4.00*B(2)*B(0)
IF (DABS(DET)<=TOLDETR) DET = 0.00D+00

IF (DET) 41,42,42

!
41

DET

DSQRT(-DET)

IF (DET==0.00)
&
WRITE (*,"(/'***** Error in Subroutine Bairstow *****'/
&
'***** System for p & q: det = 0 *****')")
IF (DET==0.00) STOP
DP
DQ

0.00D+00
0.00D+00
0.00D+00
0.00D+00
0.00D+00
0.00D+00

GO TO (31,32), N

NCOMPL
= NCOMPL + 1
XR(NDEG+1-NCOMPL)
= -0.50*B(1)/B(2)
XIM(NDEG+1-NCOMPL) = 0.50*DET/B(2)
IF (DABS(XR(NDEG+1-NCOMPL))<=TOLC) XR(NDEG+1-NCOMPL) = 0.00D+00
IF (DABS(XIM(NDEG+1-NCOMPL))<=TOLC) XIM(NDEG+1-NCOMPL) = 0.00D+00
ZROOT
= DCMPLX(XR(NDEG+1-NCOMPL),XIM(NDEG+1-NCOMPL))

DET = A12*A21 - A11*A22


IF (DABS(DET)<=TOLDETS) DET = 0.00D+00

=
=
=
=
=
=

KOD = 0
N
= N - 2

!
32

-----------------------------------------------------------------SOLVE LINEAR SYSTEM FOR p & q: [p q]T = [A]-1[R S]T


------------------------------------------------------------------

IF (DABS(FXR1)>TOLFX.OR.DABS(FXR2)>TOLFX.OR.
&
DABS(FXZR1)>TOLFX.OR.DABS(FXZR2)>TOLFX.OR.
&
DABS(FXZIM1)>TOLFX.OR.DABS(FXZIM2)>TOLFX) KSOLVE = 0

FXR1
FXR2
FXZR1
FXZR2
FXZIM1
FXZIM2

DRDP
DRDQ
DSDP
DSDQ

NREAL + 1
0.50*(-P-DET) ; ROOT = XR(NREAL)

-----------------------------------------------------------------SET THE QUOTIENT POLYNOMIAL OF DEGREE n-2 AS A NEW POLYNOMIAL OF


DEGREE N = n - 2.
IF N>=3 REPEAT THE PROCEDURE WITH THIS POLYNOMIAL.
IF N<=2 CALCULATE ROOTS DIRECTLY.
------------------------------------------------------------------

!
31

-----------------------------------------------------------------COMPUTE PARTIAL DERIVATIVES R/dp, R/q, S/p, S/q


------------------------------------------------------------------

=
=

-----------------------------------------------------------------CHECK IF THIS PAIR OF ROOTS SATISFIES THE CONDITION f() <= .


------------------------------------------------------------------

DO I=N,0,-1
WRITE (*,'(I3,3(2X,E12.6))') I,A(I),B(I),C(I)
END DO

NREAL + 1
DSQRT(DET)
0.50*(-P+DET) ; ROOT = XR(NREAL)

CALL POLYR (AA,NDEG,ROOT,FXR2)


FXR(NREAL) = FXR2
FXIM(NREAL) = 0.00D+00

&
&
&

=
=
=

CALL POLYR (AA,NDEG,ROOT,FXR1)


FXR(NREAL) = FXR1
FXIM(NREAL) = 0.00D+00

R = A(1) - P*B(0) - Q*B(1)


S = A(0) - Q*B(0)

!
!
!
!
!

CALL POLYC (AA,NDEG,ZROOT,FXZR2,FXZIM2)


FXR(NDEG+1-NCOMPL) = FXZR2
FXIM(NDEG+1-NCOMPL) = FXZIM2
GO TO 25

!
22

-----------------------------------------------------------------COMPUTE bo, b1, b2,..., bn-3, bn-2 COEFFICIENTS OF THE QUOTIENT


POLYNOMIAL b(x).
------------------------------------------------------------------

!
!
!
!
!

DSQRT(-DET)

CALL POLYC (AA,NDEG,ZROOT,FXZR1,FXZIM1)


FXR(NDEG+1-NCOMPL) = FXZR1
FXIM(NDEG+1-NCOMPL) = FXZIM1

B(N) = 0.00D+00 ; B(N-1) = 0.00D+00


C(N) = 0.00D+00 ; C(N-1) = 0.00D+00

IF (IPRINT1==1) WRITE (*,


"(/52(1H=)/'Cycle No. ',I3,' - Division No. ',I3,
' - Iteration No. ',I3/52(1H-)//
'Start with:
p = ',E12.6,'
q = ',E12.6)")
NCYCLE,NDIV,NIT,P,Q

NCOMPL
= NCOMPL + 1
XR(NDEG+1-NCOMPL)
= -0.50*P
XIM(NDEG+1-NCOMPL) = 0.50*DET
IF (DABS(XR(NDEG+1-NCOMPL))<=TOLC) XR(NDEG+1-NCOMPL) = 0.00D+00
IF (DABS(XIM(NDEG+1-NCOMPL))<=TOLC) XIM(NDEG+1-NCOMPL) = 0.00D+00
ZROOT
= DCMPLX(XR(NDEG+1-NCOMPL),XIM(NDEG+1-NCOMPL))

NCOMPL
= NCOMPL + 1
XR(NDEG+1-NCOMPL)
= -0.50*P
XIM(NDEG+1-NCOMPL) = -0.50*DET
IF (DABS(XR(NDEG+1-NCOMPL))<=TOLC) XR(NDEG+1-NCOMPL) = 0.00D+00
IF (DABS(XIM(NDEG+1-NCOMPL))<=TOLC) XIM(NDEG+1-NCOMPL) = 0.00D+00
ZROOT
= DCMPLX(XR(NDEG+1-NCOMPL),XIM(NDEG+1-NCOMPL))

NDIV = 0
NDIV = NDIV + 1

-----------------------------------------------------------------START A DIVISION OF f(x) BY (x**2+px+q)


------------------------------------------------------------------

2000
!

DO I=0,NDEG
AA(I) = A(I)
END DO

N
= NDEG
NREAL = 0
NCOMPL = 0
DO I=1,NDEG
FXR(I) = 1.00D+99 ; FXIM(I) = 1.00D+99
END DO

!
!
!
!
!

-----------------------------------------------------------------INITIALIZE VARIABLES
------------------------------------------------------------------

DET

NCYCLE = 0
NCYCLE = NCYCLE + 1
KSOLVE = 1

3000

!
!
!
!
!
!

IF (DET) 21,22,22

!
21
!

WRITE (*,"(' f(X) =


',E12.6,' X**',I3,' +')") A(NDEG),NDEG
DO I=NDEG-1,1,-1
WRITE (*,"('
+ ',E12.6,' X**',I3,' +')") A(I),I
END DO
WRITE (*,"('
+ ',E12.6/)") A(0)

!
!
!
!
!
10

IF (DABS(DET)<=TOLDETR) DET = 0.00D+00

IF (IPRINT1==0) GO TO 10

CALL POLYC (AA,NDEG,ZROOT,FXZR1,FXZIM1)


FXR(NDEG+1-NCOMPL) = FXZR1
FXIM(NDEG+1-NCOMPL) = FXZIM1

NCOMPL
= NCOMPL + 1
XR(NDEG+1-NCOMPL)
= -0.50*B(1)/B(2)
XIM(NDEG+1-NCOMPL) = -0.50*DET/B(2)
IF (DABS(XR(NDEG+1-NCOMPL))<=TOLC) XR(NDEG+1-NCOMPL) = 0.00D+00
IF (DABS(XIM(NDEG+1-NCOMPL))<=TOLC) XIM(NDEG+1-NCOMPL) = 0.00D+00
ZROOT
= DCMPLX(XR(NDEG+1-NCOMPL),XIM(NDEG+1-NCOMPL))

= (A22*R - A12*S)/DET
= -(A21*R - A11*S)/DET

-----------------------------------------------------------------UPDATE p & q
------------------------------------------------------------------

CALL POLYC (AA,NDEG,ZROOT,FXZR2,FXZIM2)


FXR(NDEG+1-NCOMPL) = FXZR2
FXIM(NDEG+1-NCOMPL) = FXZIM2
GO TO 30

P = P + DP
Q = Q + DQ
!

IF (IPRINT1==1) &
&
WRITE (*,"(/' End with:
p = ',E12.6,'
q = ',E12.6)") P,Q
!
!
-----------------------------------------------------------------!
CHECK, FOR THE UPDATED p & q, IF |p| <= & |q| <= .
!
ALTERNATIVELY, CHECK IF THE REMAINDER TERMS |R| <= & |S| <=
!
(Uncomment the criterion you want to use)
!
-----------------------------------------------------------------!
!+++++
IF (IPRINT1==1) WRITE (*,"(/52(1H=))")
IF ((DABS(DP)>TOLPQRS.OR.DABS(DQ)>TOLPQRS).AND.NIT<NITMAX) &
&
GO TO 1000
!+++++
!
R = A(1) - P*B(0) - Q*B(1)
!
S = A(0) - Q*B(0)
!
IF (IPRINT1==1) WRITE (*,"(/52(1H=))")
!
IF ((DABS(R)>TOLPQRS.OR.DABS(S)>TOLPQRS).AND.NIT<NITMAX) &
!
&
GO TO 1000
!+++++
!
!
-----------------------------------------------------------------!
FOR THE LAST UPDATED p & q, CALCULATE THE TWO ROOTS OF
!
x**2+px+q = 0. FOR THESE ROOTS COMPUTE THE VALUE OF f(x)
!
-----------------------------------------------------------------!
20
FXR1
= 0.00D+00
FXR2
= 0.00D+00
FXZR1 = 0.00D+00
FXZR2 = 0.00D+00
FXZIM1 = 0.00D+00
FXZIM2 = 0.00D+00
!
DET = P**2 - 4.00*Q

!
42
!
!

15

= NREAL + 1
= 0.50*(-B(1)+DET)/B(2) ; ROOT = XR(NREAL)

NREAL
XR(NREAL)

!
!
!
!
!

= DSQRT(DET)

NREAL
XR(NREAL)

CALL POLYR (AA,NDEG,ROOT,FXR1)


FXR(NREAL) = FXR1
FXIM(NREAL) = 0.00D+00

!
!
!
!
!
30

DET

= NREAL + 1
= 0.50*(-B(1)-DET)/B(2) ; ROOT = XR(NREAL)

CALL POLYR (AA,NDEG,ROOT,FXR2)


FXR(NREAL) = FXR2
FXIM(NREAL) = 0.00D+00
-----------------------------------------------------------------CHECK IF THESE LAST ROOTS SATISFY THE CONDITION f() <= .
-----------------------------------------------------------------&
&

IF (DABS(FXR1)>TOLFX.OR.DABS(FXR2)>TOLFX.OR.
&
DABS(FXZR1)>TOLFX.OR.DABS(FXZR2)>TOLFX.OR.
&
DABS(FXZIM1)>TOLFX.OR.DABS(FXZIM2)>TOLFX) KSOLVE = 0
-----------------------------------------------------------------PRINT THIS SET OF ROOTS (UNSORTED)
-----------------------------------------------------------------IF (IPRINT1==0) GO TO 40
WRITE (*,"(/58(1H=)/'Real Roots (Unsorted)'/58(1H=))")
DO I=1,NREAL
WRITE (*,"('Root No. ',I3,'
= ',E12.6,'
f() = ', &

&
!

!
!
!
!
!
!
!
40

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

INDEXC = 0
FXMINC = 1.00D+99
DO I=NREAL+1,NDEG
FX = 0.50*(DABS(FXR(I)) + DABS(FXIM(I)))
IF (FX<=FXMINC) INDEXC = I
IF (FX<=FXMINC) FXMINC = FX
END DO
&
&

IF ((NREAL>1.AND.(INDEXR1==0.OR.INDEXR2==0)).OR.(NCOMPL>1.AND. &
INDEXC==0))
&
WRITE (*,"(/'***** ERROR: Cannot find a best pair of roots'/)")

IF ((NREAL>1.AND.(INDEXR1==0.OR.INDEXR2==0)).OR.(NCOMPL>1.AND. &
&
INDEXC==0)) STOP
KOD = 1
IF (FXMINC<FXMINR1.AND.FXMINC<FXMINR2) KOD = 2
GO TO (51,52), KOD
P = -(XR(INDEXR1)+XR(INDEXR2))
Q = XR(INDEXR1)*XR(INDEXR2)
GO TO 60

!
52

RETURN
END
==================================================================
|
SUBROUTINE TO SORT THE ELEMENTS OF AN ARRAY [X] IN
|
|
ASCENDING OR DESCENDING ORDER.
|
|
A SECOND ARRAY [FX] (DEPENDED ON [X]) IS ALSO REARRANGED
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================
-----------------------------------------------------------------Variable Description
-------------------[X]n : Array of dimension n for ordering.
[FX]n : Array of dimension n for rearrangement. It depends on [X].
N
: Array dimension.
KORD : Sort order code: (1=ascending, 2=descending)
------------------------------------------------------------------

IMPLICIT REAL*8 (A-H,O-Z)

P = -2.00*XR(INDEXC)
Q = (XR(INDEXC)**2) + (XIM(INDEXC)**2)

DIMENSION X(N),FX(N)
!

IF (NCYCLE<NCYCMAX.AND.KSOLVE==0) GO TO 3000
1
2
!
30

-----------------------------------------------------------------SORT FINAL ROOTS


-----------------------------------------------------------------IF (NREAL>1) CALL SORTR (XR,FXR,NREAL,ISORT)
IF (NCOMPL>1) CALL SORTC (XR(NREAL+1),XIM(NREAL+1),FXR(NREAL+1), &
&
FXIM(NREAL+1),NCOMPL,ISORT)

-----------------------------------------------------------------PRINT FINAL (SORTED) ROOTS


------------------------------------------------------------------

!
20

IF (IPRINT2==0) GO TO 70

WRITE (*,"(/58(1H=)/'Real Roots (Sorted)'/58(1H=))")


DO I=1,NREAL
WRITE (*,"('Root No. ',I3,'
= ',E12.6,'
f() = ', &
&
E12.6)") I,XR(I),FXR(I)
END DO

TEMPX
X(I)
X(J)

= X(I)
= X(J)
= TEMPX

TEMPFX = FX(I)
FX(I) = FX(J)
FX(J) = TEMPFX
CONTINUE
END DO
END DO
RETURN
END

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

WRITE (*,"(/58(1H=)/'Complex Roots (Sorted)'/58(1H=))")


DO I=NREAL+1,NDEG
WRITE (*,"('Root No. ',I3,'
= ',E12.6,' +
f() = ', &
&
E12.6,' +'/19X,E12.6,' i',11X,E12.6,' i')")
&
&
I-NREAL,XR(I),FXR(I),XIM(I),FXIM(I)
END DO
&

DO I=1,N-1
DO J=I+1,N
GO TO (1,2), KORD
IF (X(I)-X(J)) 20,20,30
IF (X(I)-X(J)) 30,20,20

IF (NCYCLE==NCYCMAX.AND.KSOLVE==0)
&
WRITE (*,"(/'***** Not very good solution *****'/)")
RETURN
END
==================================================================
|
SUBROUTINE TO COMPUTE THE POLYNOMIAL VALUE FOR A
|
|
REAL VARIABLE
|
|
|
|
f(X) = anX**n + an-1X**n-1 + ..... + a2X**2 + a1X + ao = 0, |
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================

==================================================================
|
SUBROUTINE TO SORT THE ELEMENTS OF ARRAYS [X1] & [X2] IN
|
|
ASCENDING OR DESCENDING ORDER ACCORDING TO THE MODULE
|
|
mod = Sqrt[x1**2 + x2**2]
|
|
ARRAYs [FX1] & [FX2] (DEPENDED ON [X1] & [X2] RESPECTIVELY) |
|
ARE ALSO REARRANGED
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================
-----------------------------------------------------------------Variable Description
-------------------[X1]n : Array of dimension n for rearrangement.
[X2]n : Array of dimension n for rearrangement.
[FX1]n : Array of dimension n for rearrangement. It depends on
[X1].
[FX2]n : Array of dimension n for rearrangement. It depends on
[X2].
N
: Array dimension.
KORD
: Sort order code: (1=ascending, 2=descending)
-----------------------------------------------------------------SUBROUTINE SORTC (X1,X2,FX1,FX2,N,KORD)

SUBROUTINE POLYR (A,N,X,FX)


!

IMPLICIT REAL*8 (A-H,O-Z)

IMPLICIT REAL*8 (A-H,O-Z)


!

DIMENSION X1(N),X2(N),FX1(N),FX2(N)

DIMENSION A(0:N)
!

!
FX = A(N)
DO I=N,1,-1
FX = FX*X + A(I-1)
END DO

FXZR = DREAL(FZ)
FXZIM = DIMAG(FZ)

SUBROUTINE SORTR (X,FX,N,KORD)

FZ = DCMPLX(A(N),DUM)
DO I=N,1,-1
TERM = DCMPLX(A(I-1),DUM)
FZ
= FZ*Z + TERM
END DO

!
!
!
!
!
!
!
!
!
!
!
!

DUM = 0.00D+00

!
!
70

DIMENSION A(0:N)
COMPLEX*16 Z,FZ,TERM
!

INDEXR2 = 0
FXMINR2 = 1.00D+99
DO I=1,NREAL
IF (I==INDEXR1) GO TO 45
IF (DABS(FXR(I))<=FXMINR2) INDEXR2 = I
IF (DABS(FXR(I))<=FXMINR2) FXMINR2 = DABS(FXR(I))
CONTINUE
END DO

!
51

INDEXR1 = 0
FXMINR1 = 1.00D+99
DO I=1,NREAL
IF (DABS(FXR(I))<=FXMINR1) INDEXR1 = I
IF (DABS(FXR(I))<=FXMINR1) FXMINR1 = DABS(FXR(I))
END DO

SUBROUTINE POLYC (A,N,Z,FXZR,FXZIM)


IMPLICIT REAL*8 (A-H,O-Z)

!
!
!
!
!

==================================================================
|
SUBROUTINE TO COMPUTE THE POLYNOMIAL VALUE FOR A
|
|
COMPLEX VARIABLE
|
|
|
|
f(X) = anX**n + an-1X**n-1 + ..... + a2X**2 + a1X + ao = 0, |
|
|
|
where: X = Z = a + bi
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================

DO I=0,NDEG
A(I) = AA(I)
END DO

45

!
60
!
!
!
!
!

!
!
!
!
!
!
!
!
!
!
!
!
!

-----------------------------------------------------------------TRY A NEXT SOLUTION CYCLE WITH BETTER INITIAL APPROXIMATIONS FOR


p & q. COMPUTE THESE APPROXIMATIONS USING THE "BEST" TWO REAL
ROOTS OR COMPLEX CONJUGATE PAIR OF ROOTS, UP TO NOW.
------------------------------------------------------------------

E12.6)") I,XR(I),FXR(I)

WRITE (*,"(/58(1H=)/'Complex Roots (Unsorted)'/58(1H=))")


DO I=NDEG,NREAL+1,-1
WRITE (*,"('Root No. ',I3,'
= ',E12.6,' +
f() = ', &
&
E12.6,' +'/19X,E12.6,' i',11X,E12.6,' i')")
&
&
NDEG+1-I,XR(I),FXR(I),XIM(I),FXIM(I)
END DO

END DO

1
2
!
30

RETURN
END

!
20
!
!

16

DO I=1,N-1
XXI = DSQRT((X1(I)**2)+(X2(I)**2))
DO J=I+1,N
XXJ = DSQRT((X1(J)**2)+(X2(J)**2))
GO TO (1,2), KORD
IF (XXI-XXJ) 20,20,30
IF (XXI-XXJ) 30,20,20
TEMPX1
X1(I)
X1(J)

= X1(I)
= X1(J)
= TEMPX1

TEMPX2
X2(I)
X2(J)

= X2(I)
= X2(J)
= TEMPX2

TEMPFX1 = FX1(I)
FX1(I) = FX1(J)
FX1(J) = TEMPFX1
TEMPFX2 = FX2(I)
FX2(I) = FX2(J)
FX2(J) = TEMPFX2
CONTINUE
END DO
END DO
RETURN
END

2.1 Crout
,
,
Crout
, (Lower) (Upper) (LUDecomposition).
. :
[]nxn

[ A] nxn = [ L] nxn [U ] nxn

a11
a
21
...

a n1

a12
a 22
...
an2

... a1n l11


... a 2 n l 21
=
... ... ...

... a nn l n1

0
l 22
...
ln2

0 u11
... 0 0

... ... ...



... l nn 0
...

u12
u 22
...
0

... u1n
... u 2 n
2.1.1)
... ...

... u nn

[ A]nxn [ x]n = [b]n ([ L]nxn [U ]nxn ) [ x]n = [ L]nxn ([U ]nxn [ x]n ) = [b]n

(2.1.2)

[ y ]n = [U ]nxn [ x]n

(2.1.3)

[y]n

[ L]nxn [ y ]n = [b]n

(2.1.4)

[x]n

[U ]nxn [ x]n = [ y ]n

(2.1.5)


. ,
(2.1.4)

y1 =

b1
l11

i 1

1
yi = bi lij y j , i = 2,3,..., n
lii
j =1

(2.1.5)

17

(2.1.6)

xn =

yn
unn

1
xi = yi
uii

(2.1.7)

uij x j , i = n 1, n 2,...,1

j = i +1

[L]nxn [U]nxn
(2.1.1), , ij []nxn.
aij i- [L]nxn
j- [U]nxn.

aij = li1u1 j + li 2 u 2 j + ..... + lin u nj , i, j = 1,2,3,....., n

(2.1.8)

(2.1.8) n2 n2 + n , lij uij,


[L]nxn [U]nxn
. (2.1.8)
lij uij, n .
Crout n2
, n lii

lii = 1 , i = 1,2,3,....., n

(2.1.9)

(, uii , lii). ,
(2.1.8), a1j
[]nxn ( (2.1.1) (2.1.9) )

[a11

a12

a13 ..... a1n ] = [u11 u12

u13 ..... u1n ]

(2.1.10)

, [U]nxn
[]nxn. A (2.1.8)
ai1 i > 1, []nxn ( a11
(2.1.10) ),

a21
l21
a21 l21u11

l
a l u
31 1 a31
31 31 11
a41 = l41u11 l41 =
a41
u11


.....
.....
..... .....
an1
ln1
an1 ln1u11

(2.1.11)

, [U]nxn
[L]nxn,
[]nxn.

18

(2.1.8)
a2j j > 1, []nxn (
a21 (2.1.11) ),
(2.1.8) ai2 i > 2,
[]nxn ( a22
).
T

a22
l 21u12 + u 22
u 22
a22 l21u12
a
l u + u
u
a l u
23
23 = 21 13
23 = 23 21 13
.....
.................
.....
.................

a2 n
l21u1n + u 2 n
u 2 n
a2 n l 21u1n
a32 l31u12 + l32 u 22
l32
a l u + l u

42 = 41 12 42 22 l 42 = 1
..... ....................
..... u 22


an 2 ln1u12 + ln 2 u 22
l n 2

(2.1.12)

a32 l31u12
a l u
42 41 12
.................

an 2 ln1u12

(2.1.13)

,
.

a11
a
21
a31

...
an1

a32
...
an 2

a12
a22

2n-1

a13 ... a1n


1 0
l
a23 ... a2 n
21 1
a33 ... a3n , l31 l32

... ... ...


... ...
l n1 l n 2
an 3 ... ann
6

2n-2

0
0
1
...
ln3
6

... 0
u11 u12
0 u
... 0
22

... 0 , 0
0

... ...
... ...
0
... 1
0

2n-1

u13 ... u1n


u 23 ... u 2 n
u33 ... u3n

... ... ...


0 ... u nn

2n-2

, n2 (2.1.8),
2n-1
., 1 uij
, 2 lij , 3 uij ,
...

19

, n 1, 3, 5,, 2n-1 n, n-1, n-2,


..., n-(n-1) . , n2-(1+2+3+..+n-1) . T n-1
2, 4, 6,...,2n-2 n-1, n-2, n-3, ,n-(n-1) .
, n(n-1)-(1+2+3+..+n-1).

n 2 + n(n 1) 2(1 + 2 + 3 + ..... + n 1) = n 2 + n 2 n n 2 + n = n 2


1444
424444
3
n 1
2 k = n ( n 1)
k =1

, .
uij lij urj r
[U]nxn
r 1

urj = arj lrk ukj , j = r , r + 1,....., n

(2.1.14)

k =1

lir r [L]nxn

lir =

1
urr

r 1

ir lik ukr , i = r + 1, r + 2,....., n


k =1

(2.1.15)

(2.1.14) (2.1.15) r, r =
1,2,..,n. i r = 1 (;).
u l (2.1.14)
(2.1.15), urj lir
r, r.
/,
ij (2.1.14) (2.1.15)
, lij uij.
[L]nxn [U]nxn /.
LUDCMP

[]nxn

[ A] nxn

u12
u11
l
u 22
21
l 31
l 32

l 42
= l 41
...
...

l n 1,1 l n 1, 2
l
ln2
n1

u13

u14

... u1,n 1

u 23

u 24

... u 2,n 1

u 33

u 34

... u 3,n 1

l 43

u 44

... u 4,n 1

...

...

... ...

l n 1,3

l n 1, 4

... u n 1,n 1

ln3

ln4

... l n ,n 1

20

u 2 n
u 3n

u 4n
...

u n 1,n
u nn
u1n

(2.1.16)

[L]nxn [U]nxn,
lii = 1, i = 1,2,,n.
2.1.1

3 1 2 x1 7
1
2
3 x2 = 14

2 2 1 x3 5
[]3x3
Crout. (14) (15) .

[ A]3x 3

3 1 2
= 1
2
3
2 2 1

(1) - r = 1
(3) - r = 2
(5) - r = 3

(2)
(4)
r=1 r=2

(2.1.14) r = 1 u1 j = a1 j - 0 = a1 j

(2.1.15) r = 1 li1 =

j = 1 u11 = 3

, j = 1,2,3 j = 2 u12 = 1
j = 3 u = 2
13

1
(ai1 0) = ai1
u11
u11

(2.1.14) r = 2 u 2 j = a 2 j

2 1=1

l
k =1

2k

i = 2 l 21 = 3
, i = 2,3
i = 3 l = 2
31
3

u kj = a 2 j -l 21u1 j , j = 2 ,3

1
7

j = 2 u 22 = a 22 l 21u12 = 2 3 ( 1) u 22 = 3

j = 3 u = a l u = 3 1 2 u = 7
23
23
21 13
23

3
3

(2.1.15) r = 2 li 2 =

2 1=1
1
1

(a32 l31u12 ) =
ai 2 lik u k 2 , i = 3 l32 =
u 22
u 22
k =1

21

3
2
4

= 2 (1) l32 =
7
3
7

(2.1.14) r = 3 u 3 j = a3 j

31= 2

k =1

k =1

l3k u kj , j = 3 u33 = a33 l3k u k 3 =

2
4 7
= a33 (l31u13 + l32 u 23 ) = 1 2 + u 33 = 1
7 3
3

[ L]3 x 3

0
0
3 1 2
1

= 1 3
1
0 , [U ]3 x 3 = 0 7 3 7 3
0 0 1
2 3 4 7 1

[L]3x3[U]3x3 (2.1.1).
(2.1.6) (2.1.4).

y1 =

b1 7
= y1 = 7
l11 1

yi =

1
lii

i 1

i lij y j , i = 2,3,..., n
j =1

2 1=1

1
1
1
1
35
i = 2 y2 = b2 l2 j y j = (b2 l21 y1 ) = 14 7 y2 =
l22
1
3
3
j =1

l22

3 1= 2
1
2
1
1

4 35
i = 3 y3 = b3 l3 j y j = [b3 (l31 y1 + l32 y2 )] = 5 7 +
l33
1
7 3
j =1
3
l33

y3 = 3

(2.1.7) (2.1.5).

x3 =

y3 3
=
x3 = 3
u33 1

xi =

1
uii

yi

n =3

u x

j = i +1

ij

, i = 2,1

n =3

1
1
( y2 u23 x3 ) = 3 35 7 3 x2 = 2
i = 2 x2 =
y2 u 2 j x j =
7 3 3
u22
j = 2 + 1= 3
u22

n =3
1
1

[ y1 (u12 x2 + u13 x3 )] = 1 {7 [( 1) 2 + 2 3]} x1 = 1


1
=

i
x
y
u1 j x j =
1

u11
3
j =1+1= 2
u11

22

x1 1
[ x]3 x1 = x2 = 2
x3 3

[]nxn -
[][x]=[b],
[b] [x]
. , aij*
, n

a11 a12 a13 ... a1n a11* a12* a13* ... a1*n 1 0 0 ... 0
*
a

*
*
*
21 a 22 a 23 ... a 2 n a 21 a 22 a 23 ... a 2 n 0 1 0 ... 0
*
*
*
a31 a32 a33 ... a3n a31
a32
a33
... a3*n = 0 0 1 ... 0

... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
*
a n1 a n 2 a n 3 ... a nn a n*1 a n* 2 a n*3 ... a nn
0 0 0 ... 1
3
1
4444244443 14444244443 14442444
[ A ]nxn

1
[ A ]nxn

a11
a
21
a31

...
a n1

a12

a13

a 22
a32
...
an 2

a 23
a33
...
an3

[ I ]nxn

... a1n a11* 1


*
... a 2 n a 21
0
*
... a3n a31 = 0

... ... ... ...
... a nn a n*1 0

... a1n a12* 0


*
... a 2 n a 22
1
*
= 0
... a3n a32

... ... ... ...
a n 2 a n 3 ... a nn a n* 2 0
...........................................................

a11
a
21
a31

...
a n1

a12
a 22
a32
...

a13
a 23
a33
...

a11
a
21
a31

...
a n1

a12
a 22
a32

a13
a 23
a33

...
an2

...
an3

... a1n a1*n 0



... a 2 n a 2*n 0
... a3n a3*n = 0

... ... ... ...
*
... a nn a nn
1

23

(2.1.17)

2.1.2
2.1.1.
(2.1.17)
*
*
*
3 1 2 a12 0
3 1 2 a13 0
3 1 2 a11 1
*
*
*
1

2
3 a 23
2
3 a 22
2
3 a 21
= 0 , 1
= 1 , 1
= 0

*
*
*

2 2 1 a31 0
2 2 1 a32 0
2 2 1 a33 1

Crout 2.1.1.

[ A]

1
3x 3

1
4 / 7 5 / 7

= 1
1
1
6 / 7 4 / 7 1

.


L-U
n

det[ A]nxn = A nxn = u jj

(2.1.18)

j =1

2.1.3
2.1.1

7
A 3 x 3 = 3 (1) = 7
3
Crout FORTRAN 90/95
LUDCMP FORTRAN 90/95.
(8 bytes). - []nxn
(2.1.14-16),
.
(2.1.1) (2.1.16),
.
:
[]NPxNP : [] nxn.
N, NP : n [].

24

[INDX]NP : M ,
(2.1.15) ().
D : 1
.

FORTRAN 90/95
LUBKSB FORTRAN 90/95.
(8 bytes). (2.1.2)
(2.1.3)-(2.1.7). - []nxn
(2.1.16) LUDCMP.
:
[]NPxNP : [] nxn.
N, NP : LUDCMP.
[INDX]NP : LUDCMP.
[B]NP : bi
(2.1.2). , []NP
[x]n, bi .
,
:

: []nxn[x]n = [b]n
A :
.............................
CALL LUDCMP (A,N,NP,INDX,D)
CALL LUBKSB (A,N,NP,INDX,B)
.............................
bi
LUBKSB []n.

: []-1nxn
(2.1.17).
......................................
DIMENSION A(NP,NP),A1(NP,NP),INDX(NP)
......................................
N = NP
DO I=1,N
DO J=1,N
A1(I,J) = 0.00
END DO
A1(I,I) = 1.00
END DO

25

CALL LUDCMP (A,N,NP,INDX,D)


DO 30 J=1,N
CALL LUBKSB (A,N,NP,INDX,A1(1,J))
END DO
................................
- [1]nxn
LUBKSB .

[]nxn
(2.1.18).
...............................
CALL LUDCMP (A,N,NP,INDX,D)
DET = 1.00D+00
DO J=1,N
DET = DET*A(J,J)
END DO
...............................
DET.
LUDCMP LUBKSB.

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

==================================================================
| SUBROUTINE TO PERFORM THE L-U DECOMPOSITION ON A REAL MATRIX
|
|
|
|
CROUT METHOD
|
|
|
| Original routine from the book:
|
|
Numerical Recipes, The Art of Scientific Computing (FORTRAN |
|
Version). By: W.H. Press, et al, 1992 ed.
|
|
|
| FORTRAN 90/95 modification by: M. G. Sfakianakis
|
|
M.G. Sfakianakis, University of Patras, 2001
|
|
|
==================================================================
-----------------------------------------------------------------Variable Description
-------------------[A]NPxNP : Matrix to be decomposed.
NP, N
: Physical matrix dimension, n.
[INDX]NP : Records the row permutation effected by the partial
pivoting.
D
: Output as +1 or 1 depending on whether the number of
row interchanges is even or odd, respectively.
------------------------------------------------------------------

17
!

!
18
!
!
19
!
!

SUBROUTINE LUDCMP (A,N,NP,INDX,D)


IMPLICIT REAL*8 (A-H,O-Z)
PARAMETER (NMAX=10000,TINY=1.00D-20)
DIMENSION A(NP,NP),INDX(NP),VV(NMAX)
D = 1.00D+00
DO 12 I=1,N
AAMAX = 0.00D+00

!
11
!

!
!
12
!
!
!
13
!
14
!
!
!
15
!

!
16
!
!

DO 11 J=1,N
IF (DABS(A(I,J))>AAMAX) AAMAX = DABS(A(I,J))
CONTINUE
IF (AAMAX==0.00D+00) WRITE (*,"(/2(/A)/A,I5)") &
& ' *************** ERROR ***************',
&
& ' SUBROUTINE LUDCMP : Singular Matrix',
&
& '
ROW No. : ',I
IF (AAMAX==0.00) STOP
VV(I)=1.00/AAMAX
CONTINUE
DO 19 J=1,N
DO 14 I=1,J-1
SUM = A(I,J)
DO 13 K=1,I-1
SUM = SUM - A(I,K)*A(K,J)
CONTINUE
A(I,J) = SUM
CONTINUE
AAMAX = 0.00D+00
DO 16 I=J,N
SUM = A(I,J)
DO 15 K=1,J-1
SUM = SUM - A(I,K)*A(K,J)
CONTINUE
A(I,J) = SUM
DUM
= VV(I)*DABS(SUM)
IF (DUM>=AAMAX) THEN
IMAX = I
AAMAX = DUM
ENDIF
CONTINUE
IF (J/=IMAX) THEN

26

DO 17 K=1,N
DUM
= A(IMAX,K)
A(IMAX,K) = A(J,K)
A(J,K)
= DUM
CONTINUE
D
= -D
VV(IMAX) = VV(J)
ENDIF
INDX(J) = IMAX
IF (A(J,J)==0.00) A(J,J) = TINY
IF (J/=N)
THEN
DUM = 1.00/A(J,J)
DO 18 I=J+1,N
A(I,J) = A(I,J)*DUM
CONTINUE
ENDIF
CONTINUE
RETURN
END

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

==================================================================
|
SUBROUTINE TO SOLVE A SET OF N LINEAR EQUATIONS [A][X]=[B]
|
|
WHERE [A] IS IN DECOMPOSED FORM OF THE TYPE L-U
|
|
|
|
CROUT METHOD (continued for system solution)
|
|
|
| Original routine from the book:
|
|
Numerical Recipes, The Art of Scientific Computing (FORTRAN |
|
Version). By: W.H. Press, et al, 1992 ed.
|
|
|
| FORTRAN 90/95 modification by: M. G. Sfakianakis
|
|
M.G. Sfakianakis, University of Patras, 2001
|
|
|
==================================================================

!
11
!

-----------------------------------------------------------------Variable Description
--------------------

12
!

[A]NPxNP : Decomposed matrix [A].


NP, N
: Physical matrix dimension, n.
[INDX]NP : Records the row permutation effected by the partial
pivoting.
[B]NP
: Input as the right-hand side vector [B] and returns
with the solution [X].
------------------------------------------------------------------

!
13
!
14
!

SUBROUTINE LUBKSB (A,N,NP,INDX,B)


IMPLICIT REAL*8 (A-H,O-Z)

DIMENSION A(NP,NP),INDX(NP),B(NP)

II = 0
DO 12 I=1,N
LL
= INDX(I)
SUM
= B(LL)
B(LL) = B(I)
IF (II/=0) THEN
DO 11 J=II,I-1
SUM = SUM - A(I,J)*B(J)
CONTINUE
ELSE IF (SUM/=0.00) THEN
II = I
ENDIF
B(I) = SUM
CONTINUE
DO 14 I=N,1,-1
SUM = B(I)
DO 13 J=I+1,N
SUM = SUM - A(I,J)*B(J)
CONTINUE
B(I) = SUM/A(I,I)
CONTINUE
RETURN
END

2.2 Cholesky
H Cholesky []nxn
.

[ X ]Tnxn [ A]nxn [ X ]n > 0

(2.2.1)

[]n.

1
[ A] nxn [ x] n = [b] n [ x] n = [ A] nxn
[b] n

(2.2.2)

[]nxn
.

[ A] nxn = [ L] nxn [ L]Tnxn

a11
a
21
...

a n1

a12
a 22
...
an2

... a1n l11


... a 2 n l 21
=
... ... ...

... a nn l n1

0
l 22
...
ln2

0 l11 l 21
... 0 0 l 22

... ... ... ...



... l nn 0 0
...

... l n1
... l n 2
... ...

... l nn
(2.2.3)

lij [L]nxn, (2.2.3)


27


l = a
11
= a11
l112
11

l 21 = a12 l11
= a12
l11l 21

......................................
.....................

l n1 = a1n l11
= a1n
l11l n1

2
2
= a 22 l 22 = a 22 l 212
l 21 + l 22
............................
......................................

= a2n
l 21l n1 + l 22 l n 2
l n 2 = (a 2 n l 21l n1 ) l 22

......................................
.................................
2
2
2

n 1
l n1 + l n 2 + ..... + l nn = a nn
l nn = a nn l nj2

j =1

(2.2.4)

(2.2.4)
i 1

l ki =

a ki lij l kj
j =1

l ii

, i = 1,2,....., k 1

(2.2.5)

k 1

l kk = a kk l kj2

(2.2.5)

j =1

(2.2.5) k=1,2,..,n. k >1


(2.2.5) (2.2.5). , k =1, (2.2.5) .
, [L]nxn .
(2.2.5) .
.
, (2.2.3) []nxn

1
[ A] nxn = [ L] nxn [ L]Tnxn [ A] nxn
= [ L] nxn [ L]Tnxn

= [ L]Tnxn

1
1
[ L] nxn
= [ L] nxn

1
[ L] nxn
(2.2.6)

[]nxn
[L]nxn (;). E []nxn
[L]nxn

[ L] nxn [ X ] nxn = [ I ] nxn

l11
l
21
...

l n1

0
l 22
...
ln2

0 x11
... 0 x 21

... ... ...



... l nn x n1
...

28

0
x 22
...
xn 2

0 1
... 0 0
=
... ... ...

... x nn 0
...

0 ... 0
1 ... 0
... ... ...

0 ... 1

(2.2.7)

(2.2.7)
[]nxn, (2.1.17). n
(2.1.4),

x1k =

b1k
l11

i 1

bik l ij x jk , i = 2,3,..., n
j =1

0 , i k
bik =
1 , i = k

xik =

1
l ii

(2.2.8)

(2.2.8) - (2.1.6)
(2.2.7) k =1,2,..,n. O []nxn
(2.2.8). ,
(2.2.8) i=k,k+1,..,n.
(2.2.8)
(2.2.7)

1 l , k = 1
x1k = 11
, k = 2,3,....., n
0

, i = 2,3,..., k 1
0

1
xik = 1 l ij x jk , i = k

l ii j =1

i 1
1 l x , i = k + 1, k + 2,..., n

lii j =1 ij jk
2.2.1
Cholesky

3
4 x1 30
1 2
2 29 36 43 x 340

2 =

3 36 109 126 x3 906

4 43 126 246 x 4 1452


(2.2.5) [L]4x4.
(2.2.5) k = 1 l11 =

a11 = 1 l11 = 1

29

(2.2.9)

a 2i
a
2
, i = 1 l 21 = 21 = l 21 = 2
l ii
l11 1

(2.2.5) k = 2 l 2i =
(2.2.5) k = 2 l 22 =

a 22 l 212 = 29 2 2 l 22 = 5
i 1

(2.2.5) k = 3 l 3i =

a3i lij l 3 j

(2.2.5) k = 3 l33 =

j =1

l ii

a31 3

l 31 = l = 1 l 31 = 3

11
, i = 1,2
l = a32 l 21l 31 = 36 2 3 l = 6
32
32
l 22
5

a33 l 32j = a33 l 312 l 322 = 109 3 2 6 2 l 33 = 8


j =1

i 1

(2.2.5) k = 4 l 4i =

a 4i lij l 4 j
j =1

l ii

, i = 1,2,3

l = a 41 = 4 l = 4
41
41 l11 1

a l l
43 2 4

l 42 = 42 21 41 =
l 42 = 7
5
l 22

a 43 l 3 j l 4 j

a l l l l
126 3 4 6 7
j =1
l =
= 43 31 41 32 42 =
l 43 = 9
43
l 33
l 33
8

(2.2.5) k = 4 l 44 = a 44 l 42 j = a 44 l 412 l 422 l 432 = 246 4 2 7 2 9 2


j =1

l 44 = 10

[ L] 4 x 4

1
2
=
3

0
0
6 8 0

7 9 10
0 0
5 0

(2.2.9) [L]4x4.

k = 1 x11 =

1 1
= x11 = 1
l11 1

30


1
1
2
i = k + 1 = 2 x 21 = l 21 x11 = 2 1 x 21 =
5
5
l 22

1
1
i = k + 2 = 3 x31 = l3 j x j1 = (l31 x11 + l32 x 21 ) =
l33 j =1
l33

1
3

2
k =1
= 3 1 + 6 x31 =
8
40
5

1
1
i = k + 3 = n = 4 x 41 = l 4 j x j1 = (l 41 x11 + l 42 x 21 + l 43 x31 ) =
l
l

44 j =1
44

1
21
2
3

= 4 1 + 7 + 9 x 41 =

10
400
5
40
k = 2 x12 = 0

1
1
1
i = k = 2 x 22 = l [1 l 21 x12 ] = 5 (1 2 0 ) x 22 = 5
22

1 2
1
1
1
1
3
i
k
x
l3 j x j 2 = (l 31 x12 + l32 x 22 ) = 3 0 + 6
=
+
=

32
5
8
l 33 j =1
l 33

3
k =2
x32 =
20

1 3
1
i = k + 2 = n = 4 x 42 = l l 4 j x j 2 = l (l 41 x12 + l 42 x 22 + l 43 x32 ) =
44 j =1
44

1
1
1
3
= 4 0 + 7 + 9 x 42 =

10
5
200
20

k = 3 x13 = 0

i = 2 x = 0
23

1
1
(1 l31 x13 l32 x23 ) = 1 (1 3 0 6 0)

1
i = k = 3 x33 =
l3 j x j 3 =
l 33 j =1
8
l33

1
x33 =
k =3
8

1 3
1
i = k + 1 = n = 4 x 43 = l 4 j x j 3 = (l 41 x13 + l 42 x 23 + l 43 x33 ) =
l 44 j =1
l 44

1
1
9

= 4 0 + 7 0 + 9 x 43 =

10
8
80
k = 4 x14 = 0

31

i = 2 x 24 = 0
i = 3 x = 0
34

k = 4 i = k = 4 x 44 = 1 1 l 4 j x j 4 = 1 (1 l 41 x14 l 42 x 24 l 43 x34 ) =
l 44 j =1

l 44

1
1

= (1 4 0 7 0 9 0 ) x 44 =

10
10

[ L] 41x 4 = [ X ] 4 x 4

1
0
0
0

2 5
15
0
0

=
3 40 3 20
18
0

21 400 1 200 9 80 1 10

(2.2.9) []4x4

[ A] 41x 4 = [ L] 41x 4

[ L] 41x 4

[ A] 41x 4

1
0
0
0
1 2 5 3 40 21 400

0
15
0
0
1 5 3 20
1 200 2 5

.
=
0
18
0
0
18
9 80 3 40 3 20

0
0
1 10 21 400 1 200 9 80 1 10
0

186941 160000 5479 80000 111 32000 21 4000


5479 80000
2501 40000 291 16000
1 2000
=
111 32000
181 6400
291 16000
9 800

1 10 0
21 400 0
1 200 0
9 80 0

x1
30 186941 160000 5479 80000 111 32000 21 4000 30
x

2501 40000 291 16000


1 2000 340
2 = [ A] 1 340 = 5479 80000

4x4
x3
906 111 32000
181 6400
291 16000
9 800 906

1 10 0 1452
21 400 0
1 200 0
9 80 0
1452
x4
x1 1
x 2
2 =
x3 3

x 4 4

32

2.3 krylov

, , ..: A = [ A]
H Krylov

[]nxn,

a11

a 21
~ ~
~
~
~ ~
A X = X A I X = 0
~
~
A I = a31
X 0
..........
a n1

a12
a 22
a32

a13

...

a1n

a 23
...
a33 ...

a2n
a3n

=0

........... ........... ... ............


an2

a n3

... a nn
(2.3.1)

Krylov
(2.3.1) -

P ( ) = p n n + p n 1n 1 + p n 2 n 2 + ..... + p 2 2 + p1 + p 0 = 0 , p n = 1

(2.3.2)

pi aij [A]nxn
, , Leverrier.

B Cayley-Hamilton , A ,
.

~
~
~
~
~
~
P ( A) = A n + p n 1 A n 1 + p n 2 A n 2 + ..... + p 2 A 2 + p1 A + p 0 = 0

(2.3.3)

Y ( 0 )

~
Y ( 0)

y1( 0 )
(0)
y
= 2 0
.....
(0)
y n

(2.3.4)

(2.3.3) Y ( 0 )

~ ~
~
~
~ ~
~ ~
~
~
~
A n Y ( 0 ) + p n 1 A n 1 Y ( 0 ) + p n 2 A n 2 Y ( 0 ) + ..... + p 2 A 2 Y ( 0 ) + p1 A Y ( 0 ) + p 0Y ( 0) = 0 (2.3.5)

, Y ( k )

33

~ ~
~
Y ( k ) = A k Y ( 0 ) , k = 1,2,....., n

(2.3.6)

, Y ( k ) Y ( 0 ) A
k- .
(2.3.6) (2.3.5)

~
~
~
~
~
~
Y ( n ) + p n 1Y ( n 1) + p n 2Y ( n 2) + ..... + p 2Y ( 2 ) + p1Y (1) + p 0Y ( 0 ) = 0
~
~
~
~
~
~
p n 1Y ( n 1) + p n 2Y ( n 2 ) + ..... + p 2Y ( 2 ) + p1Y (1) + p 0Y ( 0 ) = Y ( n )

(2.3.7)

(2.3.7) Y ( m ) , m=0,1,2,..,n

y1( n 1)
( n 1)
y2
y 3( n 1)

........
y ( n 1)
n

y1( n 2 )
y 2( n 2 )
y 3( n 2 )
........
y n( n 2 )

y1( n )
... y1( 0 ) p n 1

(n)

... y 2( 0 ) p n 2
y2
(0)

... y 3 p n 3 = y 3( n )

........ ... ...... .....


.....
y (n)
y n( n 3) ... y n( 0 ) p 0
n
y1( n 3)
y 2( n 3)
y 3( n 3)

(2.3.8)

pm , m=0,1,2,..,n-1
(2.3.2). (2.3.8)

Y ( k ) (2.3.6).

A , o () . ,
(2.3.8) ,
pm . ,

- - Y ( 0 ) .
,
Krylov
Leverrier.

Krylov
Krylov
(2.3.9) (2.3.10).

(2.3.6) k

~
k = 1 Y (1)
~ ~
~
~
k = 2 Y ( 2) = A 2 Y ( 0) = A
~ ~
~
~
k = 3 Y ( 3) = A 3 Y ( 0 ) = A

(A~ Y~ )
(A~ A~ Y~ )

34

(0)

(0)

~ ~
= A Y ( 0)
~ ~
= A Y (1)
~ ~
= A Y ( 2)

(2.3.9)

...................................................................................................
~ ~
~ ~ ~
~ ~ ~ ~
~
k = k Y ( k ) = A k Y ( 0 ) = A 1
A 4
A
4
4
3
A Y ( 0 ) = A Y ( k 1)
42
k 1

(2.3.9)

(2.3.1) i

~
X (i ) i=1,2,..,n,

~ ~
A X (i )
~ ~
A 2 X (i ) = i
~ ~
A3 X (i ) = i2

(A~ X~ ) = X~
(A~ X~ ) = X~
(i )

(i )

i i

(i )

2
i i

(i )

~
= i X ( i )
~
= i2 X (i )
~
= 3i X (i )

(2.3.10)

..................................................................
~ ~
~ ~
~
~
A k X (i ) = ki 1 A X (i ) = ki 1i X (i ) = ki X ( i )

X ( m ) , m=1,2,..,n n

(2.3.1), , Y ( 0 ) Krylov,
.

Y ( 0)

~
~
~
~
~
Y ( 0 ) = c1 X (1) + c 2 X ( 2) + ..... + c n 1 X ( n 1) + c n X ( n )

(2.3.11)

ci, i=1,2,..,n
(2.3.11).

(2.3.11) A

~ ~
~ ~
~ ~
~ ~
~ ~
A Y ( 0 ) = c1 A X (1) + c 2 A X ( 2 ) + ..... + c n 1 A X ( n 1) + c n A X ( n )

(2.3.12)

(2.3.9) (2.3.10) (2.3.12)

~
~
~
~
~
Y (1) = c11 X (1) + c22 X ( 2) + ..... + cn 1n 1 X ( n 1) + cnn X ( n )

(2.3.11)

, (2.3.11) A
(2.3.9) (2.3.10)

~ ~
~ ~
~ ~
~ ~
~ ~
A Y (1) = c11 A X (1) + c 2 2 A X ( 2) + ..... + cn 1 n 1 A X ( n 1) + c n n A X ( n )

~
~
~
~
~
Y ( 2) = c112 X (1) + c2 22 X ( 2) + ..... + cn12n1 X ( n1) + cn 2n X ( n )
~

(2.3.11)

Y ( m ) , m < n-1,

A , n-1

35

~
~
~
~
~
Y ( n1) = c11n1 X (1) + c2 n21 X ( 2) + ..... + cn1nn11 X ( n1) + cn nn1 X ( n )

(2.3.11)

1 ( ) = n 1 + q n 2,1n 2 + q n 3,1n 3 + ..... + q 2,12 + q1,1 + q 0,1


2 ( ) = n 1 + q n 2, 2 n 2 + q n 3, 2 n 3 + ..... + q 2, 2 2 + q1, 2 + q0, 2

(2.3.13)

....................................................................................................

n ( ) = n 1 + q n 2,n n 2 + q n 3,n n 3 + ..... + q 2,n 2 + q1,n + q0,n


i ( ) = n 1 + q n 2,i n 2 + q n 3,i n 3 + ..... + q 2,i 2 + q1,i + q 0,i , i = 1,2,....., n


~

(2.3.13)

L Y ( m ) q m ,i
(2.3.13) m=n-1,n-2,..,2,1,0 q n 1,i = 1

~ ~
~
~
~
~
~
L = Y ( n 1) + q n 2,i Y ( n 2 ) + q n 3,i Y ( n 3) + ..... + q 2,i Y ( 2 ) + q1,i Y (1) + q 0,i Y ( 0 )
,

(2.3.14)

(2.3.14)

~
Y ( m ) ,

m=n-1,n-2,..,2,1,0, (2.3.11)

~ ~
~
~
~
~
~
L = Y ( n 1) + qn 2,iY ( n 2 ) + qn 3,iY ( n 3) + ..... + q2,iY ( 2 ) + q1,iY (1) + q0,iY ( 0 ) =
~
~
~
~
= c1i (1 ) X (1) + c2i (2 ) X ( 2 ) + ..... + cn 1i (n 1 ) X ( n 1) + cni (n ) X ( n )

(2.3.15)

i ( )

i ( ) =

P ( )
, i = 1,2,....., n
i

(2.3.16)

P() (2.3.2),

i ( j ) = 0 , j i

(2.3.16)

P( ) = ( i ) i ( ) = i ( ) i i ( )
P ( ) = i ( ) + i( ) i i( ) = i ( ) + ( i ) i( )
P (i ) = i (i ) + (i i ) i( )

i (i ) = P (i )

36

(2.3.16)

(2.3.16,) (2.3.15)

~ ~
~
~
~
~
~
~
L = Y ( n 1) + q n 2,i Y ( n 2) + q n 3,i Y ( n 3) + ..... + q 2,i Y ( 2 ) + q1,i Y (1) + q 0,i Y ( 0) = ci i (i ) X (i )
~
ci X ( i ) =

1
~
~
~
~
~
~
Y ( n 1) + q n 2,i Y ( n 2 ) + q n 3,i Y ( n 3) + ..... + q 2,i Y ( 2) + q1,i Y (1) + q 0,i Y ( 0)

P ( i )

] (2.3.17)

i = 1,2,....., n
~

, X ( i ) i
(2.3.17) ci.

Y ( m ) , m=n-1,n-2,,2,1,0, (2.3.6)
(2.3.9), P (i )
(2.3.2) =i.
qm,i m=n-2,n-3,,2,1,0 i=1,2,,n.
(2.3.16) (2.3.2) (2.3.13)

P ( ) = ( i )i ( ) n + pn 1n 1 + pn 2n 2 + ..... + p22 + p1 + p0 =

= ( i ) n 1 + qn 2,i n 2 + qn 3,i n 3 + ..... + q2,i 2 + q1,i + q0,i =


= .................................................................................................. =
= n + (qn 2,i i )n 1 + (qn 3,i i qn 2,i )n 2 + ..... + (q1,i i q2,i )2 +
14243
1442443
14243
p n 1

p n2

p2

+ (q0,i i q1,i ) i q0,i


14243 123
p1

p0

p0 = i q0,i

q0,i = i q1,i + p1

p1 = q0,i i q1,i

p = q q
2
1, i
i 2, i
q1,i = i q2,i + p2

................................. ....................................................

pn 2 = qn 3,i i qn 2,i qn 3,i = i qn 2,i + pn 2


qn 2,i = i qn 1,i + pn 1 , qn 1,i = 1


pn 1 = qn 2,i i

q k ,i = i q k +1,i + p k +1

k = (n 2), (n 3),.....,2,1,0
q
n 1,i = 1

(2.3.18)

, qm,i , m=n-2,n-3,,2,1,0
(2.3.18) i, i=1,2,..,n.

37

ci X ( i ) (2.3.17)
.
1.

(c x ) + (c x ) + ..... + (c x ) + (c x )
= c (x ) + (x ) + ..... + (x ) + (x )

~
ci X ( i ) =

(i ) 2
i 1

(i ) 2
1

(i ) 2
2

(i ) 2
2

(i ) 2
n 1

(i ) 2
n 1

(i ) 2
n

(2.3.19)

(i ) 2
n

x1(i )
ci x1(i )
(i )
(i )
x2
1
1
~ (i )

c i x 2
=
=
c X =
~ (i )
..... c X~ (i ) i
.......
ci X
i
(i )
(i )
x n
ci x n

~
X (i )

(2.3.20)

2. , ,
+1.

[
[

]
]

(i )
(i )
(i )
(i )
x max
, x max
x min
= max x1(i ) , x 2(i ) ,....., x n(i)1 , x n(i )
x max

(i )
x abs ,max = (i )
(i )
(i )
(i )
= min x1(i ) , x 2(i ) ,....., x n(i)1 , x n(i )
x min
x min , x max x min

(2.3.21)

x1(i )
(i )
x
1
1
~
= 2 = (i )
ci X ( i ) = ( i )
..... x abs ,max
x abs ,max
(i )
x n

~
X (i )

ci x1(i )
(i )
cx
i 2
.......
(i )
ci x n

(2.3.22)

(2.3.20) (2.3.22)

ci ci X ( i ) ,
(2.3.17), .


~
Anxn , -

[~

X ( k ) , X ( m ) , k m 1 (k,m) n, n ,

(X~ )

(k ) T

~
X (m) = 0 , k m , 1 k n , 1 m n

38

(2.3.23)


(m,n). (2.3.23)

(2.3.17).
2.3.1
Krylov

A4 x 4
(2.3.1).

~
A4 x 4

1
2
=
3

2 3 4
1 2 3
2 1 2

3 2 1

(2.3.4)

~
Y (0)

1
0
=
0

0

(2.3.9)

~ ~
~
Y (1) = A Y ( 0 )

1
2
=
3

2
1
2
3

3
2
1
2

4 1 1
3 0 2

=
2 0 3

1 0 4

1
2
=
3

2
1
2
3

3
2
1
2

4 1 30
3 2 22
=

2 3 18

1 4 20

~ ~
~
Y ( 3) = A Y ( 2 )

1
2
=
3

2
1
2
3

3
2
1
2

4 30 208
1
2

3 22 178
~ ~
~
, Y ( 4 ) = A Y ( 3) =
=

3
2 18 192


1 20 242
4

2
1
2
3

3
2
1
2

4 208 2108
3 178 1704
=

2 192 1656



1 242 1992

~ ~
~
, Y ( 2 ) = A Y (1)

(2.3.8)

208
178

192

242

30
22
18
20

1
2
3
4

1 p3
2108

1704
0 p 2

=
1656
0 p1

0 p 0
1992

39

p3 = 4 , p 2 = 40 , p1 = 56 , p 0 = 20
, - (2.3.2)

P ( ) = 4 43 402 56 20 = 0
(.. Bairstow)
-

1 = 9.099019 , 2 = 0.585786 , 3 = 1.099019 , 4 = 3.414213


(2.3.18) q. i=1,
1,

k = n 1 = 4 1 = 3

q3,1 = 1

k = n2 = 42 = 2

q 2,1 = 1 q3,1 + p3 = 9.099019 1 + (4) = 5.099019

k = n 3 = 43=1

q1,1 = 1 q 2,1 + p 2 = 9.099019 5.09902 + (40) = 6.396078

k = n4= 44= 0

q 0,1 = 1 q1,1 + p1 = 9.099019 6.396078 + (56) = 2.138039

P ( ) = 43 122 80 56 P (1 = 9.099019) = 1235.881984


~

c1 X (1) (2.3.17)

~
c1 X (1) =

1
~
~
~
~
Y (3) + q 2,1Y ( 2) + q1,1Y (1) + q 0,1Y ( 0) =
P (1 )

1235.881984

208
30
1
1
178
22
2

+ 5.099019 + 6.396078 + 2.138039 0


192
18
3
0




242
20
4
0

0.299029

0.245145
=

0.245145
0.299029

i=1 i=2,3,4

~
c2 X ( 2)

0.073223
0.200971
0.426777
0.176777
0.245145

~ ( 4 ) 0.176777
~ ( 3)

=
, c4 X =
, c3 X =
0.176777
0.245145
0.176777

0.073223
0.200971
0.426777

40

ci X ( i ) ,
(2.3.19) (2.3.10)

~
X (1)

0.546835
0.270598
0.448298
0.653281
0.448298
0.653281
0.546835

, X~ ( 2) =
, X~ (3) =
, X~ ( 4) = 0.270598
=
0.448298
0.653281
0.546835
0.270598

0.546835
0.270598
0.448298
0.653281

, (2.3.21) (2.3.22)

~
X (1)

1
1

0.414214
0.819804

0.819804

1
1
~ ( 4 ) 0.414214
~ ( 3)
~ ( 2)

=
, X =
, X =
, X =
0.819804

0.414214
1
1

1
1

0.414214
0.819804

, A4 x 4

(2.3.23) . .., X ( 2 ) X ( 4)

(X~ )

( 2) T

~
X ( 4)

0.414214
=0
= [ 0.414214 1 1 0.414214]
0.414214

,
.

FORTRAN 90/95
FORTRAN 90/95
(2.3.1).
(8 bytes).

EIGENR
:
() Leverrier .
LEVERRIER (. ),
() Bairstow - .
BAIRSTOW. E
BAIRSTOW |1|< |2|< .....< |n|, SORTR
,

41

() Krylov.
KRYLOV (. ). EIGENR KRYLOV
Krylov.
:

~
N : n A
nxn .
~
[]Nx : A
nxn (2.3.1).
[L]N : n 1, 2, ..., n.
[0]N : - Y~ ( 0 ) Krylov.

~ (i )
[]Nx : nxn X
.
.
, , ...

~
~ ~
TOLLX : << : A
I X <
KSOLVEL : 0 1
, .
KSOLVE : 0 1

, X ( i ) .
KODLX : , :
1=

2= ci X ( i )

3= X (i )
.

4= X (i )
.
IPRINTLX : K , :
0=
1=

2= ci X ( i )

3= X ( i )
.

4= X ( i )
.

42

P, Q, TOLPQRS, TOLDETS, TOLDETR, TOLC, TOLFX, NITMAX,


NCYCMAX, ISORT, IPRINT1, IPRINT2 BAIRSTOW.
EIGENR.
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

==================================================================
|
SUBROUTINE TO FIND ALL REAL EIGENVALUES & EIGENVECTORS
|
|
OF A REAL MATRIX [A]nxn
|
|
|
| 1. Characteristic Polynomial by the Leverrier Method
|
| 2. Eigenvalues (roots) of the Characteristic Polynomial by the |
|
Bairstow Method
|
| 3. Eigenvectors by the Krylov Method
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================
-----------------------------------------------------------------Variable Description
-------------------N
[A]nxn
[L]n
[Y0]n
[X]nxn

:
:
:
:
:

TOLLX
KSOLVEL

:
:

KSOLVEX

KODLX

IPRINTLX

Matrix [A] dimension, n.


Matrix [A]nxn
Eigenvalues 1,2,.....,n.
Inital guess of vector y0 of Krylov's Method.
Eigenvectors. 1st column is the eigenvector of 1,
2nd column is the eigenvector of 2, etc.
Tolerance to check if [A-I][X]<=. Same as TOLFX.
Solution code for Eigenvalues
(0=Not Very Good Solution, 1=Excellent Solution)
Same as KSOLVE
Solution code for Eigenvectors
(0=Not Very Good Solution, 1=Excellent Solution)
Computation code
(1=only eigenvalues,
2=eigenvalues & non-normalized eigenvectors
3=eigenvalues & normalized eigenvectors by length
4=eigenvalues & normalized eigenvectors by unity)
Print out code
(0=no print at all,
1=only eigenvalues,
2=eigenvalues & non-normalized eigenvectors
3=eigenvalues & normalized eigenvectors by length
4=eigenvalues & normalized eigenvectors by unity)

............................................................
All the following variables are those of the Bairstow Method
............................................................
P
Q
TOLPQRS
TOLDETS
TOLDETR
TOLC
TOLFX
NITMAX
NCYCMAX
ISORT

: Initial estimation for p.


: Initial estimation for q.
: Tolerance to check if |p|<= & |q|<= , or, if
|R|<= & |S|<= .
: Tolerance to check if system determinant |a| <= .
: Tolerance to check if determinant |p**2-4q| <= .
: Tolerance to check for y+zi if |z|<= .
: Tolerance to check if |f()|<= .
: Max. permissible no. of iterations within a solytion
cycle.
: Max. permissible no. of solution cycles.
: Code for sorting (1=ascending order, 2=descending
order).

!
!
!
!
!
!

IPRINT1

: Print code for printing intermidiate results


(0=No print, -1=partial print, 1=full print).
: Print code for printing final results
(0=No print, 1=print).
-----------------------------------------------------------------IPRINT2

&
&

SUBROUTINE EIGENR (N,A,L,Y0,X,KSOLVEL,KSOLVEX,KODLX,IPRINTLX, &


P,Q,TOLPQRS,TOLDETS,TOLDETR,TOLC,TOLFX,
&
NITMAX,NCYCMAX,ISORT,IPRINT1,IPRINT2)
IMPLICIT REAL*8 (A-H,O-Z)
REAL*8 A(N,N),L(N),X(N,N),Y0(N),INDX(N),XIM(N),FL(N),FXIM(N)
REAL*8, ALLOCATABLE :: CPOL(:)

!
!
!
!
!
!

-----------------------------------------------------------------1. COMPUTE THE CHARACTERISTIC POLYNOMIAL COEFFICIENTS BY THE


LEVERRIER METHOD
-----------------------------------------------------------------ALLOCATE (CPOL(0:N))

CALL LEVERRIER (N,A,CPOL)

!
!
!
!
!
!

-----------------------------------------------------------------2. COMPUTE EIGENVALUES AS ROOTS OF THE CHARACTERISTIC POLYNOMIAL


BY THE BAIRSTOW METHOD. PRINT EIGENVALUES, IF REQUIRED.
-----------------------------------------------------------------&
&

CALL BAIRSTOW (N,CPOL,P,Q,TOLPQRS,TOLDETS,TOLDETR,TOLC,


&
TOLFX,NITMAX,NCYCMAX,ISORT,IPRINT1,IPRINT2, &
NREAL,NCOMPL,L,XIM,FL,FXIM,KSOLVE)
IF (DABS(L(1))<=DABS(L(N))) CALL SORTR (L,FL,N,1)

KSOLVEL = KSOLVE
!
!

&

IF (KSOLVEL==0) WRITE (*,"(/


&
'***** Not very good Eigenvalues *****'/)")
IF (IPRINTLX>0) CALL EIGOUT (N,L,X,1)

!
!
!
!
!
!
!

IF (KODLX==1) RETURN
-----------------------------------------------------------------3. COMPUTE EIGENVECTORS BY THE KRYLOV METHOD
-----------------------------------------------------------------TOLLX = TOLFX
CALL KRYLOV (N,A,L,CPOL,Y0,X,TOLLX,KSOLVEX,KODLX,IPRINTLX)

!
DEALLOCATE (CPOL)
!

RETURN
END

LEVERRIER
EIGENR
Leverrier.
, LUDCMP LUBKSB
.
:

~
N : n A
nxn .
~
[]Nx : A
nxn (2.3.1).
[CPOL]0:N : n p0, p1, p2, , pn
.
LEVERRIER.

43

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

==================================================================
| SUBROUTINE TO COMPUTE CHARACTERISTIC POLYNOMIAL COEFFICIENTS |
|
OF A REAL MATRIX [A]nxn
|
|
|
|
Leverrier Method
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================
-----------------------------------------------------------------Variable Description
-------------------N
[A]nxn
[CPOL]0:n

: Matrix [A] dimension, n.


: Matrix [A]nxn
: Polynomial coefficients c0,c1,c2,...,cn-1,cn.

!
!
!
!
!
!

-----------------------------------------------------------------COMPUTE k=1,2,...,n-1 POWERS OF [A] & STORE Tr[A]**k


------------------------------------------------------------------

-----------------------------------------------------------------FORM LEVERRIER'S SYSTEM


------------------------------------------------------------------

DO I=1,N
DO J=1,N
S2(I,J) = 0.00D+00
IF (I==J) S2(I,J) = I
END DO
END DO

!
DO J=1,N-1
DO I=J+1,N
S2(I,J) = S(I-J)
END DO
END DO
!

ALLOCATE (S(N),ANEW(N,N),APREV(N,N))
DO I=1,N
DO J=1,N
ANEW(I,J) = A(I,J)
END DO
END DO

!
!
!
!
!

DO M=1,N

DO I=1,N
S(I) = -S(I)
END DO
-----------------------------------------------------------------SOLVE LEVERRIER'S SYSTEM
-----------------------------------------------------------------NP = N

!
IF (M==1) GO TO 10
DO I=1,N
DO J=1,N
ANEW(I,J) = 0.00D+00
DO K=1,N
ANEW(I,J) = ANEW(I,J) + APREV(I,K)*A(K,J)
END DO
END DO
END DO
!
10

END DO

DEALLOCATE (ANEW,APREV)
ALLOCATE
(S2(N,N))
!

SUBROUTINE LEVERRIER (N,A,CPOL)


IMPLICIT REAL*8 (A-H,O-Z)
REAL*8 A(N,N),INDX(N),CPOL(0:N)
REAL*8, ALLOCATABLE :: S(:),APREV(:,:),ANEW(:,:),S2(:,:)

!
!
!
!
!

DO I=1,N
DO J=1,N
APREV(I,J) = ANEW(I,J)
END DO
END DO

CALL LUDCMP (S2,N,NP,INDX,DET)


CALL LUBKSB (S2,N,NP,INDX,S)
DEALLOCATE (S2)

!
DO I=N,0,-1
IF (I==N) CPOL(I) = 1.00D+00
IF (I<N) CPOL(I) = S(N-I)
END DO
!
DEALLOCATE (S)

S(M) = 0.00D+00
DO I=1,N
S(M) = S(M) + ANEW(I,I)
END DO

!
RETURN
END
!

KRYLOV EIGOUT
KRYLOV EIGENR

Anxn Krylov.
, EIGOUT - L
.
: N, A, L, CPOL, Y0, X, TOLLX,
KSOLVEX, KODLX, IPRINTLX EIGENR
LEVERRIER.
KRYLOV EIGOUT.

44

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

==================================================================
|
SUBROUTINE TO FIND ALL REAL EIGENVECTORS OF A REAL MATRIX
|
|
[A]nxn
|
|
|
|
Eigenvectors by the Krylov Method
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================
-----------------------------------------------------------------Variable Description
-------------------N
[A]nxn
[L]n
[CPOL]n

:
:
:
:

Matrix [A] dimension, n.


Matrix [A]nxn
Eigenvalues 1,2,.....,n.
Characteristic Polynomial coefficients
p0,p1,p2,...,pn-1,pn.
[Y0]n
: Inital guess of vector y0 of Krylov's Method.
[X]nxn
: Eigenvectors. 1st column is the eigenvector of 1,
2nd column is the eigenvector of 2, etc.
TOLLX
: Tolerance to check if [A-I][X]<=.
KSOLVEX
: Solution code (0=Not Very Good Solution, 1=Excellent
Solution)
KODLX
: Computation code
(2=non-normalized eigenvectors
3=normalized eigenvectors by length
4=normalized eigenvectors by unity)
IPRINTLX
: Print out code
(0=no print at all,
1=only eigenvalues,
2=eigenvalues & non-normalized eigenvectors
3=eigenvalues & normalized eigenvectors by length
4=eigenvalues & normalized eigenvectors by unity)
------------------------------------------------------------------

!
!
!
!
!

-----------------------------------------------------------------3. COMPUTE EIGENVECTORS ci(i)


-----------------------------------------------------------------DO J=1,N
X(J,I) = 0.00D+00
DO K=N-1,0,-1
X(J,I) = X(J,I) + QPOL(K)*Y(J,K)
END DO
X(J,I) = X(J,I)/FI
IF (DABS(X(J,I))<=1.00D-10) X(J,I) = 0.00D+00
END DO

!
!
!
!
!

-----------------------------------------------------------------PROCEED TO COMPUTATION OF THE NEXT EIGENVECTOR X(i)


-----------------------------------------------------------------END DO

DEALLOCATE (QPOL,Y)

!
!
!
!
!

-----------------------------------------------------------------NORMALIZE EIGENVECTORS
-----------------------------------------------------------------GO TO (10,20,30), KODLX-1

!
20

DO J=1,N
LENGTH = 0.00D+00
DO I=1,N
LENGTH = LENGTH + (X(I,J)**2)
END DO
LENGTH = DSQRT(LENGTH)
DO I=1,N
IF (LENGTH/=0.00) X(I,J) = X(I,J)/LENGTH
END DO
END DO
GO TO 10

SUBROUTINE KRYLOV (N,A,L,CPOL,Y0,X,TOLLX,KSOLVEX,KODLX,IPRINTLX)


!

!
!
!
!
!
!

IMPLICIT REAL*8 (A-H,O-Z)


REAL*8 A(N,N),L(N),X(N,N),Y0(N),CPOL(0:N),LENGTH
REAL*8, ALLOCATABLE :: Y(:,:),APREV(:,:),ANEW(:,:),QPOL(:)
CHARACTER*50, ALLOCATABLE :: COMM(:)
CHARACTER*50 TEMP

ALLOCATE (ANEW(N,N),APREV(N,N),Y(N,0:N-1))
DO I=1,N
DO J=1,N
ANEW(I,J) = A(I,J)
END DO
Y(I,0) = Y0(I)
END DO

!
100

DO M=1,N-1
IF (M==1) GO TO 100
DO I=1,N
DO J=1,N
ANEW(I,J) = 0.00D+00
DO K=1,N
ANEW(I,J) = ANEW(I,J) + APREV(I,K)*A(K,J)
END DO
END DO
END DO
DO I=1,N
Y(I,M) = 0.00D+00
DO J=1,N
Y(I,M) = Y(I,M) + ANEW(I,J)*Y0(J)
END DO
END DO
DO I=1,N
DO J=1,N
APREV(I,J) = ANEW(I,J)
END DO
END DO

!
!
!
!
!
!
!
!
!
!
!
!
!

END DO

!
!
!
!
!
10
!
!
!
!
!

CALL EIGOUT (N,L,X,IPRINTLX)


-----------------------------------------------------------------CHECK IF [Xi] /= 0.00D+00
-----------------------------------------------------------------WRITE (*,*)
IVEC = 1
DO J=1,N
SUM = 0.00D+00
DO I=1,N
SUM = SUM + DABS(X(I,J))
END DO
IF (DABS(SUM)<=1.00D-08) IVEC = 0
IF (DABS(SUM)<=1.00D-08)
&
&
WRITE (*,"('***** WARNING: Eigenvector No.: ',I10, &
&
' has almost zero components')") J
END DO

!
!
!
!
!
!
!

-----------------------------------------------------------------START COMPUTING EIGENVECTORS X(i)


-----------------------------------------------------------------ALLOCATE (QPOL(0:N-1))
DO I=1,N
-----------------------------------------------------------------1. COMPUTE i(i) = P'(i)
------------------------------------------------------------------

-----------------------------------------------------------------PRINT EIGENVECTORS ci[Xi] OR [Xi]


------------------------------------------------------------------

DEALLOCATE (ANEW,APREV)

FI = 0.00D+00
DO J=N,2,-1
FI = FI + J*CPOL(J)*(L(I)**(J-1))
END DO
FI = FI + CPOL(1)
!
!
!
!
!

DO J=1,N
AMAX = -1.00D+99
DO I=1,N
AMAX = DMAX1(AMAX,DABS(X(I,J)))
IF (AMAX==DABS(X(I,J))) INDEX = I
END DO
AMAX = X(INDEX,J)
DO I=1,N
IF (AMAX/=0.00) X(I,J) = X(I,J)/AMAX
END DO
END DO

-----------------------------------------------------------------COMPUTE k=1,2,...,n-1 POWERS OF [A]**k & VECTORS (k) OF KRYLOV'S


METHOD
------------------------------------------------------------------

!
30

&

IF (IVEC==0)
&
WRITE (*,"(/'***** Try another initial vector y(0)')")
-----------------------------------------------------------------CHECK SOLUTION [A-iI][Xi] <=
-----------------------------------------------------------------WRITE (*,*)

IERR = 0
DO K=1,N
KSOLVEX = 1
DO I=1,N
SUM = 0.00D+00
DO J=1,N
SUM = SUM + A(I,J)*X(J,K)
END DO
DIF = SUM - L(K)*X(I,K)
IF (DABS(DIF)>TOLLX) KSOLVEX = 0
END DO
IF (KSOLVEX==0) IERR = IERR + 1
IF (KSOLVEX==0)
&
&
WRITE (*,"('***** ERROR: Wrong Eigenvector No.: ',I10)") K
END DO
KSOLVEX = 1
IF (IERR/=0) KSOLVEX = 0

!
&

IF (KSOLVEX==0) WRITE (*,"(/


&
'***** Not very good Eigenvectors *****'/)")

!
-----------------------------------------------------------------2. COMPUTE COEFFICIENTS qi OF POLYNOMIAL i()
------------------------------------------------------------------

RETURN
END
!

QPOL(N-1) = 1.00D+00
DO J=N-2,0,-1
QPOL(J) = L(I)*QPOL(J+1) + CPOL(J+1)
END DO

45

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

==================================================================
|
SUBROUTINE TO PRINT ALL REAL EIGENVALUES & EIGENVECTORS OF
|
|
A REAL MATRIX [A]nxn
|
|
|
|
Called by Subroutines: EIGENR & KRYLOV
|
|
|
|
Developed by M. G. Sfakianakis
|
|
University of Patras, 2001
|
|
|
==================================================================

DO I=1,N5
!

&
&

Matrix [A] dimension, n.


Matrix [A]nxn
Eigenvalues 1,2,.....,n.
Eigenvectors. 1st column is the eigenvector of 1,
2nd column is the eigenvector of 2, etc.
------------------------------------------------------------------

:
:
:
:

DO J=K5-5+1,K5
IF (IPRINTLX==2)
&
WRITE (TEMP,'(A1,I10,A2,I10,A1)') 'c',J,'[X',J,']'
IF (IPRINTLX>=3)
&
WRITE (TEMP,'(A2,I10,A1)') '[X',J,']'
NCHAR = LEN_TRIM(TEMP)
NCHR = 0
DO K=1,NCHAR
IF (TEMP(K:K)/=' ') NCHR = NCHR + 1
IF (TEMP(K:K)/=' ') COMM(J)(NCHR:NCHR) = TEMP(K:K)
END DO
COMM(J)(NCHR+1:NCHAR) = ' '
END DO

!
SUBROUTINE EIGOUT (N,L,X,IPRINTLX)

IMPLICIT REAL*8 (A-H,O-Z)


REAL*8 L(N),X(N,N)
CHARACTER*50, ALLOCATABLE :: COMM(:)
CHARACTER*50 TEMP

IF (IPRINTLX==0) RETURN
IF (IPRINTLX>1) GO TO 10
!
!
!
!
!

WRITE (*,"(/'
n',3X,5(A12,2X))") (COMM(J),J=K5-5+1,K5)
WRITE (*,"('-----',3X,5(A12,2X))") ('------------',J=K5-5+1,K5)
!

DO J=5*N5+1,N
IF (IPRINTLX==2)
&
WRITE (TEMP,'(A1,I10,A2,I10,A1)') 'c',J,'[X',J,']'
IF (IPRINTLX>=3)
&
&
WRITE (TEMP,'(A2,I10,A1)') '[X',J,']'
NCHAR = LEN_TRIM(TEMP)
NCHR = 0
DO K=1,NCHAR
IF (TEMP(K:K)/=' ') NCHR = NCHR + 1
IF (TEMP(K:K)/=' ') COMM(J)(NCHR:NCHR) = TEMP(K:K)
END DO
COMM(J)(NCHR+1:NCHAR) = ' '
END DO
&

!
IF (IPRINTLX==1) RETURN
!

IF (IPRINTLX==2)
&
WRITE (*,"(/76(1H=)/'NON-NORMALIZED EIGENVECTORS c[X]'/ &
76(1H=))")
IF (IPRINTLX==3)
&
WRITE (*,"(/76(1H=)/'NORMALIZED EIGENVECTORS [X] BY LENGTH'/ &
&
76(1H=))")
IF (IPRINTLX==4)
&
WRITE (*,"(/76(1H=)/'NORMALIZED EIGENVECTORS [X] BY UNITY'/ &
&
76(1H=))")

WRITE (*,"(/'
n',3X,5(A12,2X))") (COMM(J),J=5*N5+1,N)
WRITE (*,"('-----',3X,5(A12,2X))") ('------------',J=5*N5+1,N)

ALLOCATE (COMM(N))

&

END DO

WRITE (*,"(/76(1H=)/'EIGENVALUES'/76(1H=)
&
//'EIGENVALUE No.

'/
&
'-------------------------')")
DO I=1,N
WRITE (*,'(I8,9X,E12.6)') I,L(I)
END DO

-----------------------------------------------------------------PRINT OUT EIGENVECTORS


------------------------------------------------------------------

DO J=1,N
WRITE (*,'(I5,3X,5(E12.6,2X))') J,(X(J,K),K=K5-5+1,K5)
END DO

-----------------------------------------------------------------PRINT OUT EIGENVALUES


-----------------------------------------------------------------&
&

!
!
!
!
!
10
!

K5 = K5 + 5

-----------------------------------------------------------------Variable Description
-------------------N
[A]nxn
[L]n
[X]nxn

N5
= 1.00*N/5.00
NREST = N - 5*N5
K5
= 0

DO J=1,N
WRITE (*,'(I5,3X,5(E12.6,2X))') J,(X(J,K),K=5*N5+1,N)
END DO
DEALLOCATE (COMM)

!
!

46

RETURN
END

3. Gauss
&
f(x)

i=n

+1

I = f ( x)dx wi f ( xi )
1

i =1

n
x i2

-x

xi

-1

-xi

+xi

wi

0.577350269189626

1.000000000000000

0.000000000000000
0.774596669241483

0.888888888888889
0.555555555555556

0.339981043584856
0.861136311594053

0.652145154862546
0.347854845137454

0.000000000000000
0.538469310105683
0.906179845938664

0.568888888888889
0.478628670499366
0.236926885056189

0.238619186083197
0.661209386466265
0.932469514203152

0.467913934572691
0.360761573048139
0.171324492379170

0.000000000000000
0.405845151377397
0.741531185599394
0.949107912342759

0.417959183673469
0.381830050505119
0.279705391489277
0.129484966168870

0.183434642495650
0.525532409916329
0.796666477413627
0.960289856497536

0.362683788378362
0.313706645877887
0.222381034453374
0.101228536290376

0.000000000000000
0.324253423403809
0.613371432700590
0.836031107326636
0.968160239507626

0.330239355001260
0.312347077040003
0.260610696402935
0.180648160694857
0.081274388361574

0.148874338981631
0.433395394129247
0.679409568299024
0.865063366688985
0.973906528517172

0.295524224714753
0.269266719309996
0.219086362515982
0.149451349150581
0.066671344308688

10

47

+1

+x

:
t
gm 10
m

I=
1
e
dt
c 0

g = 9.8 , c = 12.5 , m = 68.1


n=2
n=3
n=4
n=5
n=6

48

289.4351
290.0145
289.4393
289.4352
289.4351
289.4351

You might also like