在Java中实现拉格朗日插值法

Posted 望山海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java中实现拉格朗日插值法相关的知识,希望对你有一定的参考价值。

拉格朗日插值法的定义(引自维基百科)

 

对某个多项式函数,已知有给定的k + 1个取值点:

 (x0,y0),(x1,y1),(x2,y2),⋯⋯,(xk,yk)

其中xj对应着自变量的位置,而yj对应着函数在这个位置的取值。

假设任意两个不同的xj都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:

其中每个\\ell _{j}(x)拉格朗日基本多项式(或称插值基函数),其表达式为:

\\ell _{j}(x):=\\prod _{{i=0,\\,i\\neq j}}^{{k}}{\\frac  {x-x_{i}}{x_{j}-x_{i}}}={\\frac  {(x-x_{0})}{(x_{j}-x_{0})}}\\cdots {\\frac  {(x-x_{{j-1}})}{(x_{j}-x_{{j-1}})}}{\\frac  {(x-x_{{j+1}})}{(x_{j}-x_{{j+1}})}}\\cdots {\\frac  {(x-x_{{k}})}{(x_{j}-x_{{k}})}}.

 

 

具体的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 }
代码

 

 

 

拉格朗日插值法的缺点在于插值点较多时计算出的结果不稳定,可以以定义一个重心权的方式进行改进,这种经过改良的插值法一般称作重心拉格朗日插值法。

以上是关于在Java中实现拉格朗日插值法的主要内容,如果未能解决你的问题,请参考以下文章

拉格朗日插值法

拉格朗日插值Python代码实现

拉格朗日插值方法

拉格朗日插值公式

数据插补—拉格朗日插值法

拉格朗日插值公式