📄 5_1_3.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 + -