我目前正在找到原始数据的三次样条:
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)));
但是,这看起来有些冗长,但却无法返回正确的答案。有什么建议吗?
谢谢
答案 0 :(得分:1)
interpolator.interpolate(y, x)
返回扩展了以下接口的PolynomialSplineFunction
:
您可以做的一件事是,可以像下面这样使用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
的{{1}}是
由于您尝试评估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)
证实了我们先前获得的结果。