预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
亲,该文档总共23页,到这已经超出免费预览范围,如果喜欢就直接下载吧~
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
20.(上机题)舍入误差与有效数
设,其精确值为。
(1)编制按从小到大的顺序,计算的通用程序。
(2)编制按从大到小的顺序,计算的通用程序。
(3)按两种顺序分别计算,并指出有效位数。(编制程序时用单精度)
(4)通过本上机题,你明白了什么?
c++代码:
#include<iostream.h>
#include<fstream.h>
voidmain(){
floatS1,S2,S=0.0,N,j;
fstreammyfile;//定义文件
myfile.open("chap0.txt",ios::in|ios::out);
for(inti=0;i<3;i++)
{
do//读入三组数据
{
cout<<"请输入N值:";
cin>>N;
cout<<endl;
myfile<<"当N="<<N<<"时"<<endl<<endl;
}while(N<2);
S=(float)((1.5-(1.0/N)-(1.0/(N+1)))/2);
myfile<<"精确值S=:"<<S<<endl<<endl;
S1=0.0;S2=0.0;
for(j=2;j<=N;j++)S1=S1+(float)(1.0/(j*j-1.0));
for(j=N;j>=2;j--)S2=S2+(float)(1.0/(j*j-1.0));
myfile<<"按从大到小的顺序求和结果S1=:"<<S1<<endl<<endl;
myfile<<"按从小到大的顺序求和结果S2=:"<<S2<<endl<<endl;
}
myfile.close();
}
输出结果:
当N=100时
精确值S=:0.740049
按从大到小的顺序求和结果S1=:0.740049有效位数6
按从小到大的顺序求和结果S2=:0.74005有效位数5
当N=10000时
精确值S=:0.7499
按从大到小的顺序求和结果S1=:0.749852有效位数4
按从小到大的顺序求和结果S2=:0.7499有效位数4
当N=1000000时
精确值S=:0.749999
按从大到小的顺序求和结果S1=:0.749852有效位数4
按从小到大的顺序求和结果S2=:0.749999有效位数6
体会:通过本题,我认识到了舍入误差对计算结果的影响,所以必须选择合适的计算方法,尽量减少这种误差的影响。
习题2
20.(上机题)NEWTON迭代法
(1)给定初值及容许误差,编制Newton法解方程根的通用程序。
(2)给定方程,易知其有三个根。
1.由Newton方法的局部收敛性可知存在,当时,Newton迭代序列收敛于根。试确定尽可能大的。
2。试取若干初值,观察当时Newton序列是否收敛以及收敛于哪一个根。
(3)通过本上机题,你明白了什么?
c++代码:
#include<iostream.h>
#include<math.h>
#defineh0.000001
floatxo=0.0,x1,x2,e,a,b;
floatf(floatx){//原函数
floatf1=(float)(a*x*x*x+b*x);
returnf1;
}
floatg(floatx){//导函数
floatg1=(float)(3*a*x*x+b);
returng1;
}
inttest(floatxk){//求收敛于0的最大的
intr,flag=0;
floatxkplus1;
while(flag==0)
{
xkplus1=xk-f(xk)/g(xk);
if(xkplus1==xk)flag=1;
elsexk=xkplus1;
};
if(xk==0)r=1;elser=0;
returnr;
}
voidmain()
{
cout<<"请输入初值X0:";
cin>>x1;
cout<<endl;
cout<<"请输入容许误差E:";
cin>>e;
cout<<endl;
cout<<"请输入三次系数A,一次系数B:";
cin>>a>>b;
cout<<endl;
x2=(float)(x1-f(x1)/g(x1));//牛顿迭代法求根
while(fabs(x2-x1)>=e)
{
x1=x2;
x2=(x1-f(x1)/g(x1));
}
cout<<"方程的根X为:"<<x2<<endl<<endl;
while(test(xo)==1){xo+=h;}//求根x=0最大的迭代区间
cout<<"X=0的最大迭代区间为(-"<<xo<<","<<xo<<")"<<endl<<endl;
}
输出结果:
X=0的最大迭代区间为(-0.774597,0.774597);0.000000000