标签:ati ima ext div nbsp font port ide 实现
拉格朗日插值法的定义(引自维基百科)
对某个多项式函数,已知有给定的k + 1个取值点:
(x0,y0),(x1,y1),(x2,y2),??,(xk,yk)
其中xj对应着自变量的位置,而yj对应着函数在这个位置的取值。
假设任意两个不同的xj都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:
其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:
具体的Java代码:
1 import java.util.Scanner; 2 3 4 public class Lagrange { 5 private static double[] Lag(double x[],double y[],double x0[]){ 6 int m=x.length; 7 int n=x0.length; 8 double y0[]=new double[n]; 9 for(int ia=0;ia<n;ia++) { 10 double j=0; 11 for(int ib=0;ib<m;ib++) { 12 double k=1; 13 for(int ic=0;ic<m;ic++) { 14 if(ib!=ic){ 15 k=k*(x0[ia]-x[ic])/(x[ib]-x[ic]); 16 } 17 } 18 k=k*y[ib]; 19 j=j+k; 20 } 21 y0[ia]=j; 22 } 23 return y0; 24 } 25 public static void main(String[] args) { 26 System.out.println("请输入给定的插值点数量:"); 27 Scanner input=new Scanner(System.in); 28 int m=input.nextInt(); 29 System.out.println("请输入需求解的插值点数量:"); 30 int n=input.nextInt(); 31 double x[]=new double[m]; 32 double y[]=new double[m]; 33 double x0[]=new double[n]; 34 System.out.println("依次输入给定的插值点:"); 35 for(int i=0;i<m;i++){ 36 x[i]=input.nextDouble(); 37 } 38 System.out.println("依次输入给定的插值点对应的函数值:"); 39 for(int i=0;i<m;i++){ 40 y[i]=input.nextDouble(); 41 } 42 System.out.println("依次输入需求解的插值点"); 43 for(int i=0;i<n;i++){ 44 x0[i]=input.nextDouble(); 45 } 46 double y0[]=Lag(x, y, x0); 47 System.out.println("运用拉格朗日插值法求解得:"); 48 for(int i=0;i<n;i++){ 49 System.out.println(y0[i]+" "); 50 } 51 System.out.println(); 52 input.close(); 53 } 54 }
拉格朗日插值法的缺点在于插值点较多时计算出的结果不稳定,可以以定义一个重心权的方式进行改进,这种经过改良的插值法一般称作重心拉格朗日插值法。
标签:ati ima ext div nbsp font port ide 实现
原文地址:http://www.cnblogs.com/PabloZeal/p/6618148.html