/* * Copyright 2006, United States Government as represented by the Administrator * for the National Aeronautics and Space Administration. No copyright is * claimed in the United States under Title 17, U.S. Code. All Other Rights * Reserved. */ package gov.nasa.ial.mde.solver.numeric; import gov.nasa.ial.mde.solver.classifier.QuadraticClassifier; import gov.nasa.ial.mde.solver.symbolic.Polynomial; /** * A model for a Rational. * * @author Dr. Robert Shelton * @version 1.0 * @since 1.0 */ public class RationalModel extends PolynomialModel { private int[][] rModelVector; private int numeratorDegree, denominatorDegree; /** * Constructs a rational model using the polynomimal model builder and the * specified numerator and denominator degree. * * @param p the polynomimal model builder. * @param numeratorDegree the degree of the numerator. * @param denominatorDegree the degree of the denominator. */ public RationalModel(PolynomialModelBuilder p, int numeratorDegree, int denominatorDegree) { int dx = p.getXDegree(), dy = p.getYDegree(); if (dy < 1) throw new IllegalArgumentException("Need a PolynomialModelBuilder with larger y degree"); this.numeratorDegree = Math.min(numeratorDegree, dx); this.denominatorDegree = Math.min(denominatorDegree, dx); rModelVector = new int[1][0]; rModelVector[0] = makeModel(denominatorDegree, numeratorDegree, dx); evaluate(p, rModelVector); } // end RationalModel /** * Returns the numerator polynomial. * * @return the numerator polynomial. */ public Polynomial getNumerator() { double[] c = new double[numeratorDegree + 1]; for (int i = 0; i <= numeratorDegree; i++) c[i] = -modelVector[numeratorDegree - i]; return Polynomial.doubles2Poly(QuadraticClassifier.makeInteger(c, 100), "x"); } // end getNumerator /** * Returns the denominator polynomial. * * @return the denominator polynomial. */ public Polynomial getDenominator() { double[] c = new double[denominatorDegree + 1]; for (int i = 0; i <= denominatorDegree; i++) c[denominatorDegree - i] = modelVector[1 + i + numeratorDegree]; return Polynomial.doubles2Poly(QuadraticClassifier.makeInteger(c, 100), "x"); } // end getDenominator /** * Returns the a string representation of the rational. * * @return a string representation of the rational. */ public String toString() { StringBuffer b = new StringBuffer(); b.append("Numerator = ").append(getNumerator().toString()); b.append("\nDenominator = ").append(getDenominator().toString()); return b.toString(); } // end toString private int[] makeModel(int d, int n, int dx) { int dSize = d + 1, nSize = n + 1, xSize = dx + 1; int[] r = new int[dSize + nSize]; for (int i = 0; i < nSize; i++) r[i] = i; for (int i = 0; i < dSize; i++) r[i + nSize] = i + xSize; return r; } // end makeModel } // end class RationalModel