PR: 34230
Fixed bug in PolynomialSplineFunction to allow evaluation of the function at the last knot point. git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/math/trunk@159727 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5fc7e64e55
commit
ee310159d9
|
@ -36,7 +36,7 @@ import org.apache.commons.math.FunctionEvaluationException;
|
||||||
* centered on the knot points to compute the spline function values. See below.
|
* centered on the knot points to compute the spline function values. See below.
|
||||||
* <p>
|
* <p>
|
||||||
* The domain of the polynomial spline function is
|
* The domain of the polynomial spline function is
|
||||||
* <code>[smallest knot, largest knot)</code>. Attempts to evaluate the
|
* <code>[smallest knot, largest knot]</code>. Attempts to evaluate the
|
||||||
* function at values outside of this range generate IllegalArgumentExceptions.
|
* function at values outside of this range generate IllegalArgumentExceptions.
|
||||||
* <p>
|
* <p>
|
||||||
* The value of the polynomial spline function for an argument <code>x</code>
|
* The value of the polynomial spline function for an argument <code>x</code>
|
||||||
|
@ -44,7 +44,7 @@ import org.apache.commons.math.FunctionEvaluationException;
|
||||||
* <ol>
|
* <ol>
|
||||||
* <li>The knot array is searched to find the segment to which <code>x</code>
|
* <li>The knot array is searched to find the segment to which <code>x</code>
|
||||||
* belongs. If <code>x</code> is less than the smallest knot point or greater
|
* belongs. If <code>x</code> is less than the smallest knot point or greater
|
||||||
* than or equal to the largest one, an <code>IllegalArgumentException</code>
|
* than the largest one, an <code>IllegalArgumentException</code>
|
||||||
* is thrown.</li>
|
* is thrown.</li>
|
||||||
* <li> Let <code>j</code> be the index of the largest knot point that is less
|
* <li> Let <code>j</code> be the index of the largest knot point that is less
|
||||||
* than or equal to <code>x</code>. The value returned is <br>
|
* than or equal to <code>x</code>. The value returned is <br>
|
||||||
|
@ -116,7 +116,7 @@ public class PolynomialSplineFunction implements UnivariateRealFunction, Seriali
|
||||||
* Compute the value for the function.
|
* Compute the value for the function.
|
||||||
* <p>
|
* <p>
|
||||||
* Throws FunctionEvaluationException if v is outside of the domain of the
|
* Throws FunctionEvaluationException if v is outside of the domain of the
|
||||||
* function. The domain is [smallest knot, largest knot).
|
* function. The domain is [smallest knot, largest knot].
|
||||||
* <p>
|
* <p>
|
||||||
* See {@link PolynomialSplineFunction} for details on the algorithm for
|
* See {@link PolynomialSplineFunction} for details on the algorithm for
|
||||||
* computing the value of the function.
|
* computing the value of the function.
|
||||||
|
@ -125,16 +125,22 @@ public class PolynomialSplineFunction implements UnivariateRealFunction, Seriali
|
||||||
* @return the value
|
* @return the value
|
||||||
* @throws FunctionEvaluationException if v is outside of the domain of
|
* @throws FunctionEvaluationException if v is outside of the domain of
|
||||||
* of the spline function (less than the smallest knot point or greater
|
* of the spline function (less than the smallest knot point or greater
|
||||||
* than or equal to the largest knot point)
|
* than the largest knot point)
|
||||||
*/
|
*/
|
||||||
public double value(double v) throws FunctionEvaluationException {
|
public double value(double v) throws FunctionEvaluationException {
|
||||||
if (v < knots[0] || v >= knots[n]) {
|
if (v < knots[0] || v > knots[n]) {
|
||||||
throw new FunctionEvaluationException(v,"Argument outside domain");
|
throw new FunctionEvaluationException(v,"Argument outside domain");
|
||||||
}
|
}
|
||||||
int i = Arrays.binarySearch(knots, v);
|
int i = Arrays.binarySearch(knots, v);
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
i = -i - 2;
|
i = -i - 2;
|
||||||
}
|
}
|
||||||
|
//This will handle the case where v is the last knot value
|
||||||
|
//There are only n-1 polynomials, so if v is the last knot
|
||||||
|
//then we will use the last polynomial to calculate the value.
|
||||||
|
if ( i >= polynomials.length ) {
|
||||||
|
i--;
|
||||||
|
}
|
||||||
return polynomials[i].value(v - knots[i]);
|
return polynomials[i].value(v - knots[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,9 @@ public class SplineInterpolatorTest extends TestCase {
|
||||||
TestUtils.assertEquals(polynomials[1].getCoefficients(), target, coefficientTolerance);
|
TestUtils.assertEquals(polynomials[1].getCoefficients(), target, coefficientTolerance);
|
||||||
|
|
||||||
// Check interpolation
|
// Check interpolation
|
||||||
assertEquals(0.4,f.value(0.4), interpolationTolerance);
|
assertEquals(0.0,f.value(0.0), interpolationTolerance);
|
||||||
|
assertEquals(0.4,f.value(0.4), interpolationTolerance);
|
||||||
|
assertEquals(1.0,f.value(1.0), interpolationTolerance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testInterpolateLinearDegenerateThreeSegment()
|
public void testInterpolateLinearDegenerateThreeSegment()
|
||||||
|
@ -88,7 +90,9 @@ public class SplineInterpolatorTest extends TestCase {
|
||||||
TestUtils.assertEquals(polynomials[2].getCoefficients(), target, coefficientTolerance);
|
TestUtils.assertEquals(polynomials[2].getCoefficients(), target, coefficientTolerance);
|
||||||
|
|
||||||
// Check interpolation
|
// Check interpolation
|
||||||
assertEquals(1.4,f.value(1.4), interpolationTolerance);
|
assertEquals(0,f.value(0), interpolationTolerance);
|
||||||
|
assertEquals(1.4,f.value(1.4), interpolationTolerance);
|
||||||
|
assertEquals(1.5,f.value(1.5), interpolationTolerance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testInterpolateLinear() throws Exception {
|
public void testInterpolateLinear() throws Exception {
|
||||||
|
@ -179,11 +183,11 @@ public class SplineInterpolatorTest extends TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* verifies that f(x[i]) = y[i] for i = 0..n -1 where n is common length -- skips last point.
|
* verifies that f(x[i]) = y[i] for i = 0..n-1 where n is common length.
|
||||||
*/
|
*/
|
||||||
protected void verifyInterpolation(UnivariateRealFunction f, double x[], double y[])
|
protected void verifyInterpolation(UnivariateRealFunction f, double x[], double y[])
|
||||||
throws Exception{
|
throws Exception{
|
||||||
for (int i = 0; i < x.length - 1; i++) {
|
for (int i = 0; i < x.length; i++) {
|
||||||
assertEquals(f.value(x[i]), y[i], knotTolerance);
|
assertEquals(f.value(x[i]), y[i], knotTolerance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,10 @@ The <action> type attribute can be add,update,fix,remove.
|
||||||
<body>
|
<body>
|
||||||
<release version="1.1" date="In Development"
|
<release version="1.1" date="In Development"
|
||||||
description="Jakarta Commons Math 1.1 - Development">
|
description="Jakarta Commons Math 1.1 - Development">
|
||||||
|
<action dev="brentworden" type="fix" due-to="Ben Litchfield">
|
||||||
|
Fixed bug in PolynomialSplineFunction to allow evaluation of the
|
||||||
|
function at the last knot point.
|
||||||
|
</action>
|
||||||
<action dev="brentworden" type="add">
|
<action dev="brentworden" type="add">
|
||||||
Added Weibull distribution implementation.
|
Added Weibull distribution implementation.
|
||||||
</action>
|
</action>
|
||||||
|
|
Loading…
Reference in New Issue