数值分析上机题参考答案.docx
- 文档编号:3469346
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:16
- 大小:51.32KB
数值分析上机题参考答案.docx
《数值分析上机题参考答案.docx》由会员分享,可在线阅读,更多相关《数值分析上机题参考答案.docx(16页珍藏版)》请在冰豆网上搜索。
数值分析上机题参考答案
数值分析上机题
姓名:
陈作添学号:
040816
习题1
20.(上机题)舍入误差与有效数
设
,其精确值为
。
(1)编制按从大到小的顺序
,计算
的通用程序。
(2)编制按从小到大的顺序
,计算
的通用程序。
(3)按两种顺序分别计算
,
,
,并指出有效位数。
(编制程序时用单精度)
(4)通过本上机题,你明白了什么?
按从大到小的顺序计算
的通用程序为:
#include
floatsum(floatN)
{
floatj,s,sum=0;
for(j=2;j<=N;j++)
{
s=1/(j*j-1);
sum+=s;
}
returnsum;
}
按从小到大的顺序计算
的通用程序为:
#include
floatsum(floatN)
{
floatj,s,sum=0;
for(j=N;j>=2;j--)
{
s=1/(j*j-1);
sum+=s;
}
returnsum;
}
从大到小的顺序的值
从小到大的顺序的值
精确值
有效位数
从大到小
从小到大
0.740049
0.74005
0.740049
6
5
0.749852
0.7499
0.7499
4
4
0.749852
0.749999
0.749999
3
6
通过本上机题,看出按两种不同的顺序计算的结果是不相同的,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。
从大到小的顺序计算得到的结果的有效位数少。
计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低,我们在计算机中进行同号数的加法时,采用绝对值较小者先加的算法,其结果的相对误差较小。
习题2
20.(上机题)Newton迭代法
(1)给定初值
及容许误差
,编制Newton法解方程
根的通用程序。
(2)给定方程
,易知其有三个根
,
,
。
1.由Newton方法的局部收敛性可知存在
,当
时,Newton迭代序列收敛于根
。
试确定尽可能大的
。
2.试取若干初始值,观察当
,
,
,
,
时Newton序列是否收敛以及收敛于哪一个根。
(3)通过本上机题,你明白了什么?
解:
(1)编制的通用程序:
#include
#include
#defineeps0.000001/给定容许误差
floatf(floatx)//定义函数f(x)
{
floatf;
f=x*x*x/3-x;//f(x)的表达式;
return(f);
}
floatdf(floatx)//定义函数df(x),计算f(x)的导函数
{
floatdf;
df=x*x-1;//f(x)导函数的表达式;
return(df);
}
voidmain(void)
{
floatx0,x1,a;
intk=0;
cout<<"请输入初值x0:
";
cin>>x0;
do
{
a=-f(x0)/df(x0);
x1=x0+a;
k++;
x0=x1;
}
while(fabs(a)>eps);
cout< //输出迭代的次数和根值 } (2)计算迭代序列收敛于根 的尽可能大的 的函数为: #include #include voiddelay(intn)//定义延时函数 {for(n=10000;n>0;n--);} #defineeps0.000001 floatf(floatx)//定义函数f(x) { floatf; f=x*x*x/3-x;//f(x)的表达式; return(f); } floatdf(floatx)//定义函数df(x),计算f(x)的导函数 { floatdf; df=x*x-1;//f(x)导函数的表达式; return(df); } intjudgement(floatz) { intcount=5; floatx0,x1,type,type1; x0=z; while(count-->0) { x1=x0-f(x0)/df(x0); type=fabs(x1); type1=fabs(x1-x0);//调试值用 cout<<"count="< if(fabs(x1-x0) return1; x0=x1; delay(30000);//调试值用 } return0; } voidmain(void) { floatdelta=0; intflag=1; while(flag==1) { cout<<"方程的根为: "<<'\n'; delta+=eps; flag=judgement(delta); } cout<<"输出方程根收敛的区间值: \n"; cout< } 当步长为0.001时,程序计算出的δ的为δ=0.774,即在区间(-0.774,0.774)内迭代序列收敛于0。 对于不同得初始值收敛于不同的根, 在(-∞,-1)内收敛于 ,在(-0.774,0.774)内收敛于 ,在(1,+∞)内收敛于 ,但在内(0.774,1)和(-1,0.774)均可能收敛于 和 。 , , 分别为方程的精确解。 分析: 对于不同的初值,迭代序列会收敛于不同的根,所以在某个区间内求根对于初值的选取有很大的关系。 产生上述结果的原因是区间不满足大范围收敛的条件。 习题3 35.(上机题)列主元三角分解法对于某电路的分析,归结为求解线性方程组RI=V。 (1)编制解n阶线性方程组Ax=b的列主元三角分解法的通用程序; (2)用所编制的程序解线性方程组RI=V,并打印出解向量,保留五位有效数; (3)本编程之中,你提高了哪些编程能力? 程序为: #include #include voidmain(void) { inti,j,n,k,q; floata[10][11],s[10],s1[10]; cout<<"请输入n的值: "; cin>>n; cout<<"输入数组a: "< for(i=1;i<=n;i++) for(j=1;j<=(n+1);j++) cin>>a[i][j];//给矩阵a赋值 for(i=1;i<=n;i++) { for(j=1;j<=(n+1);j++) cout< cout<<'\n'; }//输出数组a cout<<"'''''''''''''''''''''''''"<<'\n'; //进行第一行和第一列元素的求取'''''''''''''''''''''''''// intt=1; for(i=1;i<=n;i++) {s[i]=a[i][1];} floatmax=fabs(s[1]); for(i=2;i<=n;i++) if(fabs(s[i])>max) { max=fabs(s[i]); t=i; } for(j=1;j<=(n+1);j++) { floatb=a[1][j]; a[1][j]=a[t][j]; a[t][j]=b; }//进行第一列主元互换 for(i=2;i<=n;i++) a[i][1]=a[i][1]/max;//第一列除以a[1][1] for(i=1;i<=n;i++) { for(j=1;j<=(n+1);j++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 上机 参考答案