计算方法与实习
nli??j?0,j?ix?xjxi?xjnLn(x)?式,内层计算
,外层计算
?li?0i(x)y(x)i
C++语言编程源代码如下:
#include
using namespace std; double chazhi(double x){
double
xi[6]={0.30,0.42,0.50,0.58,0.66,0.72},yi[6]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223},li[6]={1,1,1,1,1,1},Ln=0; int i,j;
for(i=0;i<=5;i++){ for(j=0;j<=5;j++){ }
if(j!=i)li[i]*=(x-xi[j])/(xi[i]-xi[j]); }
li[i]*=yi[i]; Ln+=li[i];
return Ln; } int main(){ cout<<\五次插值的结果如下:\ cout<<\时,y=\ }
cout<<\时,y=\cout<<\时,y=\return 0;
实验结果如下:
五次插值的结果如下:
x=0.46时,y=1.100724 x=0.55时,y=1.141271 x=0.60时,y=1.166194 Press any key to continue
习题6、试分别用抛物线
y?a?bx?cx2bx和指数曲线
y?ae拟合下列数据
16
计算方法与实习
xi yi 1 1.5 2 122.65 2.5 159.05 3 189.15 3.5 214.15 4 238.65 4.5 252.50 33.4 79.50 xi 5 5.5 6 6.5 7 7.5 8 yi 267.55 280.50 296.65 301.40 310.40 318.15 325.15
比较两个拟合函数的优劣。
一、抛物线拟合
思路分析
套用最小二乘法的解题思路,先求取正规方程组,再用高斯消元法解得正规方程组的解即为抛物线拟合的系数,a,b,c。
C++语言编程源代码如下:
#include
double
x[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8},y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,
267.55,280.50,296.65,301.40,310.40,318.15,325.15},s[3][4]={0},k,p,a,b,c; int i,j,n=14; for(i=0;i<=14;i++){ s[0][0]+=1;
s[1][0]=s[0][1]+=x[i];
s[1][1]=s[2][0]=s[0][2]+=x[i]*x[i]; s[1][2]=s[2][1]+=x[i]*x[i]*x[i]; s[2][2]+=x[i]*x[i]*x[i]*x[i]; s[0][3]+=y[i];
s[1][3]+=x[i]*y[i]; s[2][3]+=x[i]*x[i]*y[i]; }
for(i=0;i<=1;i++){
for(j=0;j<=3;j++){
if(j==0){ k=s[i+1][i]/s[i][i]; }
17
计算方法与实习
}
s[i+1][j]-=k*s[i][j]; if(i==0){ if(j==0){ p=s[i+2][i]/s[i][i]; } } }
s[i+2][j]-=p*s[i][j];
c=s[2][3]/s[2][2];
b=(s[1][3]-c*s[1][2])/s[1][1];
a=(s[0][3]-c*s[0][2]-b*s[0][1])/s[0][0];
cout<<\抛物线拟合的结果为:y=\ cout<<\与原数据相比,拟合结果如下:\
cout< cout< return 0; 实验结果如下: 抛物线拟合的结果为:y=-45.3333+94.2302x-6.13161x^2 与原数据相比,拟合结果如下: x y y' y-y’ 1 33.4 42.76529 9.365294 1.5 79.5 82.21588 2.715882 2 122.65 118.6007 4.049334 2.5 159.05 151.9196 7.130356 3 189.15 182.1728 6.977182 3.5 214.15 209.3602 4.789813 4 238.65 233.4818 5.168248 4.5 252.5 254.5375 2.037511 5 267.55 272.5275 4.977466 5.5 280.5 287.4516 6.951616 6 296.65 299.31 2.659961 6.5 301.4 308.1025 6.702502 7 310.4 313.8292 3.429237 7.5 318.15 316.4902 1.659832 8 325.15 316.0853 9.064706 Press any key to continue 18 计算方法与实习 二、指数曲线拟合 思路分析 上述数据用x[i],y[i]数组存储,对y[i]取自然对数,用最小二乘法进行一次函数拟合,转化为正规方程组后用高斯消元法求得b与a’,e即为a。 a'C++语言编程源代码如下: #include double x[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8},y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50, 267.55,280.50,296.65,301.40,310.40,318.15,325.15},s[2][3]={0},k,a,b; int i,j,n=14; cout< y[i]=log(y[i]); } for(i=0;i<=n;i++){ s[0][0]+=1; s[0][1]=s[1][0]+=x[i]; s[1][1]+=x[i]*x[i]; s[0][2]+=y[i]; s[1][2]+=x[i]*y[i]; } for(j=0;j<=2;j++){ if(j==0){k=s[1][0]/s[0][0];} s[1][j]-=k*s[0][j]; } b=s[1][2]/s[1][1]; a=(s[0][2]-b*s[0][1])/s[0][0]; a=exp(a); cout<<\抛物线拟合的结果为:y=\ cout<<\与原数据相比,拟合结果如下:\ cout< 19 计算方法与实习 } return 0; 实验结果如下: 抛物线拟合的结果为:y=67.4026e^(0.23896x) 与原数据相比,拟合结果如下: x y y' y-y' 1 33.4 85.5964 52.1964 1.5 79.5 96.4595 16.9595 2 122.65 108.701 13.9488 2.5 159.05 122.497 36.5534 3 189.15 138.043 51.1073 3.5 214.15 155.562 58.5883 4 238.65 175.304 63.3458 4.5 252.5 197.552 54.9479 5 267.55 222.624 44.9264 5.5 280.5 250.877 29.6232 6 296.65 282.716 13.9342 6.5 301.4 318.595 17.1954 7 310.4 359.028 48.6285 7.5 318.15 404.593 86.443 8 325.15 455.94 130.79 Press any key to continue 实验分析 从以上两种方法的拟合来看,抛物线拟合可以使误差变得更小,而指数拟合只能实现一部分曲线与数据的误差比较小,其他点的误差则较大,说明这组数据更适合用抛物线拟合来进行拟合计算而不适合用指数拟合来计算。 ?习题7、用复化梯形和复化辛卜生公式计算积分 ?I1(f)??201?cos2xdx和 I2(f)??4tanxx0dx,观察n为多少时,所得近似值具有6位有效数字? ?一、 I1(f)??201?cos2xdx 思路分析 20