1 PROGRAM BAIRSTOW(INPUT,OUTPUT);
3 CONST NMAX=20; EPSILON=1E-8;
5 TYPE KOMPLEX = RECORD RE,IM: REAL END;
8 A: ARRAY[0..NMAX] OF REAL;
9 B,C: ARRAY[-1..NMAX] OF REAL;
10 P,Q,PDELTA,QDELTA,DISKR: REAL;
12 PROCEDURE DRUCKELOESUNG(X: KOMPLEX);
15 WRITE("X", NR:1, "=":2, X.RE :11:5);
17 BEGIN IF X.IM>0 THEN WRITE("+":2)
19 WRITE(ABS(X.IM):11:5, " * J")
22 END (* DRUCKELOESUNG *);
25 PROCEDURE QUADRATFAKTOR(P,Q: REAL);
31 BEGIN X.RE := -P/2 + SQRT(D); X.IM := 0;
33 X.RE := -P/2 - SQRT(D);
36 BEGIN X.RE := -P/2; X.IM := SQRT(-D);
41 END (* QUADRATFAKTOR *);
44 PROCEDURE LINEARFAKTOR(Q: REAL);
46 BEGIN X.RE := -Q; X.IM := 0;
48 END (* LINEARFAKTOR *);
53 WRITELN("P O L Y N O M", N:3, ". GRADES:");
56 WRITELN(A[I]:8:2, " X^", N-I :1)
59 IF A[0]<>1 THEN BEGIN Q := A[0];
61 FOR I := 1 TO N DO A[I] := A[I]/Q;
67 BEGIN P := -1; Q := 1;
69 B[-1] := 0; B[0] := 1;
70 C[-1] := 0; C[0] := 1;
73 B[I] := A[I] - P*B[I-1] - Q*B[I-2];
74 C[I] := B[I] - P*C[I-1] - Q*C[I-2]
76 DISKR := SQR(C[N-2]) - (C[N-1]-B[N-1])*C[N-3];
77 PDELTA:= (B[N-1]*C[N-2]-B[N]*C[N-3])/DISKR;
78 QDELTA:= (C[N-2]*B[N]-(C[N-1]-B[N-1])*B[N-1])/DISKR;
79 P := P + PDELTA; Q := Q + QDELTA
80 UNTIL ABS(PDELTA)+ABS(QDELTA) < EPSILON;
83 FOR I := 1 TO N DO A[I] := B[I];
85 IF N=2 THEN QUADRATFAKTOR(A[1],A[2])
86 ELSE LINEARFAKTOR(A[1])