拉格朗日插值法C语言的实现(实验报告)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)分别输入已知点的Y坐标;
(4)通过调用函数lagrange函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
其中
程序流程图:




程序如下:
#include <iostream>
#include <conio.h>
#include <malloc.h>
float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/
{
int i,j;
float *a,yy=0.0;
for(i=0;i<=n-1;i++)
{
a[i]=y[i];
for(j=0;j<=n-1;j++)
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
free(a);
return yy;
}
int main()
void Insert(int m);
void Print( );
void NewTon(int m)
{
double tt;
Insert(m);
Print( );
printf("是否继续进行插值、计算还是结束?继续插值请输入1,结束请输入0,求值计算请输入2;p=");
scanf("%d",&p);
{
printf("y[%d]:",i);scanf("%f",&y[i]);
}
printf("\n");
printf("Input xx:");
scanf("%f",&xx);
yy=lagrange(x,y,xx,n);
printf("x=%f,y=%f\n",xx,yy);
getch();
}
举例如下:
printf("\n");
while(p!=0)
{
if(p==1)
{
printf("请输入再次插值点个数num=");
scanf("%d",&num);
NewTon(num);
}
else if(p==2)
{
printf("请输入x=");
scanf("%lf",&tt);
tt=Calculate(tt);
yy+=a[i];
}
free(a);
return yy;
}
int main()
{
int i;
int n;
float x[20],y[20],xx,yy;
printf("Input n:");
scanf("%d",&n);
if(n>=20)
{
printf("Error!The value of n must in (0,20)."); getch();return 1;
{
printf("y[%d]:",i);scanf("%f",&y[i]);
}
printf("\n");
printf("Input xx:");
scanf("%f",&xx);
yy=lagrange(x,y,xx,n);
printf("x=%f,y=%f\n",xx,yy);
getch();
}
运行结果:
{
printf("Error! The value of n must in (0,20)."); getch(); return 1;
}
for(i=0;i<=n-1;i++)
{
printf("x[%d]:",i);
scanf("%f",&x[i]);
}
printf("\n");
for(i=0;i<=n-1;i++)
已知当x=-2.00,2.00,5.00时f(x)=0.00,3.00,6.00,求f(1.2),f(-1.2)的值。
运行结果如下:
学习心得:
通过完成拉格朗日插值法C语言的实现这个实验,我重新复习到了C语言的语法,也深刻地体会到运用计算机对完成复杂的数值计算的方便。
【教师评语和成绩】
成绩:指导教师:日期:
printf("请输入插值点个数num=");
scanf("%d",&num);
NewTon(num);
printf("结束");
}
实验名称:
实验一:拉格朗日插值法C语言的实现
日期:
2011-9-19
任课教师:
赖国明
专业:
数学与应用数学
学号:
2009111437
姓名:
郑永锋
【实验目的】
1、进一步熟悉拉格朗日插值法。
2、掌握编程语言字符处理程序的设计和调试技术。
【实验内容】
(题目)作出插值点(-2.00,0.00),(2.00,5.00),(5.00,6.00)的二次Lagrange插值多项式L2(x),并计算L2(-1.2), L2(1.2)。
算法2实验一.拉格朗日插值法C语言的实现
1.实验目的:
进一步熟悉拉格朗日插值法。
掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:
已知:某些点的坐标以及点数。
输入:条件点数以及这些点的坐标。
输出:根据给定的点求出其对应的拉格朗日插值多项式的值。
3.程序流程:
(1)输入已知点的个数;
(2)分别输入已知点的X坐标;
{
int j,k,t,N;N=n;
n+=m;
double *x1;
double *y1;
x1=(double*)malloc(n*sizeof(double));
y1=(double*)malloc(n*sizeof(double));
for(j=0;j<N;j++)
{
x1[j]=x[j];
y1[j]=y[j];
}
}
double Calculate(double tt)
{
int i,j;
double yy=0;
double xx;for(i=0;i<n;i++)
{
xx=y[i];
for(j=0;j<i;j++)
{
xx=xx*(tt-x[j]);
}
yy+=xx;
}
return yy;
}
void main()
{
{
int i,j;
float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/
a=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
{
a[i]=y[i];
for(j=0;j<=n-1;j++)
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
解题思路:
(1)输入已知点的个数;
(2)分别输入已知点的X坐标;
(3)分别输入已知点的Y坐标;
(4)通过调用函数lagrange函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
其中
程序流程图:




源程序:
#iBiblioteka Baiduclude <stdio.h>
#include <malloc.h>
float lagrange(float *x,float *y,float xx,int n)
}
for(j=0;j<m;j++)
{
printf("请输入第%d个插值点x[%d]=",j+1,N+j);
scanf("%lf",&x1[N+j]);
printf("请输入第%d个插值点y[%d]=",j+1,N+j);
scanf("%lf",&y1[N+j]);
}
x=x1;
y=y1;
printf("\n");
}
if(n<=0)
{
printf("Error! The value of n must in (0,20)."); getch(); return 1;
}
for(i=0;i<=n-1;i++)
{
printf("x[%d]:",i);
scanf("%f",&x[i]);
}
printf("\n");
for(i=0;i<=n-1;i++)
{
int i;
int n;
float x[20],y[20],xx,yy;
printf("Input n:");
scanf("%d",&n);
if(n>=20)
{
printf("Error!The value of n must in (0,20)."); getch();return 1;
}
if(n<=0)
if(N>1)
for(j=0;j<m;j++)
{
double ss=1;
for(k=0;k<N+j;k++)
ss*=x[N+j]-x[k];
for(k=0;k<N+j;k++)
{
double rr=y[k];
for(t=0;t<k;t++)
rr*=x[N+j]-x[t];
y[N+j]-=rr;
}
y[N+j]/=ss;
printf("插值多项式为:Q(x)=%lf",y[0]);
for(j=1;j<n;j++)
{
if(y[j]>=0) printf("+");
printf("%lf",y[j]);
for(k=0;k<j;k++)printf("*(x-%lf)",x[k]);
}
printf("\n");
}
void Insert(int m)
已知当x=1,-1,2时f(x)=0,-3,4,求f(1.5)的值。
运行结果如下:
算法三#include<stdio.h>
#include <stdlib.h>
#define M 20;
int n=0;
int p=1;
int num=0;
double *x;
double *y;
double Calculate(double tt) ;
printf("Q(x)=%lf",tt);
printf("\n");
printf("是否继续进行插值、计算还是结束?继续插值请输入1,结束请输入0,求值计算请输入2;p=");
scanf("%d",&p);
printf("\n");
}
else break;
}
}
void Print( )
{
int k,j;
}
else
for(j=1;j<m;j++)
{
double ss=1;
for(k=0;k<N+j;k++)
ss*=x[N+j]-x[k];
for(k=0;k<N+j;k++)
{
double rr=y[k];
for(t=0;t<k;t++)
rr*=x[N+j]-x[t];
y[N+j]-=rr;
}
y[N+j]/=ss;
相关文档
最新文档