《数值分析》上机题.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;iB[i]=c[i]/(d[i]-a[i]*B[i-1]);
for(i=1;ir[i]=a[i];
A[0]=d[0];
for(i=1;iA[i]=a[i]-a[i]*B[i-1];
//计算解向量y
y[0]=b[0]/d[0];
for(i=1;iy[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;ifprintf(stream,"%9.4f\n",y[i]);
//输出解向量X
fprintf(stream,"线性方程组UX=Y的解向量X为:
\n");
for(i=0;ifprintf(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