拉格朗日插值法C语言的实现(实验报告)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)输入已知点的个数; (2)分别输入已知点的 X 坐标; (3)分别输入已知点的 Y 坐标; (4)通过调用函数 lagrange 函数,来求某点所对应的函数值。 拉格朗日插值多项式如下:
L n ( x j ) yk lk ( x j ) y j j 0,1, ……n
k 0 n
k Hale Waihona Puke Baidu0 n
其中 lk ( x )
( x x0 )……(x-x k-1 )(x-x k+1 )……(x-xn ) ( xk x0 )……(xk -xk-1 )(xk -xk+1 )……(xk -xn )
k 0,1, …… ,n
程序流程图:
开始
↓
输入已知点个数 n
↓
输入已知点的 X 坐标以及输 入已知点的 Y 坐标
第 6 页 共 9 页
韩山师范学院
C 语言程序设计
Print( ); printf("是否继续进行插值、计算还是结束?继续插值请输入 1,结束请输入 0,求值计算请输入 2;p="); scanf("%d",&p); 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); printf("Q(x)=%lf",tt); printf("\n"); printf("是否继续进行插值、计算还是结束?继续插值请输入 1,结束请输入 0,求值计 算请输入 2;p="); scanf("%d",&p); printf("\n"); } else break; } } void Print( ) { int k,j; 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) { int j,k,t,N;N=n; n+=m; double *x1;
举例如下: 已知当 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) ; void Insert(int m); void Print( ); void NewTon(int m) { double tt; Insert(m);
第 5 页 共 9 页
韩山师范学院
C 语言程序设计
printf("\n"); for(i=0;i<=n-1;i++) { 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(); }
l (x) 其中 k
程序流程图:
(xx0)… … (x-xk-1)(x-xk+1)… … (x-xn) k 0,1 ,… … ,n (xk x0)… … (xk-xk-1)(xk-xk+1)… … (xk-xn)
开始
↓
输入已知点个数 n
↓
输入已知点的 X 坐标以及输入已知点的 Y 坐标
↓
调用函数 lagrange 函数
第 9 页 共 9 页
第 7 页 共 9 页
韩山师范学院
C 语言程序设计
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]; } 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>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; } 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; }
第 2 页 共 9 页
韩山师范学院
C 语言程序设计
printf("x=%f,y=%f\n",xx,yy); getch(); } 运行结果: 已知当 x=-2.00,2.00,5.00 时 f(x)=0.00,3.00,6.00,求 f(1.2), f(-1.2)的值。 运行结果如下:
学习心得: 通过完成拉格朗日插值法 C 语言的实现这个实验,我重新复习到了 C 语言的语法,也深刻地体 会到运用计算机对完成复杂的数值计算的方便。 【教师评语和成绩】
第 8 页 共 9 页
韩山师范学院
C 语言程序设计
y[N+j]/=ss; } } 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() { printf("请输入插值点个数 num="); scanf("%d",&num); NewTon(num); printf("结束"); }
↓
调用函数 lagrange 函数
第 4 页 共 9 页
韩山师范学院
C 语言程序设计
↓
输出结果 程序如下: #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; /*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]); 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; } 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]); }
成绩:
指导教师:
日期:
第 3 页 共 9 页
韩山师范学院
C 语言程序设计
算法 2 实验
一 .拉格朗日插值法 C 语言的实现
1.实验目的:
进一步熟悉拉格朗日插值法。 掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:
已知:某些点的坐标以及点数。 输入:条件点数以及这些点的坐标 。 输出:根据给定的点求出其对应的拉格朗日插值多项式的值 。
↓
输出结果
第 1 页 共 9 页
韩山师范学院
C 语言程序设计
源程序: #include <stdio.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() { 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) { 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++) { printf("y[%d]:",i);scanf("%f",&y[i]); } printf("\n"); printf("Input xx:"); scanf("%f",&xx); yy=lagrange(x,y,xx,n);
韩山师范学院
C 语言程序设计
实验名称: 实验一:拉格朗日插值法 C 语言的实现 任课教师: 赖国明 【实验目的】 专业: 数学与应用数学 学号: 2009111437
日期: 姓名:
2011-9-19 郑永锋
1、进一步熟悉拉格朗日插值法。 2、掌握编程语言字符处理程序的设计和调试技术。
【实验内容】 (题目)作出插值点(-2.00,0.00) , (2.00,5.00) , (5.00,6.00)的二次 Lagrange 插值多项式 L2 (x) ,并计算 L2 (-1.2), L2 (1.2)。 解题思路:
3.程序流程:
(1)输入已知点的个数; (2)分别输入已知点的 X 坐标; (3)分别输入已知点的 Y 坐标; (4)通过调用函数 lagrange 函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
L n ( x j ) yk lk ( x j ) y j j 0,1, ……n