《数值分析》上机题.docx

上传人:b****5 文档编号:6194476 上传时间:2023-01-04 格式:DOCX 页数:74 大小:36.14KB
下载 相关 举报
《数值分析》上机题.docx_第1页
第1页 / 共74页
《数值分析》上机题.docx_第2页
第2页 / 共74页
《数值分析》上机题.docx_第3页
第3页 / 共74页
《数值分析》上机题.docx_第4页
第4页 / 共74页
《数值分析》上机题.docx_第5页
第5页 / 共74页
点击查看更多>>
下载资源
资源描述

《数值分析》上机题.docx

《《数值分析》上机题.docx》由会员分享,可在线阅读,更多相关《《数值分析》上机题.docx(74页珍藏版)》请在冰豆网上搜索。

《数值分析》上机题.docx

《数值分析》上机题

《数值分析》上机实习题

一、秦九韶算法

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1