拉格朗日插值法的定義(引自維基百科)
對某個多項式函數,已知有給定的k + 1個取值點:
(x0,y0),(x1,y1),(x2,y2),⋯⋯,(xk,yk)
其中xj對應着自變量的位置,而yj對應着函數在這個位置的取值。
假設任意兩個不同的xj都互不相同,那麼應用拉格朗日插值公式所得到的拉格朗日插值多項式爲:
具體的
import java.util.Scanner;
public class Lagrange {
private static double[] Lag(double x[],double y[],double x0[]){
int m=x.length;
int n=x0.length;
double y0[]=new double[n];
for(int ia=0;ia<n;ia++) {
double j=0;
for(int ib=0;ib<m;ib++) {
double k=1;
for(int ic=0;ic<m;ic++) {
if(ib!=ic){
k=k*(x0[ia]-x[ic])/(x[ib]-x[ic]);
}
}
k=k*y[ib];
j=j+k;
}
y0[ia]=j;
}
return y0;
}
public static void main(String[] args) {
System.out.println("請輸入給定的插值點數量:");
Scanner input=new Scanner(System.in);
int m=input.nextInt();
System.out.println("請輸入需求解的插值點數量:");
int n=input.nextInt();
double x[]=new double[m];
double y[]=new double[m];
double x0[]=new double[n];
System.out.println("依次輸入給定的插值點:");
for(int i=0;i<m;i++){
x[i]=input.nextDouble();
}
System.out.println("依次輸入給定的插值點對應的函數值:");
for(int i=0;i<m;i++){
y[i]=input.nextDouble();
}
System.out.println("依次輸入需求解的插值點");
for(int i=0;i<n;i++){
x0[i]=input.nextDouble();
}
double y0[]=Lag(x, y, x0);
System.out.println("運用拉格朗日插值法求解得:");
for(int i=0;i<n;i++){
System.out.println(y0[i]+" ");
}
System.out.println();
input.close();
}
}
拉格朗日插值法的缺點在於插值點較多時計算出的結果不穩定,可以以定義一個重心權的方式進行改進,這種經過改良的插值法一般稱作重心拉格朗日插值法。