gpt4 book ai didi

java - 使用 Apache Commons Math 插值函数

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:32:39 30 4
gpt4 key购买 nike

我正在尝试实现一些插值函数来绘制一些值,其中 X 值 = Date.seconds 且 Y 值 = double。

我一直在研究使用 Apache Commons Math 库来实现这一点,并且我找到了一种我认为可以使用的方法 here

我试图理解的方法:

public double linearInterp(double[] x, double[] y, double xi) {
// return linear interpolation of (x,y) on xi
LinearInterpolator li = new LinearInterpolator();
PolynomialSplineFunction psf = li.interpolate(x, y);
double yi = psf.value(xi);
return yi;
}

我不明白应该从哪里获取 xi 值?

xi 是什么 我要为 xi 将什么值传递给此方法,我是否应该遍历我的 X 值数组并传入 X 的第 i 个元素用 XY 的数组?

当我想绘制这个新数据时,我是否使用返回的 yi 和传入的 xi 来绘制?

最佳答案

interpolate 方法需要对数组(这里称为 xy)并返回一个函数(psf) 尽可能符合这些值。

此函数然后用于插入给定 xi 值的 yi 值(通常不包含在用于定义函数的 x/y 数组中)。

所以你有一对包含定义函数的 x 和 y 值,并使用这个函数来插入缺失值。

参见 userguide在 Apache Commons 上(第 4.4 章:插值)。


例子:

badly drawn example of a spline interpolation

绿点是已知值对。它们由 xy 值数组定义。

调用 interpolate 时,返回的 PolynomialSplineFunction 返回使用已知值对逼近的函数。函数的形状由 UnivariateInterpolator 的类型定义。那是用过的。在问题示例中,使用了 LinearInterpolator。该图显示了样条插值器返回的函数。

红点表示插值函数上具有未知 y 值的值(在问题示例中,这将是 x 值为 xi 的值)。

如果您需要计算多个额外值,请使用这样的函数

public double[] linearInterp(double[] x, double[] y, double[] xi) {
LinearInterpolator li = new LinearInterpolator(); // or other interpolator
PolynomialSplineFunction psf = li.interpolate(x, y);

double[] yi = new double[xi.length];
for (int i = 0; i < xi.length; i++) {
yi[i] = psf.value(xi[i]);
}
return yi;
}

一个计算例子:

public class Interpolate {

public static void main(String[] args) {
double[] x = { 0, 50, 100 };
double[] y = { 0, 50, 200 };

LinearInterpolator interp = new LinearInterpolator();
PolynomialSplineFunction f = interp.interpolate(x, y);

System.out.println("Piecewise functions:");
Arrays.stream(f.getPolynomials()).forEach(System.out::println);

double value = f.value(70);
System.out.println("y for xi = 70: " + value);
}
}

给出三个已知值对:

(0, 0)
(50, 50)
(100, 200)

一个值未知:

(70, ?)

LinearInterpolator 对给定值进行插值并生成一个包含两个分段线性多项式的函数:

y = x             (for x values < 50)
y = 50 + 3 * x (for x-values >= 50)

内插的xi的值(这里:70)是

y = 50 + 3 * (70 - 50) = 110

关于java - 使用 Apache Commons Math 插值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523396/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com