[ https://issues.apache.org/jira/browse/MATH-985?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Thomas Neidhart resolved MATH-985. ---------------------------------- Resolution: Fixed Fix Version/s: 3.3 Added changelog entry in r1561510. For the remaining tests which are ignored atm I would suggest to create a separate ticket. > BicubicSpline interpolation returns unexpected values > (BicubicSplineInterpolator/BicubicSplineInterpolationFunction) > -------------------------------------------------------------------------------------------------------------------- > > Key: MATH-985 > URL: https://issues.apache.org/jira/browse/MATH-985 > Project: Commons Math > Issue Type: Bug > Affects Versions: 3.1.1 > Environment: Windows 7 64 bit, 64 bit JVM > Reporter: Johnathan Kool > Fix For: 3.3 > > Attachments: math985.png > > > I've been testing out the Tricubic spline functions, and have been getting > some strange values. I dug down a bit, and it seems like they start at the > Bicubic level. SplineInterpolator/PolynomialSplineFunction seem to be > returning correct values. I set up a block of data that increases linearly, > so you'd expect the interpolated values to follow the same trend, except the > values tend to overshoot to half the distance between knot points, and then > undershoot for the remaining half. Probably the easiest thing would be to > show some tests. First - 1D which works fine: > {code:title=SplineTest.java|borderStyle=solid} > import org.apache.commons.math3.analysis.interpolation.SplineInterpolator; > import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction; > public class SplineTest { > double[] x = new double[]{.52,.54,.56,.58,.6}; > double[] y = new double[]{76,77,78,79,80}; > > public static void main(String[] args){ > SplineTest st = new SplineTest(); > st.go(); > } > > public void go(){ > SplineInterpolator si = new SplineInterpolator(); > PolynomialSplineFunction sf = si.interpolate(x, y); > > System.out.println(sf.value(0.52)); > System.out.println(sf.value(0.5225)); > System.out.println(sf.value(0.525)); > System.out.println(sf.value(0.5275)); > System.out.println(sf.value(0.53)); > System.out.println(sf.value(0.5325)); > System.out.println(sf.value(0.535)); > System.out.println(sf.value(0.5375)); > System.out.println(sf.value(0.54)); > System.out.println(sf.value(0.5425)); > System.out.println(sf.value(0.545)); > System.out.println(sf.value(0.5475)); > System.out.println(sf.value(0.55)); > System.out.println(sf.value(0.5525)); > System.out.println(sf.value(0.555)); > System.out.println(sf.value(0.5575)); > System.out.println(sf.value(0.56)); > } > } > {code} > and next, 2D which doesn't: > {code:title=BicubicSplineTest.java|borderStyle=solid} > import > org.apache.commons.math3.analysis.interpolation.BicubicSplineInterpolatingFunction; > import > org.apache.commons.math3.analysis.interpolation.BicubicSplineInterpolator; > public class BicubicSplineTest { > double[] x = new double[]{0,1,2}; > double[] y = new double[]{.52,.54,.56,.58,.6}; > double[] v1 = new double[]{76,77,78,79,80}; > double[][] v2 = new double[][]{v1,v1,v1}; > > public static void main(String[] args){ > BicubicSplineTest bt = new BicubicSplineTest(); > bt.go(); > } > > public void go(){ > BicubicSplineInterpolator bi = new BicubicSplineInterpolator(); > BicubicSplineInterpolatingFunction bf = bi.interpolate(x, y, > v2); > > System.out.println(bf.value(1, 0.52)); > System.out.println(bf.value(1, 0.5225)); > System.out.println(bf.value(1, 0.525)); > System.out.println(bf.value(1, 0.5275)); > System.out.println(bf.value(1, 0.53)); > System.out.println(bf.value(1, 0.5325)); > System.out.println(bf.value(1, 0.535)); > System.out.println(bf.value(1, 0.5375)); > System.out.println(bf.value(1, 0.54)); > System.out.println(bf.value(1, 0.5425)); > System.out.println(bf.value(1, 0.545)); > System.out.println(bf.value(1, 0.5475)); > System.out.println(bf.value(1, 0.55)); > System.out.println(bf.value(1, 0.5525)); > System.out.println(bf.value(1, 0.555)); > System.out.println(bf.value(1, 0.5575)); > System.out.println(bf.value(1, 0.56)); > } > } > {code} > The data points increase from 76 to 80 in a linear way. Incrementing by 1/8 > the distance to the next point, the 1D spline returns: > 76.0 > 76.125 > 76.25 > 76.375 > 76.5 > 76.625 > 76.75 > 76.875 > 77.0 > 77.125 > 77.25 > 77.375 > 77.5 > 77.625 > 77.75 > 77.875 > 78.0 > The 2D spline returns: > 76.0 > 80.14453124999996 > 80.84375000000003 > 79.24609375000007 > 76.50000000000003 > 73.75390625000007 > 72.15625000000001 > 72.85546874999996 > 76.99999999999997 > 81.14453124999993 > 81.84374999999997 > 80.24609375000006 > 77.50000000000003 > 74.75390625000009 > 73.15625000000004 > 73.85546874999997 > 78.0 > Even though it's still effectively a 1D problem. I'm not sure exactly what's > causing it - maybe something when multiplying the coefficients, but thought I > should flag it. -- This message was sent by Atlassian JIRA (v6.1.5#6160)