Package com.polytechnik.utils
Class PolynomialRootsJenkinsTraubORIG
java.lang.Object
com.polytechnik.utils.PolynomialRootsJenkinsTraubORIG
- All Implemented Interfaces:
PolynomialRootsFinder
Fortran polynomial roots finder
http://www.netlib.org/toms/493
translated to java with few fixes:
1. scaling is broken in original version, new function pscale,
adopted from http://www.netlib.org/toms/419 is used.
2. some conditions are replaced to avoid infinite loops with NaNs.
-
Nested Class Summary
Nested classes/interfaces inherited from interface com.polytechnik.utils.PolynomialRootsFinder
PolynomialRootsFinder.PRoots
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final int
private double
private double
private double
private double
private double
private static final double
private double
private static final double
private double
private static final double
private double
private static final double
private static final double
private static final double
private double
private static final double
private double
private double
private double
private static final double
private static final double
private final double[]
private static final double
private static final double
private double
private double
private final int
private static final double
private double
private double
private final double[]
private final double[]
private final double[]
private final double[]
(package private) double
DIVIDES P BY THE QUADRATIC 1,U,V PLACING THE QUOTIENT IN Q AND THE REMAINDER IN quadsd_A,quadsd_B(package private) double
DIVIDES P BY THE QUADRATIC 1,U,V PLACING THE QUOTIENT IN Q AND THE REMAINDER IN quadsd_A,quadsd_Bprivate int
private double
private double
private static final double
private static final double
private static final double
private double
private final double[]
private double
private double
private final double[]
private double
private double
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription(package private) int
_findRoots
(int degree, double[] op, double[] zeror, double[] zeroi) FINDS THE ZEROS OF A REAL POLYNOMIAL OP - DOUBLE PRECISION VECTOR OF COEFFICIENTS IN ORDER OF INCREASING POWERS.private int
calcsc
(int N) THIS ROUTINE CALCULATES SCALAR QUANTITIES USED TO COMPUTE THE NEXT K POLYNOMIAL AND NEW ESTIMATES OF THE QUADRATIC COEFFICIENTS.private void
findRoots
(double[] polynomial_coefs) private int
fxshfr
(int N, int NN, int l2) COMPUTES UP TO L2 FIXED SHIFT K-POLYNOMIALS, TESTING FOR CONVERGENCE IN THE LINEAR OR QUADRATIC CASE.static void
Unit Test.private void
newest
(int N, int NN, int type) COMPUTE NEW ESTIMATES OF THE QUADRATIC COEFFICIENTS USING THE SCALARS COMPUTED IN CALCSC.private void
nextk
(int N, int type) COMPUTES THE NEXT K POLYNOMIALS USING SCALARS COMPUTED IN CALCSC.private static double
pscale
(int NN, double[] P) Taken originally from http://www.netlib.org/toms/419 and adopted to fix broken scaling.private void
quad
(double a, double b1, double c) CALCULATE THE ZEROS OF THE QUADRATIC A*Z**2+B1*Z+C.private int
quadit
(int N, int NN, double uu, double vv) VARIABLE-SHIFT K-POLYNOMIAL ITERATION FOR A QUADRATIC FACTOR CONVERGES ONLY IF THE ZEROS ARE EQUIMODULAR OR NEARLY SO.private void
quadsd
(int NN, double u, double v, double[] p, double[] q) private int
realit
(int N, int NN, double sss) VARIABLE-SHIFT H POLYNOMIAL ITERATION FOR A REAL ZERO.
-
Field Details
-
DBL_EPSILON
private static final double DBL_EPSILON -
DBL_MIN
private static final double DBL_MIN- See Also:
-
DBL_MAX
private static final double DBL_MAX- See Also:
-
COSR
private static final double COSR -
SINR
private static final double SINR -
SQRT2D2
private static final double SQRT2D2 -
BASE
private static final double BASE- See Also:
-
LOG_BASE
private static final double LOG_BASE -
ETA
private static final double ETA -
INFIN
private static final double INFIN- See Also:
-
SMALNO
private static final double SMALNO- See Also:
-
ARE
private static final double ARE -
MRE
private static final double MRE -
HI
private static final double HI -
LO
private static final double LO -
_TRACE
private static final int _TRACE- See Also:
-
MAXDEGREE
private final int MAXDEGREE -
P
private final double[] P -
QP
private final double[] QP -
K
private final double[] K -
QK
private final double[] QK -
SVK
private final double[] SVK -
PT
private final double[] PT -
TEMP
private final double[] TEMP -
SR
private double SR -
SI
private double SI -
U
private double U -
V
private double V -
A
private double A -
B
private double B -
C
private double C -
D
private double D -
A1
private double A1 -
A2
private double A2 -
A3
private double A3 -
A7
private double A7 -
E
private double E -
F
private double F -
G
private double G -
H
private double H -
SZR
private double SZR -
SZI
private double SZI -
LZR
private double LZR -
LZI
private double LZI -
realit_iflag
private int realit_iflag -
realit_sss
private double realit_sss -
newest_uu
private double newest_uu -
newest_vv
private double newest_vv -
quadsd_A
double quadsd_ADIVIDES P BY THE QUADRATIC 1,U,V PLACING THE QUOTIENT IN Q AND THE REMAINDER IN quadsd_A,quadsd_B -
quadsd_B
double quadsd_BDIVIDES P BY THE QUADRATIC 1,U,V PLACING THE QUOTIENT IN Q AND THE REMAINDER IN quadsd_A,quadsd_B
-
-
Constructor Details
-
PolynomialRootsJenkinsTraubORIG
public PolynomialRootsJenkinsTraubORIG()
-
-
Method Details
-
findRoots
- Specified by:
findRoots
in interfacePolynomialRootsFinder
-
_findRoots
int _findRoots(int degree, double[] op, double[] zeror, double[] zeroi) FINDS THE ZEROS OF A REAL POLYNOMIAL OP - DOUBLE PRECISION VECTOR OF COEFFICIENTS IN ORDER OF INCREASING POWERS. DEGREE - INTEGER DEGREE OF POLYNOMIAL. ZEROR, ZEROI - OUTPUT DOUBLE PRECISION VECTORS OF REAL AND IMAGINARY PARTS OF THE ZEROS. -
fxshfr
private int fxshfr(int N, int NN, int l2) COMPUTES UP TO L2 FIXED SHIFT K-POLYNOMIALS, TESTING FOR CONVERGENCE IN THE LINEAR OR QUADRATIC CASE. INITIATES ONE OF THE VARIABLE SHIFT ITERATIONS AND RETURNS WITH THE NUMBER OF ZEROS FOUND. L2 - LIMIT OF FIXED SHIFT STEPS- Returns:
- nz - number of zeros found
-
quadit
private int quadit(int N, int NN, double uu, double vv) VARIABLE-SHIFT K-POLYNOMIAL ITERATION FOR A QUADRATIC FACTOR CONVERGES ONLY IF THE ZEROS ARE EQUIMODULAR OR NEARLY SO. UU,VV - COEFFICIENTS OF STARTING QUADRATIC NZ - NUMBER OF ZERO FOUND -
realit
private int realit(int N, int NN, double sss) VARIABLE-SHIFT H POLYNOMIAL ITERATION FOR A REAL ZERO. SSS - STARTING ITERATE realit_iflag - FLAG TO INDICATE A PAIR OF ZEROS NEAR REAL AXIS.- Returns:
- NUMBER OF ZERO FOUND
-
calcsc
private int calcsc(int N) THIS ROUTINE CALCULATES SCALAR QUANTITIES USED TO COMPUTE THE NEXT K POLYNOMIAL AND NEW ESTIMATES OF THE QUADRATIC COEFFICIENTS.- Returns:
- TYPE - INTEGER VARIABLE SET HERE INDICATING HOW THE CALCULATIONS ARE NORMALIZED TO AVOID OVERFLOW.
-
nextk
private void nextk(int N, int type) COMPUTES THE NEXT K POLYNOMIALS USING SCALARS COMPUTED IN CALCSC. -
newest
private void newest(int N, int NN, int type) COMPUTE NEW ESTIMATES OF THE QUADRATIC COEFFICIENTS USING THE SCALARS COMPUTED IN CALCSC. -
quadsd
private void quadsd(int NN, double u, double v, double[] p, double[] q) -
quad
private void quad(double a, double b1, double c) CALCULATE THE ZEROS OF THE QUADRATIC A*Z**2+B1*Z+C. THE QUADRATIC FORMULA, MODIFIED TO AVOID OVERFLOW, IS USED TO FIND THE LARGER ZERO IF THE ZEROS ARE REAL AND BOTH ZEROS ARE COMPLEX. THE SMALLER REAL ZERO IS FOUND DIRECTLY FROM THE PRODUCT OF THE ZEROS C/A. -
pscale
private static double pscale(int NN, double[] P) Taken originally from http://www.netlib.org/toms/419 and adopted to fix broken scaling. RETURNS A SCALE FACTOR TO MULTIPLY THE COEFFICIENTS OF THE POLYNOMIAL. THE SCALING IS DONE TO AVOID OVERFLOW AND TO AVOID UNDETECTED UNDERFLOW INTERFERING WITH THE CONVERGENCE CRITERION. THE FACTOR IS A POWER OF THE BASE. PT - MODULUS OF COEFFICIENTS OF P ETA,INFIN,SMALNO,BASE - CONSTANTS DESCRIBING THE FLOATING POINT ARITHMETIC. -
dumpc
-
main
Unit Test.
-