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; } } |
待续...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构