计算方法上机实习报告5 - 华中科技大学.doc
文本预览下载声明
计算方法上机实习报告5
提出问题
给出概率积分
的数据表:
0.46 0.47 0.48 0.49 0.4846555 0.4937542 0.5027498 0.5116683 试用二次插值计算。
已知的函数表
1.5 1.6 1.7 0.99749 0.99957 0.99166 试构造出差商表,利用二次Newton插值公式计算sin1.609(保留五位有效数字)。
求不高于4次的多项式,使它满足并写出余项表达式。
用最小二乘法求一个形如的经验公式,使与下列数据相拟合
x 19 25 31 38 41 y 19.0 32.3 49.0 73.3 97.8
分析问题
(1)题目给出概率积分的四个插值节点,要求用二次插值计算,而我们知道二次插值只需要三个插值节点即可,在该题中我们尝试取前三个点作为插值节点。
该题的重点在求插值基函数而它们由公式
给出。而给出插值公式。
(2)Newton基本插值公式
它的各项系数就是函数的各阶差商,每增加一个插值节点,只需要在原来的基础上多计算一项,这一性质被称作承袭性。
(3)该题需要确定一个4次插值多项式,就是要获得其各项系数的解。4次多项式有5个系数,而题目正好给予了5个条件,这样我们会获得关于系数的非奇异五元一次方程组,在运用第三章的选列主元消元法求出各系数。
(4)本题要求用最小二乘法求经验公式。实际上也就是确定拟合曲线的各项系数,关于系数的线性方程组如下:
三.解决问题
(1)C语言代码如下:
#includestdio.h
#includeiostream.h
#includemath.h
#define N 3
void Get_l(int k,double x,double xk[N],double L[N]);
void main()
{ int i;
double l[N],L[N],x,Lx=0;
double xk[N]={0.46,0.47,0.48};
double f[N]={0.4846555,0.4937542,0.5027498};
printf(输入需插值节点x:\n);
scanf(%lf,x);
for(i=0;iN;i++)
{ Get_l(i,x,xk,l);
L[i]=l[i]*f[i];
Lx+=L[i];
}
cout.precision(7);
coutf(x)=Lxendl;
}
/*获得基函数lk(x)*/
void Get_l(int i,double x,double xk[N],double l[N])
{ int k;
double y1=1,y2=1;
for(k=0;kN;k++)
if(k!=i)
{ y1*=(x-xk[k]);
y2*=(xk[i]-xk[k]);
}
l[i]=y1/y2;
}
结果如下:
(2)C语言代码如下:
#includestdio.h
#includemath.h
#define N 3
#define M 4
void Put_out(int i,double a[N][M]);
double Get_value(double x,double a[N][M]);
void main()
{ int i,j;
double a[N][M],sinx,x1;
double x[N]={1.5,1.6,1.7};
double f[N]={0.99749,0.99957,0.99166};
for(i=0;iN;i++)
{ a[i][0]=x[i];
a[i][1]=f[i];
}
for(i=0;iN;i++)
Put_out(i,a);
printf(k\tf(xk)\t\tf(x0,xk)\tf(x0,x1,xk)\tf(x0,x1,x2,xk)\n);
for(i=0;iN;i++)
{ printf(%d\t,i);
for(j=0;ji+2;j++)
{ printf(%lf\t,a[i][j]);
}
printf(\n);
}
printf(Putin x:\n);
scanf(%lf,x1);
sinx=Get_value(x1,a);
printf(sin(%lf)=%lf\n,x1,sinx);
}
/*输出差商表*/
void Put_out(int i,double a[N][M])
{ int j;
for(j=2;jM;j++)
{ if(ji)
a[i][j]=(a[i][j-1]-a[0][j-1])/(a[i][0]-a[j-1][0]);
if(ji+2
显示全部