1

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

还有一点需要注意。当 x 和 y 值(例如 36.01 或 36.1)的小数点数从 3 减少到 2 和 2 减少到 1 时,内插结果趋向于“预期”范围(1800-2000)。负数和极大数开始消失。

我正在使用公共数学库的 3.3 版。

任何关于为什么这些值被插值的见解将不胜感激。谢谢你。

4

0 回答 0