当前位置:文档之家› 数值分析上机题参考答案.docx

数值分析上机题参考答案.docx

如有帮助欢迎下载支持数值分析上机题姓名:陈作添学号: 040816习题 120.(上机题)舍入误差与有效数N11 3 1 1设S N,其精确值为 。

22 2 NN 1j 2j1(1)编制按从大到小的顺序111 ,计算 S 的通用程序。

S N1 321N 21 N22(2)编制按从小到大的顺序111,计算 S 的通用程序。

S N1(N 1)2 122 1NN 2(3)按两种顺序分别计算S 102 , S 104 , S 106 ,并指出有效位数。

(编制程序时用单精度)(4)通过本上机题,你明白了什么?按从大到小的顺序计算 S N 的通用程序为: 按从小到大的顺序计算 S N 的通用程序为:#include<iostream.h> #include<iostream.h> float sum(float N) float sum(float N) {{float j,s,sum=0; float j,s,sum=0; for(j=2;j<=N;j++) for(j=N;j>=2;j--) {{s=1/(j*j-1); s=1/(j*j-1); sum+=s;sum+=s;}}return sum;return sum;}}从大到小的顺序的值从小到大的顺序的值精确值有效位数从大到小从小到大0.7400490.740050.74004965 S 1020.7498520.74990.74994 4S 1040.7498520.7499990.74999936S 106通过本上机题, 看出按两种不同的顺序计算的结果是不相同的,按从大到小的顺序计算的值与精确值有较大的误差, 而按从小到大的顺序计算的值与精确值吻合。

从大到小的顺序计算得到的结果的有效位数少。

计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低,我们在计算机中进行同号数的加法时,采用绝对值较小者先加的算法,其结果的相对误差较小。

习题 220.(上机题) Newton 迭代法(1)给定初值x 0及容许误差,编制 Newton 法解方程f ( x)0 根的通用程序。

(2)给定方程f ( x) x3/ 3x0 ,易知其有三个根x 3 ,x2 0, x3 。

13 1.由 Newton 方法的局部收敛性可知存在0 ,当x0(,) 时,Newton迭代序列收敛于根 x2。

试确定尽可能大的。

2.试取若干初始值,观察当x0 (, 1),(1, ),(,) , (,1),(1, ) 时Newton 序列是否收敛以及收敛于哪一个根。

(3)通过本上机题,你明白了什么?解:( 1)编制的通用程序:#include<iostream.h>{#include<math.h>float x0,x1,a;#define eps0.000001/给定容许误差int k=0;float f(float x)//定义函数 f(x)cout<<" 请输入初值 x0:";{cin>>x0;float f;dof=x*x*x/3-x;//f(x) 的表达式 ;{return(f);a=-f(x0)/df(x0);}x1=x0+a;float df(float x)//定义函数 df(x) ,k++;计算 f(x) 的导函数x0=x1;{}float df;while(fabs(a)>eps);df=x*x-1;//f(x) 导函数的表达式 ;cout<<k<<'\t'<<x0;return (df);//输出迭代的次数和根值}}void main(void)( 2)计算迭代序列收敛于根x2的尽可能大的的函数为:#include<iostream.h>return(f);#include<math.h>}void delay(int n)// 定义延时函数float df(float x)// 定义函数 df(x) ,计算 f(x) {for(n=10000;n>0;n--);}的导函数#define eps 0.000001{float f(float x)//定义函数 f(x)float df;{df=x*x-1;//f(x) 导函数的表达式 ;float f;return (df);f=x*x*x/3-x;//f(x) 的表达式 ;}int judgement(float z)return 0;{}int count=5;void main(void)float x0,x1,type,type1;{x0=z;float delta=0;while(count-->0)int flag=1;{while(flag==1)x1=x0-f(x0)/df(x0);{type=fabs(x1);cout<<" 方程的根为 :"<<'\n';type1=fabs(x1-x0); // 调试值用delta+=eps;cout<<"count="<<count<<'\t'<<"type=flag=judgement(delta);"<<type<<'\t'<<"type1="<<type1<<'\n';}if(fabs(x1-x0)<eps)cout<<" 输出方程根收敛的区间return 1;值:\n";x0=x1;cout<<delta-eps; // 输出收敛的区间值delay(30000);//调试值用}}当步长为 0.001 时,程序计算出的δ的为δ =0.774 ,即在区间( -0.774, 0.774)内迭代序列收敛于 0。

对于不同得初始值收敛于不同的根, x0在( -∞, -1)内收敛于x1*,在( -0.774, 0.774)内收敛于x2,在( 1,+∞)内收敛于x3,但在内( 0.774,1)和(- 1,0.774)均可能收敛于x1*和 x3。

x1*, x2, x3分别为方程的精确解。

分析:对于不同的初值,迭代序列会收敛于不同的根,所以在某个区间内求根对于初值的选取有很大的关系。

产生上述结果的原因是区间不满足大范围收敛的条件。

习题 335.(上机题)列主元三角分解法对于某电路的分析,归结为求解线性方程组RI=V。

(1)编制解 n 阶线性方程组 Ax=b 的列主元三角分解法的通用程序;(2)用所编制的程序解线性方程组RI=V,并打印出解向量,保留五位有效数;(3)本编程之中,你提高了哪些编程能力?程序为:#include<iostream.h>cin>>n;#include<math.h>cout<<" 输入数组 a:"<<endl;void main(void)for(i=1;i<=n;i++){for(j=1;j<=(n+1);j++)int i,j,n,k,q;cin>>a[i][j];//给矩阵 a 赋值float a[10][11],s[10],s1[10];for(i=1;i<=n;i++)cout<<" 请输入 n 的值 :";{for(j=1;j<=(n+1);j++)cout<<a[i][j]<<'\t';cout<<'\n';}//输出数组acout<<"'''''''''''''''''''''''''"<<'\n';//进行第一行和第一列元素的求取'''''''''''''''''''''''''//int t=1;for(i=1;i<=n;i++){s[i]=a[i][1];}float max=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++){float b=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++)cout<<a[i][j]<<'\t';cout<<'\n';}//输出进行第一步变换的数组 acout<<"'''''''''''''''''''''''''"<<'\n';//进行第 k 步分解 '''''''''''''''''''''''''''''''''''''''''// for(k=2;k<=n;k++){for(i=k;i<=n;i++){float sum=0;for(q=1;q<k;q++)sum+=a[i][q]*a[q][k];s1[i]=a[i][k]-sum;}int l=k;float m=fabs(s1[k]);for(i=k;i<=n;i++)// 比较第 k 步分解的第k 列值的大小{if(fabs(s1[i])>m){m=fabs(s1[i]);l=i;// 返回行值}}for(j=1;j<=n+1;j++)//交换两行元素{float s2=a[k][j];a[k][j]=a[l][j];a[l][j]=s2;}for(j=k;j<=n+1;j++)//算出第 k 行行元素的值{float sum1=0;for(q=1;q<k;q++)sum1+=a[k][q]*a[q][j];a[k][j]=a[k][j]-sum1;}for(i=k+1;i<=n;i++)//算出第 k 列列元素的值{float sum2=0;for(q=1;q<k;q++)sum2+=a[i][q]*a[q][k];a[i][k]=(a[i][k]-sum2)/(a[k][k]);}}//第 k 步分解结束for(i=1;i<=n;i++){for(j=1;j<=(n+1);j++)cout<<a[i][j]<<'\t';cout<<'\n';}//输出改变后的数组//输出解 '''''''''''''''''''''''''''''''''''''''''''''''''''''''//float x[10];for(i=n-1;i>=1;i--){x[n]=a[n][n+1]/a[n][n];float sum3=0;for(i=1;i<=n;i++)for(j=i+1;j<=n;j++){sum3+=a[i][j]*x[j];cout<<'x'<<i<<'='<<x[i]<<endl;x[i]=(a[i][n+1]-sum3)/a[i][i];}//输出解向量}//回代过程}结果:方程的解为:x1= -0.28923 , x2= 0.34544 ,x3= -0.71281 ,x4= -0.22061 , x5= -0.43040 , x6= 0.15431 ,x7= -0.057823 , x8= 0.20105 ,x9= 0.29023 。

相关主题