数值计算实验三.doc

数值计算实验三课案

附:报告封面要求 计算方法C (2014-2015-2) 【 插值法 】实验报告 、 实验三 插值法的稳定性 实验目的: 掌握插值法的思想,掌握拉格朗日插值、牛顿插值和分段低次插值,分析这些插值法的稳定性。 实验题目: 已知y=cos x,对区间[0,1]作等距划分,节点为,试对下面两种情况分别按指定方案求cos x在0.73333点的近似值( n=10,40,160)。 ⑴以给定节点为插值节点; ⑵仍以给定节点为插值节点,但在cos 0.5上人为增加一个误差0.05。 方案一:用拉格朗日插值公式。 方案二:用牛顿插值公式。 方案三:用分段三次插值。 试比较同一方案对不同的n、不同方案对相同的n的精度情况,分析人为增加的误差对不同方案计算结果的影响。 算法流程图如下: 源程序清单如下: Lagrange.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); newton.c #include iostream using namespace std; #define F(x) (cos(x)) #define Type double //xi为待求的函数值的x值 Type Newton(Type *x, Type *y, int n, Type xi); int main() { int n; cout Newton n= ; cin n; Type *x, *y; x = new Type[n]; y = new Type[n]; for (int i = 0; i n; i++) { x[i] = i*1.0 / n; y[i] = F(x[i]); } cout Newton(x, y, n, 0.73333) endl; delete[]x; delete[]y; return 0; } Type Newton(Type *x, Type *y, int n, Type xi) { Type yi = y[0]; Type *dc = new Type[n + 1];//difference coefficient差商 Type t = 1.0; dc[0] = 0; for (int i = 1; i n; i++) { for (int j = i; j n; j++) { dc[j] = (y[j] - y[j - 1]) / (x[j] - x[j - i]); } t *= (xi - x[i - 1]); yi += t*dc[i]; for (int j = i; j n; j++) { y[j] = dc[j]; } } return yi; } 方案三 #include iostream using namespace std; #define F(x) (cos(x)) #define F1(x) (-sin(x))//F(x)的导数 #define Type double //xi为待求的函数值的x值 Type Hermite(Type *x, Type *y, Type

文档评论(0)

1亿VIP精品文档

相关文档