《数值分析》上机题.docx
- 文档编号:6194476
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:74
- 大小:36.14KB
《数值分析》上机题.docx
《《数值分析》上机题.docx》由会员分享,可在线阅读,更多相关《《数值分析》上机题.docx(74页珍藏版)》请在冰豆网上搜索。
《数值分析》上机题
《数值分析》上机实习题
一、秦九韶算法
1.源程序
#include
#include
//输出文件指针
FILE*stream=NULL;
typedeffloat*pFloat;
//和用户交互输入多项式各系数
boolInputParam(int&n,pFloat&a,float&x)
{
cout<<"秦九韶算法\n";
cout<<"请输入最高次数n:
";
cin>>n;
if(n<=0)returnfalse;
a=newfloat[n+1];
for(inti=0;i<=n;i++)
{
cout<<"请输入a["<
";
cin>>a[i];
}
cout<<"请输入x的值:
";
cin>>x;
returntrue;
}
//按照格式打印多项式到文件中
voidOutputTheMultinomial(intn,pFloata,floatx)
{
fprintf(stream,"此多项式为:
\n");
fprintf(stream,"P(x)=");
for(inti=n;i>=2;i--)
{
fprintf(stream,"(%f)*x**%d+",a[i],i);
}
fprintf(stream,"(%f)*x+(%f)\n",a[1],a[0]);
fprintf(stream,"x=%f",x);
}
//根据多项式各系数及给定的x值计算
floatQinJiuShao(intn,pFloata,floatx)
{
floatr=a[n];
for(inti=n-1;i>=0;i--)
{
r=x*r+a[i];
}
returnr;
}
//计算第一题
voidCalculate1()
{
fprintf(stream,"秦九韶计算结果1\n");
intn=0;
float*a=NULL;//指向存放多项式系数的指针
floatx=0;
charnext='Y';
//和用户交互进行输入并计算
while(next=='Y'||next=='y')
{
if(InputParam(n,a,x))
{
//输出多项式
OutputTheMultinomial(n,a,x);
//输出结果
fprintf(stream,"\n计算结果为:
P(%f)=%f\n",x,QinJiuShao(n,a,x));
if(a)
{
delete[]a;
a=NULL;
}
}
cout<<"是否进行下一次运算?
(Y/N):
";
cin>>next;
}
}
//计算第二题
voidCalculate2()
{
fprintf(stream,"秦九韶计算结果2\n");
//多项式系数
floata[]={2.0f,-3.36f,2.81f,-2.74f,-3.27f,0.22f};
intn=5;
floatx=0;
//按每次递增0.05计算
for(inti=0;i<=20;i++)
{
x=0.8+0.05*i;
//输出多项式
OutputTheMultinomial(n,a,x);
//输出结果
fprintf(stream,"\n计算结果为:
P(%f)=%f\n",x,QinJiuShao(n,a,x));
}
}
voidmain()
{
//打开输出结果文件
if((stream=fopen("result.txt","w"))==NULL)
{
printf("打不开输出文件\n");
return;
}
//通过用户输入计算第一题
Calculate1();
//通过循环生成x值计算第二题
Calculate2();
//关闭文件
if(stream)
fclose(stream);
}
2.输出结果
秦九韶计算结果1
此多项式为:
P(x)=(7.540000)*x**4+(11.080000)*x**3+(3.820000)*x**2+(0.440000)*x+(-0.480000)
x=3.250000
计算结果为:
P(3.250000)=1262.865112
此多项式为:
P(x)=(2.790000)*x**4+(9.850000)*x**3+(14.150000)*x**2+(5.380000)*x+(7.240000)
x=3.250000
计算结果为:
P(3.250000)=823.586670
此多项式为:
P(x)=(9.360000)*x**4+(12.690000)*x**3+(14.390000)*x**2+(0.750000)*x+(-0.940000)
x=3.250000
计算结果为:
P(3.250000)=1633.377319
此多项式为:
P(x)=(3.450000)*x**4+(-2.910000)*x**3+(3.710000)*x**2+(-6.750000)*x+(-2.380000)
x=3.250000
计算结果为:
P(3.250000)=299.878632
此多项式为:
P(x)=(12.780000)*x**4+(14.350000)*x**3+(17.190001)*x**2+(1.340000)*x+(-1.720000)
x=3.250000
计算结果为:
P(3.250000)=2102.631592
此多项式为:
P(x)=(4.790000)*x**4+(5.380000)*x**3+(-2.860000)*x**2+(7.310000)*x+(4.550000)
x=3.250000
计算结果为:
P(3.250000)=717.187134
此多项式为:
P(x)=(15.650000)*x**4+(17.580000)*x**3+(21.700000)*x**2+(2.780000)*x+(1.340000)
x=3.250000
计算结果为:
P(3.250000)=2589.083984
此多项式为:
P(x)=(8.340000)*x**4+(-7.750000)*x**3+(4.530000)*x**2+(-9.290000)*x+(5.750000)
x=3.250000
计算结果为:
P(3.250000)=687.826416
秦九韶计算结果2
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=0.800000
计算结果为:
P(0.800000)=-1.559783
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=0.850000
计算结果为:
P(0.850000)=-2.117823
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=0.900000
计算结果为:
P(0.900000)=-2.760899
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=0.950000
计算结果为:
P(0.950000)=-3.498386
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.000000
计算结果为:
P(1.000000)=-4.340000
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.050000
计算结果为:
P(1.050000)=-5.295790
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.100000
计算结果为:
P(1.100000)=-6.376135
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.150000
计算结果为:
P(1.150000)=-7.591724
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.200000
计算结果为:
P(1.200000)=-8.953563
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.250000
计算结果为:
P(1.250000)=-10.472949
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.300000
计算结果为:
P(1.300000)=-12.161481
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.350000
计算结果为:
P(1.350000)=-14.031042
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.400000
计算结果为:
P(1.400000)=-16.093779
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.450000
计算结果为:
P(1.450000)=-18.362123
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.500000
计算结果为:
P(1.500000)=-20.848751
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.550000
计算结果为:
P(1.550000)=-23.566595
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.600000
计算结果为:
P(1.600000)=-26.528849
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.650000
计算结果为:
P(1.650000)=-29.748898
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.700000
计算结果为:
P(1.700000)=-33.240402
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.750000
计算结果为:
P(1.750000)=-37.017208
此多项式为:
P(x)=(0.220000)*x**5+(-3.270000)*x**4+(-2.740000)*x**3+(2.810000)*x**2+(-3.360000)*x+(2.000000)
x=1.800000
计算结果为:
P(1.800000)=-41.093380
五、追赶法
1.源程序
#include
#include
//指向输出结果的文件的指针
FILE*stream=NULL;
typedeffloat*pFloat;
//向文件打印指定数量的指针
voidOutputSpace(intn)
{
for(inti=0;i { fprintf(stream,""); } } //和用户交互输入计算所需参数数据 boolInputTheParam(int&n,pFloat&a,pFloat&b,pFloat&c,pFloat&d) { //向屏幕输出矩阵样式以便用户输入参数 cout<<"用追赶法求解系数矩阵是三对角线的线性方程组AX=b"< cout<< "|d1c1||b1|\n"<< "||||\n"<< "|a2d2c2||b2|\n"<< "|||.|\n"<< "A=|...|b=||\n"<< "|||.|\n"<< "|a(n-1)d(n-1)c(n-1)|||\n"<< "|||.|\n"<< "|a(n)d(n)||b(n)|\n"; //输入矩阵行数n cout<<"请输入n: "; cin>>n; if(n<=1) { cout<<"n必须大于1"; returnfalse; } //为所需数据分配空间 a=newfloat[n]; a[0]=NULL; b=newfloat[n]; c=newfloat[n]; c[n-1]=NULL; d=newfloat[n]; //输入所需参数 for(inti=2;i<=n;i++) { cout<<"请输入a["< "; cin>>a[i-1]; } for(i=1;i<=n;i++) { cout<<"请输入d["< "; cin>>d[i-1]; } for(i=1;i { cout<<"请输入c["< "; cin>>c[i-1]; } for(i=1;i<=n;i++) { cout<<"请输入b["< "; cin>>b[i-1]; } //按指定格式打印输出矩阵A fprintf(stream,"矩阵A为: \n"); for(i=0;i { if(i==0) { fprintf(stream,"%7.2f%7.2f\n",d[0],c[0]); } elseif(i==n-1) { OutputSpace((i-1)*8); fprintf(stream,"%7.2f%7.2f\n",a[n-1],d[n-1]); } else { OutputSpace((i-1)*8); fprintf(stream,"%7.2f%7.2f%7.2f\n",a[i],d[i],c[i]); } } //按指定格式打印输出矩阵B fprintf(stream,"矩阵B为: \n"); for(i=0;i { fprintf(stream,"%7.2f\n",b[i]); } returntrue; } //计算结果并输出 voidCalculate(intn,pFloata,pFloatb,pFloatc,pFloatd) { //分配内存 float*A=newfloat[n]; float*B=newfloat[n]; float*r=newfloat[n]; float*y=newfloat[n]; float*x=newfloat[n]; B[0]=c[0]/d[0]; for(inti=1;i B[i]=c[i]/(d[i]-a[i]*B[i-1]); for(i=1;i r[i]=a[i]; A[0]=d[0]; for(i=1;i A[i]=a[i]-a[i]*B[i-1]; //计算解向量y y[0]=b[0]/d[0]; for(i=1;i y[i]=(b[i]-a[i]*y[i-1])/(d[i]-a[i]*B[i-1]); //计算解向量x x[n-1]=y[n-1]; for(i=n-2;i>=0;i--) x[i]=y[i]-B[i]*x[i+1]; //按格式打印输出数表 fprintf(stream,"A=LU的输出数表为: \n"); for(i=0;i { if(i==0) { fprintf(stream,"%9.4f%9.4f%9.4f%9.4f\n",0.0f,A[i],1.0f,B[i]); } elseif(i==n-1) { fprintf(stream,"%9.4f%9.4f%9.4f%9.4f\n",r[i],A[i],1.0f,0.0f); } else { fprintf(stream,"%9.4f%9.4f%9.4f%9.4f\n",r[i],A[i],1.0f,B[i]); } } //输出解向量Y fprintf(stream,"线性方程组LY=b的解向量Y为: \n"); for(i=0;i fprintf(stream,"%9.4f\n",y[i]); //输出解向量X fprintf(stream,"线性方程组UX=Y的解向量X为: \n"); for(i=0;i fprintf(stream,"%9.4f\n",x[i]); delete[]x; delete[]y; delete[]r; delete[]B; delete[]A; } //清除计算过程所分配的内存 voidRemoveAll(pFloat&a,pFloat&b,pFloat&c,pFloat&d) { delete[]a; a=NULL; delete[]b; b=NULL; delete[]c; c=NULL; delete[]d; d=NULL; } voidmain() { //打开输出结果文件 if((stream=fopen("result.txt","w"))==NULL) { printf("打不开输出文件\n"); return; } intn=0; pFloata=NULL; pFloatb=NULL; pFloatc=NULL; pFloatd=NULL; //和用户交互进行多次计算 charnext='Y'; while(next=='Y'||next=='y') { if(InputTheParam(n,a,b,c,d)) { Calculate(n,a,b,c,d); RemoveAll(a,b,c,d); } cout<<"是否进行下一次运算? (Y/N): "; cin>>next; } //关闭文件 if(stream) fclose(stream); } 2.计算结果 矩阵A为: -2.001.00 1.00-2.001.00 1.00-2.001.00 1.00-2.001.00 1.00-2.001.00 1.00-2.001.00 1.00-2.001.00 1.00-2.001.00 1.00-2.001.00 1.00-2.00 矩阵B为: -0.50 -1.50 -1.50 -1.50 -1.50 -1.50 -1.50 -1.50 -1.50 -0.50 A=LU的输出数表为: 0.0000-2.00001.0000-0.5000 1.00001.50001.0000-0.6667 1.00001.66671.0000-0.7500 1.00001.75001.0000-0.8000 1.00001.80001.0000-0.8333 1.00001.83331.0000-0.8571 1.00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值分析 数值 分析 上机