You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2013/02/25 20:31:53 UTC
svn commit: r1449822 - in /commons/proper/math/trunk/src:
main/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolator.java
test/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolatorTest.java
Author: luc
Date: Mon Feb 25 19:31:52 2013
New Revision: 1449822
URL: http://svn.apache.org/r1449822
Log:
Added derivatives evaluation for field Hermite interpolator.
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolator.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolatorTest.java
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolator.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolator.java?rev=1449822&r1=1449821&r2=1449822&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolator.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolator.java Mon Feb 25 19:31:52 2013
@@ -149,4 +149,49 @@ public class FieldHermiteInterpolator<T
}
+ /** Interpolate value and first derivatives at a specified abscissa.
+ * @param x interpolation abscissa
+ * @param order maximum derivation order
+ * @return interpolated value and derivatives (value in row 0,
+ * 1<sup>st</sup> derivative in row 1, ... n<sup>th</sup> derivative in row n)
+ * @exception NoDataException if sample is empty
+ */
+ public T[][] derivatives(T x, int order) throws NoDataException {
+
+ // safety check
+ if (abscissae.isEmpty()) {
+ throw new NoDataException(LocalizedFormats.EMPTY_INTERPOLATION_SAMPLE);
+ }
+
+ final T zero = x.getField().getZero();
+ final T one = x.getField().getOne();
+ final T[] tj = MathArrays.buildArray(x.getField(), order + 1);
+ tj[0] = zero;
+ for (int i = 0; i < order; ++i) {
+ tj[i + 1] = tj[i].add(one);
+ }
+
+ final T[][] derivatives =
+ MathArrays.buildArray(x.getField(), order + 1, topDiagonal.get(0).length);
+ final T[] valueCoeff = MathArrays.buildArray(x.getField(), order + 1);
+ valueCoeff[0] = x.getField().getOne();
+ for (int i = 0; i < topDiagonal.size(); ++i) {
+ T[] dividedDifference = topDiagonal.get(i);
+ final T deltaX = x.subtract(abscissae.get(i));
+ for (int j = order; j >= 0; --j) {
+ for (int k = 0; k < derivatives[j].length; ++k) {
+ derivatives[j][k] =
+ derivatives[j][k].add(dividedDifference[k].multiply(valueCoeff[j]));
+ }
+ valueCoeff[j] = valueCoeff[j].multiply(deltaX);
+ if (j > 0) {
+ valueCoeff[j] = valueCoeff[j].add(tj[j].multiply(valueCoeff[j - 1]));
+ }
+ }
+ }
+
+ return derivatives;
+
+ }
+
}
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolatorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolatorTest.java?rev=1449822&r1=1449821&r2=1449822&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolatorTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/interpolation/FieldHermiteInterpolatorTest.java Mon Feb 25 19:31:52 2013
@@ -36,6 +36,9 @@ public class FieldHermiteInterpolatorTes
for (int x = -10; x < 10; x++) {
BigFraction y = interpolator.value(new BigFraction(x))[0];
Assert.assertEquals(BigFraction.ZERO, y);
+ BigFraction[][] derivatives = interpolator.derivatives(new BigFraction(x), 1);
+ Assert.assertEquals(BigFraction.ZERO, derivatives[0][0]);
+ Assert.assertEquals(BigFraction.ZERO, derivatives[1][0]);
}
}
@@ -48,6 +51,11 @@ public class FieldHermiteInterpolatorTes
for (double x = -10; x < 10; x += 1.0) {
BigFraction y = interpolator.value(new BigFraction(x))[0];
Assert.assertEquals((x - 1) * (x - 2), y.doubleValue(), 1.0e-15);
+ BigFraction[][] derivatives = interpolator.derivatives(new BigFraction(x), 3);
+ Assert.assertEquals((x - 1) * (x - 2), derivatives[0][0].doubleValue(), 1.0e-15);
+ Assert.assertEquals(2 * x - 3, derivatives[1][0].doubleValue(), 1.0e-15);
+ Assert.assertEquals(2, derivatives[2][0].doubleValue(), 1.0e-15);
+ Assert.assertEquals(0, derivatives[3][0].doubleValue(), 1.0e-15);
}
}
@@ -57,9 +65,27 @@ public class FieldHermiteInterpolatorTes
interpolator.addSamplePoint(new BigFraction(0), new BigFraction[] { new BigFraction(1) }, new BigFraction[] { new BigFraction(2) });
interpolator.addSamplePoint(new BigFraction(1), new BigFraction[] { new BigFraction(4) });
interpolator.addSamplePoint(new BigFraction(2), new BigFraction[] { new BigFraction(5) }, new BigFraction[] { new BigFraction(2) });
- Assert.assertEquals(new BigFraction(1), interpolator.value(new BigFraction(0))[0]);
- Assert.assertEquals(new BigFraction(4), interpolator.value(new BigFraction(1))[0]);
- Assert.assertEquals(new BigFraction(5), interpolator.value(new BigFraction(2))[0]);
+ BigFraction[][] derivatives = interpolator.derivatives(new BigFraction(0), 5);
+ Assert.assertEquals(new BigFraction( 1), derivatives[0][0]);
+ Assert.assertEquals(new BigFraction( 2), derivatives[1][0]);
+ Assert.assertEquals(new BigFraction( 8), derivatives[2][0]);
+ Assert.assertEquals(new BigFraction(-24), derivatives[3][0]);
+ Assert.assertEquals(new BigFraction( 24), derivatives[4][0]);
+ Assert.assertEquals(new BigFraction( 0), derivatives[5][0]);
+ derivatives = interpolator.derivatives(new BigFraction(1), 5);
+ Assert.assertEquals(new BigFraction( 4), derivatives[0][0]);
+ Assert.assertEquals(new BigFraction( 2), derivatives[1][0]);
+ Assert.assertEquals(new BigFraction( -4), derivatives[2][0]);
+ Assert.assertEquals(new BigFraction( 0), derivatives[3][0]);
+ Assert.assertEquals(new BigFraction( 24), derivatives[4][0]);
+ Assert.assertEquals(new BigFraction( 0), derivatives[5][0]);
+ derivatives = interpolator.derivatives(new BigFraction(2), 5);
+ Assert.assertEquals(new BigFraction( 5), derivatives[0][0]);
+ Assert.assertEquals(new BigFraction( 2), derivatives[1][0]);
+ Assert.assertEquals(new BigFraction( 8), derivatives[2][0]);
+ Assert.assertEquals(new BigFraction( 24), derivatives[3][0]);
+ Assert.assertEquals(new BigFraction( 24), derivatives[4][0]);
+ Assert.assertEquals(new BigFraction( 0), derivatives[5][0]);
}
@Test
@@ -230,10 +256,15 @@ public class FieldHermiteInterpolatorTes
}
@Test(expected=NoDataException.class)
- public void testEmptySample() {
+ public void testEmptySampleValue() {
new FieldHermiteInterpolator<BigFraction>().value(BigFraction.ZERO);
}
+ @Test(expected=NoDataException.class)
+ public void testEmptySampleDerivative() {
+ new FieldHermiteInterpolator<BigFraction>().derivatives(BigFraction.ZERO, 1);
+ }
+
@Test(expected=IllegalArgumentException.class)
public void testDuplicatedAbscissa() {
FieldHermiteInterpolator<BigFraction> interpolator = new FieldHermiteInterpolator<BigFraction>();