Lagrange插值法的实现——C\Java\Python

Lagrange 插值法

 

一、问题

对于给定的一元函数  的 个节点值 。试用Lagrange公式求其插值多项式或分段三次Lagrange插值多项式。 数据如下:

(1)

 xi

0.4

0.55

0.65

0.80

0.95

1.05

 yi

0.41075

0.57815

0.69675

0.90

1.00

1.25382

 

求五次Lagrange多项式L5(x) ,和分段线性插值多项式,计算f(0.96),f(0.99)

 

 

 

        

L5(x)=y0l0(x)+y1l1(x)+y2l2(x)+y3l3(x)+y4l4(x)+y5l5(x)

 

                         其中:y0=0.41075,y1=0.57815,y2=0.69675,y3=0.90,y4=1.00,y5=1.25382

 

 

 

 

f(0.96)=1.010051 ,f(0.99)=1.054230

(2)

 xi

1

2

3

4

5

6

7

 yi

0.368

0.135

0.050

0.018

0.007

0.002

0.001

 试构造Language多项式L6(x),计算f(1.8)的值.(提示:f(1.8≈0.164762)

 

 

 

其余与Language多项式L5(x)类似,不多重复

 

二、方法简介

                1、 利用Lagrange插值公式

 

 

编写出插值多项式程序. 上式中 为插值基函数,

 

 

 

 它满足:

        

 

 

   2、 给出插值多项式或分段线性插值多项式的表达式;

 3、 结合解线性方程组的高斯消法,解下面的线性方程组确定多项式的系数,并对比插值所得结果的异同

 

C代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//==================================================
#include<stdio.h>
#include<stdlib.h>
#define N 6
double xi[] = {0.4, 0.55, 0.65, 0.80, 0.95, 1.05};   
            //全局变量
double yi[] = {0.41075, 0.57815, 0.69675, 0.90, 1.00, 1.25382};
 
void main()
{
    double lagrange(double x);
    double x, y;
    FILE *file;
    file = fopen("d:\\data.txt", "w");
    for (x=0.4; x<=1.05; x = x + 0.01)
    {
        y = lagrange(x);
        printf("x = %f, y = %f\n", x, y);
        fprintf(file, "{%f, %f},", x, y);
    }
    fclose(file);
}
 
double lagrange(double x)
{
    int j, k;
    double y = 0, t, fenzi, fenmu;
    for (k = 0; k <= N-1; k++)
    {
        fenzi = 1;
        fenmu = 1;
        for (j=0; j<=N-1; j++)
        {
            if (j != k)
            {
                fenzi = fenzi * (x - xi[j]);
                fenmu = fenmu * (xi[k] - xi[j]);
            }
        }
        t = yi[k] * fenzi / fenmu;
        y = y + t;
    }
    return y;
}
 //-----------------------------------------------------------

 Java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.Scanner;
 
public class abc {
    public static void main(String args[]){
        Scanner reader =new Scanner(System.in);
        System.out.println("请输待处理的数据长度:");
        int N = reader.nextInt();
        double xi[] = new double[N];
        double yi[] = new double[N];
        System.out.println("请依次输入给定的插值点xi:");
        for(int i = 0;i < xi.length;i++)
        {
            xi[i] = reader.nextDouble();
        }
        System.out.println("请依次输入给定插值点对应的函数值yi:");
        for(int j = 0;j < yi.length;j++)
        {
            yi[j] = reader.nextDouble();
        }
        double x,x2;
 
        System.out.println("运用拉格朗日插值法解得:");
        for(x=xi[0];x<=xi[xi.length-1];x+=0.01)
        {
            Lagrange M;
            M=new Lagrange(xi,yi,x);
            System.out.printf("f(%4.2f)=%f\t",x,M.pt());
        }
        System.out.println();
        System.out.println("请输入单独求的数值数目为:");
        int Num = reader.nextInt();
        System.out.println("要求的x值为:");
        double x3[]=new double[Num];
        for(int i=0;i<Num;i++){
            x3[i] = reader.nextDouble();
        }
        for(int j=0;j<Num;j++){
            double Num_x=x3[j];
            Lagrange L = new Lagrange(xi,yi,Num_x);
            System.out.println("f("+Num_x+")="+L.pt());
        }
    }
}
 
class Lagrange{
    int j,k,m,n;
    double fz,fm,x,y =0,t,A[],B[];
    Lagrange(double a[],double b[],double c) {
        m = a.length;
        n = b.length;
        x = c;
        A = a;
        B = b;
    }
    double pt(){
        for(k=0;k<m;k++){
            fz=1;
            fm=1;
            for(j=0;j<n;j++){
                if(j!=k)
                {
                    fz=fz*(x-A[j]);
                    fm=fm*(A[k]-A[j]);
                }
            }
            t = B[k]*fz/fm;
            y = y+t;
        }
        return y;
    }
}

 

 待续...

posted @   轻拥一世温柔  阅读(891)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today!
点击右上角即可分享
微信分享提示