Нахождение производной функции сплайна в Java - PullRequest
0 голосов
/ 29 июня 2018

В настоящее время я нахожу кубический сплайн необработанных данных:

    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 голосов
/ 29 июня 2018

interpolator.interpolate(y, x) возвращает PolynomialSplineFunction, который расширяет следующие интерфейсы:

  1. ДифференцируемаяУниверсальная функция (устарела)
  2. UnivariateDifferentiableFunction
  3. UnivariateFunction

Единственное, что вы можете сделать, вместо использования UnivariateFunction и UnivariateInterpolator, вы можете использовать UnivariateDifferentiableFunction и SplineInterpolator следующим образом:

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 Spline. Natural Cubic Spline для ваших x и y enter image description here
Поскольку вы пытаетесь оценить первую производную на 2.0, интересующая функция:

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

Взятие первой производной:

f'(x) = 3.3588 x^2 - 0.8612 x + 0.4546

Теперь подключаем 2 к f'(x)

f'(2) = 12.1674

Что подтверждает результаты, полученные нами ранее.

...