Java上的插值和导数

时间:2015-03-07 12:07:50

标签: java numerical-methods apache-commons-math

我正在尝试制作一个涉及从原始数据及其衍生物计算插值的项目。 我有两个看起来像这样的数组:

A = { 1, 2, 3, 4, ... , n }
B = { 0.23, 0.43, 0.24, 0.19, ... , n }

我想要一个函数来描述以下数组,所以我使用apache-common-math库来插入将描述函数的多项式,其中:F(A [i])= B [i]。 之后,我希望计算此函数的导数,以便能够找到极值(最大/最小)。

出于某种原因,我在衍生部分遇到了麻烦。

目前正在使用:

        DividedDifferenceInterpolator devider = new DividedDifferenceInterpolator();
        PolynomialFunctionNewtonForm polynom = devider.interpolate(xArray,  
        yArray);

现在我有了多项式,这是代表我以前的数组的函数。 我该如何计算其衍生物??

感谢。

2 个答案:

答案 0 :(得分:1)

您可以通过从牛顿形式多项式中提取系数,从中创建PolynomialFunction然后使用该函数的derivative方法来获得导数。这是一个例子:

double[] x = {0, 1, 2, 3, 4, 5};
double[] y = new double[6];
for (int i = 0; i < 6; i++) {
    y[i] = 1 + 2 * x[i] + 3 * x[i] * x[i];
}
DividedDifferenceInterpolator divider = new DividedDifferenceInterpolator();
PolynomialFunctionNewtonForm polynom = divider.interpolate(x, y);
double[] coefficients = polynom.getCoefficients();
System.out.println(Arrays.toString(coefficients));
PolynomialFunction derivative =
 (PolynomialFunction) new PolynomialFunction(coefficients).derivative();
System.out.println(Arrays.toString(derivative.getCoefficients()));

上面的代码从多项式y = 1 + 2x + 3x ^ 2生成点。输出应为

[1.0, 2.0, 3.0, 0.0, 0.0, 0.0]
[2.0, 6.0]

答案 1 :(得分:0)

通过使用拉格朗日多项式而不是使用库,您可以很容易地找到多项式的导数。

您可以编写一个简单的函数(从apache Commons实现UnivariateFunction)。请参阅this page上@Krokop的等式。

然后你可以使用公共数学given here中的根查找库,查看页面上给出的“典型用法”。

我不确定是否有更简单的方法。