[ https://issues.apache.org/jira/browse/MATH1138?page=com.atlassian.jira.plugin.system.issuetabpanels:commenttabpanel&focusedCommentId=14160303#comment14160303
]
Hank Grabowski commented on MATH1138:

Reviewing Octave and Math.NET I have identified the source of the discrepancy. It appears
that Octave uses Bsplines for their spline interpolation. The implementation in Apache Math
is the Natural Spline. When I use the Math.NET natural spline interpolator I get the same
results as I get with the Apache Math method. However if I use the Akima Cubic Spline algorithm
from Math.NET I get valid numbers. The only disadvantage of the Akima Spline that I see that
we don't have with the standard cubic spline is that it needs a minimum of five elements,
not four.
Because the current spline works I was going to code up an Akima spline based on the Math.NET
implementation (referencing that source (they are a compatible MIT license), plus a book source.
I will then use that as the basis for the splines in the BicubicSpline Interpolation.
> BicubicSplineInterpolator is returning incorrect interpolated values
> 
>
> Key: MATH1138
> URL: https://issues.apache.org/jira/browse/MATH1138
> Project: Commons Math
> Issue Type: Bug
> Affects Versions: 3.3
> Reporter: Adam Bedrossian
> Attachments: Interpolated Values from CM and MatLab.docx
>
>
> I have encountered a use case with the BicubicSplineInterpolator where the interpolated
values that are being returned seem incorrect. Furthermore, the values do not match those
generated by MatLab using the interp2 'cubic' method.
> Here is a snippet of code that uses the interpolator:
> double[] xValues = new double[] {36, 36.001, 36.002};
> double[] yValues = new double[] {108.00, 107.999, 107.998};
> double[][] fValues = new double[][] {{1915, 1906, 1931},
> {1877, 1889, 1894},
> {1878, 1873, 1888}};
> BicubicSplineInterpolator interpolator = new BicubicSplineInterpolator();
> BicubicSplineInterpolatingFunction interpolatorFunction = interpolator.interpolate(xValues,
yValues, fValues);
> double[][] results = new double[9][9];
> double x = 36;
> int arrayIndexX = 0, arrayIndexY = 0;
> while(x <= 36.002) {
> double y = 108;
> arrayIndexY = 0;
> while (y <= 107.998) {
> results[arrayIndexX][arrayIndexY] = interpolatorFunction.value(x, y);
> System.out.println(results[arrayIndexX][arrayIndexY]);
> y = y + 0.00025;
> arrayIndexY++;
> }
> x = x + 0.00025;
> arrayIndexX++;
> }
> Attached is a grid showing x and y values and the corresponding interpolated value from
both commons math and MatLab.
> The values produced by commons math are far off from those created by MatLab.

This message was sent by Atlassian JIRA
(v6.3.4#6332)
