Polynomials now implement the new UnivariateDifferentiable interface.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1374630 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
09463e6705
commit
63d00ba803
|
@ -25,6 +25,8 @@ import org.apache.commons.math3.exception.NullArgumentException;
|
||||||
import org.apache.commons.math3.analysis.DifferentiableUnivariateFunction;
|
import org.apache.commons.math3.analysis.DifferentiableUnivariateFunction;
|
||||||
import org.apache.commons.math3.analysis.UnivariateFunction;
|
import org.apache.commons.math3.analysis.UnivariateFunction;
|
||||||
import org.apache.commons.math3.analysis.ParametricUnivariateFunction;
|
import org.apache.commons.math3.analysis.ParametricUnivariateFunction;
|
||||||
|
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
|
||||||
|
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiable;
|
||||||
import org.apache.commons.math3.util.FastMath;
|
import org.apache.commons.math3.util.FastMath;
|
||||||
import org.apache.commons.math3.util.MathUtils;
|
import org.apache.commons.math3.util.MathUtils;
|
||||||
|
|
||||||
|
@ -36,7 +38,7 @@ import org.apache.commons.math3.util.MathUtils;
|
||||||
*
|
*
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
public class PolynomialFunction implements DifferentiableUnivariateFunction, Serializable {
|
public class PolynomialFunction implements UnivariateDifferentiable, DifferentiableUnivariateFunction, Serializable {
|
||||||
/**
|
/**
|
||||||
* Serialization identifier
|
* Serialization identifier
|
||||||
*/
|
*/
|
||||||
|
@ -137,6 +139,27 @@ public class PolynomialFunction implements DifferentiableUnivariateFunction, Ser
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** {@inheritDoc}
|
||||||
|
* @since 3.1
|
||||||
|
* @throws NoDataException if {@code coefficients} is empty.
|
||||||
|
* @throws NullArgumentException if {@code coefficients} is {@code null}.
|
||||||
|
*/
|
||||||
|
public DerivativeStructure value(final DerivativeStructure t)
|
||||||
|
throws NullArgumentException, NoDataException {
|
||||||
|
MathUtils.checkNotNull(coefficients);
|
||||||
|
int n = coefficients.length;
|
||||||
|
if (n == 0) {
|
||||||
|
throw new NoDataException(LocalizedFormats.EMPTY_POLYNOMIALS_COEFFICIENTS_ARRAY);
|
||||||
|
}
|
||||||
|
DerivativeStructure result =
|
||||||
|
new DerivativeStructure(t.getFreeParameters(), t.getOrder(), coefficients[n - 1]);
|
||||||
|
for (int j = n - 2; j >= 0; j--) {
|
||||||
|
result = result.multiply(t).add(coefficients[j]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a polynomial to the instance.
|
* Add a polynomial to the instance.
|
||||||
*
|
*
|
||||||
|
|
|
@ -21,6 +21,8 @@ import java.util.Arrays;
|
||||||
import org.apache.commons.math3.util.MathArrays;
|
import org.apache.commons.math3.util.MathArrays;
|
||||||
import org.apache.commons.math3.analysis.DifferentiableUnivariateFunction;
|
import org.apache.commons.math3.analysis.DifferentiableUnivariateFunction;
|
||||||
import org.apache.commons.math3.analysis.UnivariateFunction;
|
import org.apache.commons.math3.analysis.UnivariateFunction;
|
||||||
|
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
|
||||||
|
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiable;
|
||||||
import org.apache.commons.math3.exception.OutOfRangeException;
|
import org.apache.commons.math3.exception.OutOfRangeException;
|
||||||
import org.apache.commons.math3.exception.NumberIsTooSmallException;
|
import org.apache.commons.math3.exception.NumberIsTooSmallException;
|
||||||
import org.apache.commons.math3.exception.DimensionMismatchException;
|
import org.apache.commons.math3.exception.DimensionMismatchException;
|
||||||
|
@ -61,7 +63,7 @@ import org.apache.commons.math3.exception.util.LocalizedFormats;
|
||||||
*
|
*
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
public class PolynomialSplineFunction implements DifferentiableUnivariateFunction {
|
public class PolynomialSplineFunction implements UnivariateDifferentiable, DifferentiableUnivariateFunction {
|
||||||
/**
|
/**
|
||||||
* Spline segment interval delimiters (knots).
|
* Spline segment interval delimiters (knots).
|
||||||
* Size is n + 1 for n segments.
|
* Size is n + 1 for n segments.
|
||||||
|
@ -168,6 +170,28 @@ public class PolynomialSplineFunction implements DifferentiableUnivariateFunctio
|
||||||
return new PolynomialSplineFunction(knots, derivativePolynomials);
|
return new PolynomialSplineFunction(knots, derivativePolynomials);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** {@inheritDoc}
|
||||||
|
* @since 3.1
|
||||||
|
*/
|
||||||
|
public DerivativeStructure value(final DerivativeStructure t) {
|
||||||
|
final double t0 = t.getValue();
|
||||||
|
if (t0 < knots[0] || t0 > knots[n]) {
|
||||||
|
throw new OutOfRangeException(t0, knots[0], knots[n]);
|
||||||
|
}
|
||||||
|
int i = Arrays.binarySearch(knots, t0);
|
||||||
|
if (i < 0) {
|
||||||
|
i = -i - 2;
|
||||||
|
}
|
||||||
|
// This will handle the case where t is the last knot value
|
||||||
|
// There are only n-1 polynomials, so if t is the last knot
|
||||||
|
// then we will use the last polynomial to calculate the value.
|
||||||
|
if ( i >= polynomials.length ) {
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
return polynomials[i].value(t.subtract(knots[i]));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the number of spline segments.
|
* Get the number of spline segments.
|
||||||
* It is also the number of polynomials and the number of knot points - 1.
|
* It is also the number of polynomials and the number of knot points - 1.
|
||||||
|
|
Loading…
Reference in New Issue