[英]Interpolate function using Apache Commons Math
我正在嘗試實現一些插值函數來繪制一些值,其中X值= Date.seconds,Y值= double。
我一直在研究使用Apache Commons Math
lib來實現這個目標,我發現了一個我認為我可以在這里使用的方法
我試圖理解的方法:
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
值?
什么是我傳璽什么價值這個方法十一,我在通過我的陣列應該循環X
值和傳遞的第i個元素X
與陣列X
和Y
?
當我想繪制這個新數據時,我是否使用返回的yi
以及傳入的xi
來繪制?
interpolate
方法需要對的數組(此處稱為x
和y
)並返回一個盡可能符合這些值的函數( psf
)。
然后,該函數用於內插給定xi值的yi值(通常不包含在用於定義函數的x / y數組中)。
因此,您有包含定義函數的x值和y值的對,並使用此函數來插入缺失值。
見userguide在Apache下議院(第4.4章:插值)。
例:
綠點是已知的值對。 這些由x
和y
值數組定義。
調用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.