【C语言实现拉格朗日(lagrange)插值】

【功能】
给定n个结点x_{i}(i=0,1,…,n-1)上的函数值y=f(x_{i}),用拉格朗日(Lagrange)插值公式计算指定插值点t处的函数近似值z=f(t)。
【方法说明】
在给定的n个结点中自动选择k个结点进行插值,且使指定插值点t位于它们的中间。即选取满足条件x_{1}<x_{2}...x_{n-i}<x_{n}的个结点,用n次拉格朗日插值多项式计算插值点t处的函数近似值z=f(t),即
z=\sum_{i=k}^{n+k}y_{i}\prod _{j=k,j\neq k}^{n+k}\frac{t-x_{i}}{x_{i}-x_{j}}
当插值点t靠近n个结点所在区间的某端时,选取的结点将少于k个;而当插值点t位于包含n个结点的区间外时,则仅取区间某端的4个结点进行插值。

//【函数程序】
//Lagrange插值
#include <cmath>
#include <iostream> 
using namespace std;
//x[n] 存放n个给定的有序结点值 
//y[n] 存放n个给定结点上的函数值 
//n 给定结点的个数 
//t 指定插值点 
//函数返回指定插值点t处的函数近似值
double lagrange (double x[], double y[], int n, double t)
{	
	int i,j,k,m; 
	double z,s;
	z=0.0;
	if(n<1) return(z);
	if (n==1)	{z=y[0];return(z);} 
	if (n==2)	{z=(y[0] *(t-x[1])-y[1]*(t-x[0]))/(x[0]-x[1]); return(z);} 
	i=0;
	
	//寻找插值点t所在的位置
	while((x[i]<t)&&(i<n)) i=i+1;
	//取插值区间左端点 
	k=i-4; 	
	if(k<0)k=0;
	//取插值区间右端点
	m=i+3;
	if(m>n-1) m=n-1; 
	for(i=k;i<=m;i++)
	{
		s=1.0;
		for (j=k;j<=m;j++)
		if(j!=i) s=s*(t-x[j])/(x[i]-x[j]); 
		z=z+s*y[i];
	}
return(z);
}
int main()
{
	double t,z;
	//x,y表示列表函数的值
	//t表示在x位置上插值
	//z表示y对应的值
	int k;	
	cout<<"请输入结点的数:";
	cin>>k;
	cout<<endl; 
	double *x=new double[k];
	cout<<"请输入x的值:";
	int i;
	for(i=0;i<k;i++)
	 {
		cin>>x[i]	;
	 } 
	cout<<endl<<"请输入y的值:";
	double *y=new double[k];
	for(i=0;i<k;i++)
	 {
		cin>>y[i]	;
	 } 
	cout<<endl<<"请输入插值点t的值:";
	cin>>t;
	z=lagrange(x,y,k,t);
	cout <<"t =" <<t <<" z=" <<z<<endl; 
return 0;
}

实列演示:

k123456789
x_{k}0.10.20.30.40.50.550.780.840.99
y_{k}123456789

计算结果为:

 

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要用C语言实现拉格朗日二次插值,需要按照以下步骤进行: 1. 定义插值点的坐标和函数值,通常用数组来表示。 2. 根据插值点的坐标,构造拉格朗日插值基函数,这里是二次插值,需要构造三个基函数。 3. 计算插值函数在指定点的值,这里可以用插值基函数和函数值的加权和来表示。 下面是C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> double lagrange(double x, double x0, double x1, double x2, double y0, double y1, double y2) { double L0, L1, L2, f; L0 = (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)); L1 = (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)); L2 = (x - x0) * (x - x1) / ((x2 - x0) * (x2 - x1)); f = y0 * L0 + y1 * L1 + y2 * L2; return f; } int main() { double x, x0, x1, x2, y0, y1, y2, f; printf("请输入三个插值点的坐标和函数值:\n"); scanf("%lf%lf%lf%lf%lf%lf", &x0, &x1, &x2, &y0, &y1, &y2); printf("请输入要求解的自变量值x:\n"); scanf("%lf", &x); f = lagrange(x, x0, x1, x2, y0, y1, y2); printf("在x=%f处的插值函数值为:%f\n", x, f); return 0; } ``` 在代码中,我们先定义了一个lagrange函数,用于计算拉格朗日二次插值函数的值。然后在主函数中,先让用户输入三个插值点的坐标和函数值,然后再输入要求解的自变量值x。最后调用lagrange函数计算插值函数的值,并输出结果。 注意,这里只是演示了如何用C语言实现拉格朗日二次插值,实际使用时还需要根据具体问题进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yasen.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值