拉格朗日插值法

146 阅读1分钟

拉格朗日插值法是数值分析中的一中算法,是通过已有的数据集来实现函数拟合,最终实现推导和预测的一种数学工具。

一般概念:


若已知在互不相同 n+1 个点处的函数值(即该函数过这n+1个点),则可以考虑构造一个过这n+1个点的、次数不超过n的多项式 ,使其满足:要估计任一点ξ,ξ≠xi,i=0,1,2,...,n,则可以用Pn(ξ)的值作为准确值f(ξ)的近似值,此方法叫做“插值法”。称式(*)为插值条件(准则),含xi(i=0,1,...,n)的最小区间[a,b],其中a=min{x0,x1,...,xn},b=max{x0,x1,...,xn}。

Java代码实现:

int[] xArray = new int[]{1, 2, 3, 4, 5};
//返回数组中对应索引的值
public int fx(int[] array, int i) {
    return array[i];
}

public double lk(int[] array, int x, int k) {
    return differenceOfArray(array, x, k) / differenceOfArray(array, -1, k);
}
//计算已有数据集中除了第k个之外的两两之差的乘积
public int differenceOfArray(int[] array, int x, int k) {
    int result = 1;
    for (int i = 0; i < array.length; i++) {
        if (k >= 0 && i == k) {
            continue;
        }
        if (x >= 0) {
            result *= (x - array[i]);
        } else {
            result *= (array[k] - array[i]);
        }
    }
    return result;
}
//求插值的函数,根据已有的array,输入待求的x,得出x处应该插入的值
public double Lx(int[] array, int x) {
    double a = 0;
    for (int i = 0; i < array.length; i++) {
        a += lk(array, x, i) * fx(array, i);
    }
    return a;
}

public static void main(String[] args) {
    LagrangeInterpolation li = new LagrangeInterpolation();
    double lx = li.Lx(li.xArray, 89);
    System.out.println(lx);
}