BicubicSplineInterpolatorは、入力セットに対して奇妙な結果を返しています。
これが私のテストケースです:
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;
int 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++;
}
このコード スニペットを実行すると、結果配列に含まれる補間値は次のようになります。
1915.0
-3938.5937499822526
-1760.2500002294219
2246.2187497695777
1877.000000525819
250.9999999288558
1803.7499996906008
3403.374999905478
1889.0000007034323
-922.343750031719
390070.8886686283
320411.8593862744
91169.82228340462
3414.031240516051
140099.0224580196
124712.34376105569
48068.829113991116
2932.7499997298
-1277.0000000323469
335413.0390564674
264381.1250073778
61474.21095159976
2539.249988033902
335702.3671824192
264764.37503049
61763.88284085272
2547.749982131645
-37.90625000258933
112126.77147883564
76170.70312516135
2453.8925818554126
1336.3437417931855
362677.29393607465
272636.7187811567
46134.229521767236
1834.6249738819897
1877.0000000976995
-1228.312492238307
-1778.749983159687
-501.0624825709448
1877.9999996234117
304.4687496629192
1787.2500015275245
3316.9062529374487
1873.0000007069889
3414.031249990962
153858.71874489737
320991.32811795553
328540.929697798
236.59381305763964
49250.68456339003
124800.53124625524
139093.54200382315
1640.9687914999472
2539.249999955474
140423.82030525914
265019.87498830666
257740.9296891929
0.5000480143353343
140431.7734211699
265401.6249928146
258308.9765831194
5.500072199653914
1336.343749981772
56546.050777358614
76540.60936913849
58774.425778594334
701.9062589909881
161169.991191242
273494.90623999
249357.90724363495
-692.468683006271
上記で定義したように ~1800 から ~2000 の間の f 値のセットの場合、補間セットに負の値がある理由がわかりません。さらに、257740.9296891929 や 249357.90724363495 など、入力セットの最大値よりもはるかに大きい値があります。
この入力セットを MatLab でセットアップして、interp2 キュービック メソッドを使用して結果を比較しました。MatLab からの結果は、私が期待していたよりもはるかに優れています。以下は、MatLab で設定された同じ入力の結果です。
1915
1901.84375000034
1891.12500000000
1882.84375000020
1877
1873.59375000003
1872.62499999999
1874.09375000004
1878
1909.56249999997
1900.16796875024
1892.21875000001
1885.71484375018
1880.65625000002
1877.04296875006
1874.87500000006
1874.15234375000
1874.87499999998
1906.24999999997
1899.57812500018
1893.62500000002
1888.39062500018
1883.87500000004
1880.07812500009
1877.00000000011
1874.64062499998
1872.99999999998
1905.06250000000
1900.07421875013
1895.34374999999
1890.87109375011
1886.65624999998
1882.69921875004
1879.00000000009
1875.55859374994
1872.37500000000
1906.00000000006
1901.65625000018
1897.37500000006
1893.15625000018
1889.00000000006
1884.90625000011
1880.87500000017
1876.90624999999
1873.00000000004
1909.06250000012
1904.32421875022
1899.71875000007
1895.24609375018
1890.90625000005
1886.69921875010
1882.62500000016
1878.68359375000
1874.87500000007
1914.25000000000
1908.07812500017
1902.37500000000
1897.14062500014
1892.37500000000
1888.07812500006
1884.25000000010
1880.89062499996
1878
1921.56250000000
1912.91796875023
1905.34375000000
1898.83984375017
1893.40625000000
1889.04296875005
1885.75000000008
1883.52734374998
1882.37500000000
1931
1918.84375000032
1908.62500000000
1900.34375000021
1894
1889.59375000005
1887.12500000004
1886.59375000001
1888
もう1つの注意点。x 値と y 値の小数点以下の桁数が 3 から 2 に、2 から 1 に減らされると (36.01 または 36.1 など)、補間された結果は "期待される" 領域 (1800-2000) に引き寄せられます。負の数と非常に大きな数が消え始めます。
Commons math ライブラリのバージョン 3.3 を使用しています。
これらの値がそのまま補間されている理由についての洞察をいただければ幸いです。ありがとうございました。