⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5_1_3.c

📁 用拉格朗日插值多项式求函数近似值 在visual C++ 6.0可以查看源代码
💻 C
字号:
#include<stdio.h>

#define N 10

int n;//n+1为节点数
float x[N+1];//存放n+1个节点
float xi[N];//存放li(x)的分子中含有的x
float y[N+1];//存放n+1个节点的函数值
float li[N+1][N+1];//存放n+1个n次多项式li(x)
float Ln[N+1];//存放n次拉格朗日插值多项式

int a[N];

main()
{
	int i;
	//int j;
	
	void get_li();//获得n+1个n次多项式li(x)
	void get_Ln();//获得n次拉格朗日插值多项式
	void print_Ln();//打印n次拉格朗日插值多项式
		
	printf("please input n:\n");
	scanf("%d",&n);

	printf("please input x:\n");
	for(i=0;i<=n;i++)
	{
		scanf("%f",&x[i]);
	}

	/*for(i=0;i<=n;i++)
	{
		printf("%f ",x[i]);
	}
	printf("\n");*/


	printf("please input y:\n");
	for(i=0;i<=n;i++)
	{
		scanf("%f",&y[i]);
	}

	/*for(i=0;i<=n;i++)
	{
		printf("%f ",y[i]);
	}
	printf("\n");*/
	

	get_li();
	/*for(i=0;i<=n;i++)
	{
		printf("l%d(x):",i);
		for(j=0;j<=n;j++)
		{
			printf("%f ",li[i][j]);
		}
		printf("\n");
	}*/
	get_Ln();
	/*for(i=0;i<=n;i++)
	{
		printf("l%d(x):",i);
		for(j=0;j<=n;j++)
		{
			printf("%f ",li[i][j]);
		}
		printf("\n");
	}*/
	print_Ln();
	
}

void get_Ln()//获得n次拉格朗日插值多项式
{
	int i,j;
	for(i=0;i<=n;i++)
	{
		for(j=0;j<=n;j++)
		{
			li[i][j]=y[i]*li[i][j];
		}
	}
	for(i=0;i<=n;i++)
	{
		Ln[i]=0;
		for(j=0;j<=n;j++)
		{
			Ln[i]=Ln[i]+li[j][i];
		}
	}
}
void print_Ln()//打印n次拉格朗日插值多项式
{
	int i;
	printf("%f*X^%d",Ln[n],n);
	for(i=n-1;i>=0;i--)
	{
		if(i==1)
		{
			if(Ln[i]>0)
			{
				printf("+%f*X",Ln[i]);
			}
			if(Ln[i]==0)
			{
				printf("");
			}
			if(Ln[i]<0)
			{
				printf("%f*X",Ln[i]);
			}
		}
		if(i==0)
		{
			if(Ln[i]>0)
			{
				printf("+%f",Ln[i]);
			}
			if(Ln[i]==0)
			{
				printf("");
			}
			if(Ln[i]<0)
			{
				printf("%f",Ln[i]);
			}
		}
		if(i>1)
		{
			if(Ln[i]>0)
			{
				printf("+%f*X^%d",Ln[i],i);
			}
			if(Ln[i]==0)
			{
				printf("");
			}	
			if(Ln[i]<0)
			{
				printf("%f*X^%d",Ln[i],i);
			}
		}
	}
	printf("\n");
}

void get_li()
{
	int i,j;

	float getFenMu(int i);//得到li(x)各系数的分母
	float getXiShu(int i,int m);//得到li(x)的m次项的系数的分子

	for(i=0;i<=n;i++)
	{
		li[i][n]=1/getFenMu(i);
		//printf("li[%d][n]=%f\n",i,li[i][n]);
		for(j=n-1;j>=0;j--)
		{
			li[i][j]=getXiShu(i,j)/getFenMu(i);
			//printf("l%d的%d次项的分子 %f\n",i,j,getXiShu(i,n-j));
		}
		//printf("%d的分母%f\n",i,getFenMu(i));
	}
}

float getFenMu(int i)
{
	float fm=1.0;
	int j;
	for(j=0;j<=n;j++)
	{
		if(j!=i) 
		{
			fm=fm*(x[i]-x[j]);
		}
	}
	return fm;
}

float getXiShu(int i,int m)
{
	int tm;
	float fz=0.0;
	int j;
	void f(int i,int tm,int m,float *fz);
	for(j=0;j<=n;j++)
	{
		if(j<i)
		{
			xi[j]=x[j];
		}
		else if(j>i)
		{
			xi[j-1]=x[j];
		}
	}
	/*for(j=0;j<n;j++)
	{
		printf("%.2f ",xi[j]);
	}
	printf("\n");*/
	
	m=n-m;
	tm=m;

	a[m+1]=-1;
	j=-1;

	f(i,tm,m,&fz);

	return fz;

	
}

void f(int i,int tm,int m,float *fz)
{
	int t=m;
	float temp=1.0;
	if(tm>1)
	{
		for(a[tm]=a[tm+1]+1;a[tm]<n;a[tm]++)
		{
			f(i,tm-1,m,fz);	
		}
	}
	else 
	{
		for(a[tm]=a[tm+1]+1;a[tm]<n;a[tm]++)
		{
			for(;m>0;m--)
			{
				temp=temp*(-xi[a[m]]);
				//printf("xi[%d]=%f\n",a[m],xi[a[m]]);
			}
			m=t;
			//printf("temp=%f\n",temp);
			*fz=*fz+temp;
			temp=1.0;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -