查找Java中样条函数的派生词

时间:2018-06-29 18:00:10

标签: java apache spline derivative

我目前正在找到原始数据的三次样条:

    double y[] = { 0.0, 1.0, 2.0,3.0,4.0,5.0 };
    double x[] = { 0.0, 1.0, 8.0, 27.0, 64, 125};
    //these arrays are just an example

    UnivariateInterpolator interpolator = new SplineInterpolator();
    UnivariateFunction spline = interpolator.interpolate(y, x);
    double interpolatedY = spline.value(5.0);

我在程序的另一部分中使用了interpolatedY变量。我还需要找到UnivariateFuction样条的导数,以便可以计算y'(x),其中x可以是任何值。我尝试使用以下方法:

  // function to be differentiated
    UnivariateFunction basicF = new UnivariateFunction() {
                                    public double value(double x) {
                                        return spline.value(x);
                                    }
                                };

// create a differentiator using 5 points and 0.01 step
 FiniteDifferencesDifferentiator differentiator =
         new FiniteDifferencesDifferentiator(51, 0.01);

 UnivariateDifferentiableFunction completeF = differentiator.differentiate(basicF);

System.out.println("y'(x=2) = " + completeF.value(new DerivativeStructure(1,1,0,2).getPartialDerivative(1)));

但是,这看起来有些冗长,但却无法返回正确的答案。有什么建议吗?

谢谢

1 个答案:

答案 0 :(得分:1)

interpolator.interpolate(y, x)返回扩展了以下接口的PolynomialSplineFunction

  
      
  1. DifferentiableUnivariateFunction (deprecated)
  2.   
  3. UnivariateDifferentiableFunction
  4.   
  5. UnivariateFunction
  6.   

您可以做的一件事是,可以像下面这样使用UnivariateFunctionUnivariateInterpolator来代替UnivariateDifferentiableFunctionSplineInterpolator

SplineInterpolator interpolator = new SplineInterpolator();
UnivariateDifferentiableFunction spline = interpolator.interpolate(y, x);
double interpolatedY = spline.value(5.0);

DerivativeStructure ds = spline.value(new DerivativeStructure(1, 1, 0, 2));
System.out.println(ds.getPartialDerivative(1));

输出

// Function to interpolate f(x) = x^3
// First order derivative  f'(x) = 3x^2
// f'(2) = 12.0
Approximation: 12.167464114832537
Theoretical:   12.0

注释

在内部,样条插值器计算Natural Cubic SplineNatural Cubic Splinex的{​​{1}}是 enter image description here
由于您尝试评估y的一阶导数,因此感兴趣的函数为:

2.0

取一阶导数:

f(x) = 1.1196 x^3 - 0.43062 x^2 + 0.45455 x - 0.14354  

现在将2插入f'(x) = 3.3588 x^2 - 0.8612 x + 0.4546

f'(x)

证实了我们先前获得的结果。