《数值分析》实验报告 实验室一 插值法
1、实验内容:
已知函数在下列各点处的值为 xi Y(xi) 0.2 0.98 0.4 0.92 0.6 0.81 0.8 0.64 1.0 0.38 试用4次牛顿多项式P4(x)对数据进行插值。给出{(xi,yi)|xi=0.2+0.08i}
2、分析与实现
按牛顿插值法,要得到牛顿插值多项式关键在于求各阶差商,求出后带入牛顿插值公式即可。 要求某点的插值带入插值多项式即可。 通过分析程序实现如下:
#include
//函数功能:求差商,本函数返回一个整型标识:0-失败,不适用此方法; //1-成功, i阶差商保存在数组y[i]中,也就隐形得出牛顿插值多项式。 //参数说明:
//x 双精度实型一维数组,长度为n ,存放给定n 个结点的值(从小到大)
//y 双精度实型一维数组,长度为n ,存放给定n 个结点上的函数值,函数返回时存放i阶差商(i为数组元素下表)
//n 整型变量,给定结点的个数
int newton(double x[], double y[], int n) { if (n <=1) /*结点个数不对,此方法不适用,返回*/ return(0); else { for (int i=1;i
void main()
{ }
double z,s,t=0.2;//t为插值结点
static double x[5] = {0.2,0.4,0.6,0.8,1.0 };
static double y[5] = {0.98,0.92,0.81,0.64,0.38}; int i,flag=1,n=5;
printf(\请输入插值点:\
scanf(\获取待插值结点
flag=newton(x, y, n);//调用求差商的函数,求得牛顿插值多项式中的各阶差商 if (flag==0) { printf(\牛顿插值法不适用于此题!\\n\} else
{//求t点处的牛顿插值 z=y[0]; s=1; for (i=1;i printf(\输出结果 3、实验结果: 实验二 数值积分 1、实验内容 计算积分,用自适应辛普森积分,使其精度达到0.000001。 2、分析与实现 分析辛普森算法,其实现如下,其中simp()实现辛普森算法,fexpression()为被积函数表达式,main()为主函数程序,为了测试。 #include //函数功能:自适应辛普生积分,函数返回一个双精度实型积分值。 //参数说明: //a 双精度实型变量,积分下限。 //b 双精度实型变量,积分上限,要求b>a。 //eps 双精度实型变量,积分精度要求。 //f 双精度函数指针变量,指向计算被积函数值的函数。 double simp(double a,double b, double eps,double (*f)(double)) { int n, k; double h, t1, t2, s1, s2, ep, p , x; n=1; h=b-a; t1=h*((*f)(a)+(*f)(b))/2.0; s1=t1; /*用T1代替S0*/ ep=eps+ 1.0; while (ep>=eps) { p=0.0; for(k=0; k<=n-1; k++) { x=a+(k+0.5)*h; p=p+(*f) (x); } t2=(t1+h*p)/2.0; /*计算T1=(b-a)*(f(a)+f(b))/2*/ s2=(4.0*t2-t1)/3.0; /*计算Sn=(4T2n-Tn)/3*/ ep=fabs(s2-s1); /*计算精度*/ t1=t2; s1=s2; n=n+n; h=h/2.0; } return(s2); } double fexpression(double x)//被积函数表达式y=f(x) { double y; y=log(1.0+x)/(1.0+x*x); return(y); } void main()//主函数程序 { double a, b, eps , t, fexpression(double); a = 0.0; b = 1.0; eps = 0.000001; t=simp(a,b, eps,fexpression); printf(\ printf(\ printf(\} 3、实验结果:
相关推荐: