数值分析上机题
上机题1
舍入误差与有效数: N 设S N =∑j =213111(--) 。 ,其精确值为22N N +1j 2-1
111++…+,计算S N 的通用程序; 22-132-1N 2-1
111++…+(2) 编制按从小到大的顺序S N =2,计算S N 的通用程序; 22N -1(N-1)-12-1(1) 编制按从大到小的顺序S N =
(3) 按两种顺序分别计算S 102,S 104,S 106,并指出有效位数(编制程序时用单精度);
(4) 通过本上机题你明白了什么?
Matlab 代码:
Sb=single(0); %定义数据类型为单精度
Ss=single(0);
y=single(0);
Y=single(0);
N=single(2);
a=1000000;
while(1) %从大到小相加
Y=1/(N^2-1);
Sb=Sb+Y;
if(N>=a)
break;
end
N=N+1;
end
fprintf('Sb[%d]=%10.9f\n',N,Sb)
n=single(a);
while(1) %从小到大相加
y=1/(n^2-1);
Ss=Ss+y;
if(n
break;
end
n=n-1;
end
fprintf('Ss[%d]=%10.9f\n',a,Ss)
St=(3/2-1/a-1/(1+a))/2; %准确值
fprintf('St[%d]=%10.9f\a',a,St)
分别计算S 102,S 104,S 106值为:
Sb[100]=0.740049481
Ss[100]=0.740049541
St[100]=0.740049505
从大到小S 计算有效位数为6位,从小到大为7位;
Sb[10000]=0.749852121
Ss[10000]=0.749899983
St[10000]=0.749900005
从大到小S 计算有效位数为3位,从小到大为3位;
Sb[1000000]=0.749852121
Ss[1000000]=0.749999046
St[1000000]=0.749999000
从大到小S 计算有效位数为3位,从小到大为7位;
心得:
按从小到大计算的有效数字要多与按从大到小计算所得。在实际计算中,应该避免大数与小数相加,防止大数吃小数。
上机题2
Newton 迭代法:
(1) 给定初值x0及容许误差ε,编制Newton 法解方程f(x)=0跟的通用程序。
***(2) 给定方程f (x ) =x 3/3-x =
0,易知其有三个根x 1=x 2=0, x 3=
① 由Newton 方法的局部收敛性可知存在δ>0, 当x 0∈(-δ, δ) 时Newton 迭代序列收敛
*于根x 2,试确定尽可能大的δ;
② 试取若干初始值,观察当x 0∈(-∞, -1),(-1, -δ),(-δ, δ),(δ,1),(1, +∞) 时,Newton 序
列是否收敛以及收敛于哪一个根。
(3) 通过本上机题,你明白了什么?
Matlab 代码:
syms y x y1; %定义字符型变量y,x,y1
y=x^3/3-x; %f(x)表达式
y1=diff(y,x); %对f(x)求导
x=sqrt(0.5999); %x0初值 e=0.0001; %容许误差
n=0;
while(1)
fprintf('x[%d]=%15.10f\n',n,x); %显示每次迭代计算结果
N=x-eval(y)/eval(y1); %牛顿迭代式
if(abs(N-x)
break;
end
x=N;
n=n+1;
end
fprintf('x[%d]=%15.10f\n',n+1,N);
根据大范围收敛的四个条件,求得0
对初值x 0
x 0=结果如下:
x 0
x[0]= 0.7745321168
x[1]= -0.7742094758
x[2]= 0.7722778557
x[3]= -0.7608383787
x[4]= 0.6972282749
x[5]= -0.4397219445
x[6]= 0.0702685389
x[7]= -0.0002324562
x[8]= 0.0000000000
x[9]=
0.0000000000
x 0
x[0]= 0.7745966692
x[1]= -0.7745966692
x[2]= 0.7745966692
x[3]= -0.7745966692
x[4]= 0.7745966692
x[5]= -0.7745966692
x[6]= 0.7745966692
x[7]= -0.7745966693
x[8]= 0.7745966693
x[9]= -0.7745966697
x[10]= 0.7745966719
x[11]= -0.7745966850
x[12]= 0.7745967640
x[13]= -0.7745972381
x[14]= 0.7746000822
x[15]= -0.7746171473
x[16]= 0.7747195498
x[17]= -0.7753343917
x[18]= 0.7790388645
x[19]= -0.8018345857
x[20]= 0.9625433925
x[21]= -8.0876432142
x[22]= -5.4754721944
x[23]= -3.7762711305
x[24]= -2.7073686591
x[25]= -2.0900556654
x[26]= -1.8070381463
x[27]= -1.7364741599
x[28]= -1.7320676519
x[29]= -1.7320508078
因此当δ
*x 0∈(-∞, -1) ,取x 0=-
2,收敛于x 1=;
*x 0∈(-1, -δ) ,取x 0=-
0.9,收敛于x 3=;
*x 0∈(-δ, δ) ,取x 0=0.3,收敛于x 2=0;
*x 0∈(δ,1) ,取x 0=
0.9,收敛于x 1=;
*x 0∈(1, +∞) ,取x 0=
2,x 3=。
心得:
1、 牛顿迭代式中f (x ) 不能为0,否则无法计算;
2、 初值x 0取不同值时,会收敛于不同的根;
3、
大范围收敛定理是牛顿迭代式收敛的充分条件,而不是必要条件,本题中计算出的'
0
上机题3
列主元Gauss 消去法:
对于某电路的分析, 归结为求解线性方程组RI=V,其中
R=[ 31, 13, 0 , 0 , 0 ,-10, 0 , 0 , 0
-13, 35, -9, 0 ,-11, 0 , 0 , 0 , 0
0 , -9, 31,-10, 0 , 0 , 0 , 0 , 0
0 , 0 ,-10, 79,-30, 0 , 0 , 0 ,-9
0 , 0 , 0 ,-30, 57, -7, 0 , -5, 0
0 , 0 , 0 , 0 , -7, 47,-30, 0 , 0
0 , 0 , 0 , 0 , 0 ,-30, 41, 0 , 0
0 , 0 , 0 , 0 , -5, 0 , 0 , 27, -2
0 , 0 , 0 , -9, 0 , 0 , 0 , -2, 29];
V T =[-15,27,-23,0,-20,12,-7,7,10]T
(1) 编制解n 阶线性方程组Ax=b的列主元Gauss 消去法的通用程序;
(2) 用所编程序解线性方程组RI=V,并打印出解向量, 保留5位有效数字;
(3) 本编程题之中, 你提高了哪里编程能力?
Matlab 代码:
A=[31,13,0,0,0,-10,0,0,0
-13,35,-9,0,-11,0,0,0,0
0,-9,31,-10,0,0,0,0,0
0,0,-10,79,-30,0,0,0,-9
0,0,0,-30,57,-7,0,-5,0
0,0,0,0,-7,47,-30,0,0
0,0,0,0,0,-30,41,0,0
0,0,0,0,-5,0,0,27,-2
0,0,0,-9,0,0,0,-2,29];
b=[-15,27,-23,0,-20,12,-7,7,10]';
P=inv(A)*b;
P=vpa(P,5);
[m,n]=size(A);
C=[A,b];
i=1;j=1;
while(n>1)
while(j
if(C(i,i)
B=C(i,:);
C(i,:)=C(i+j,:);
C(i+j,:)=B;
end
j=j+1;
end
j=1;
while(j
a=C(i+j,i)/C(i,i);
C(i+j,:)=C(i+j,:)-C(i,:)*a;
j=j+1;
end
n=n-1;
i=i+1;
j=1;
end
[m,n]=size(A);
y=n+1;
X=zeros(n,1);
D=C(:,1:n); %R矩阵输入 %V矩阵输入 %逆矩阵求解方程组的解,作为标准答案对照%显示有效数字为5位 %读取输入矩阵的行列数 %增广矩阵C %i,j 分别控制两个循环次数 %循环2,用来列主元 %矩阵两行交换 %循环3,高斯消去法 %定义n 行1列0矩阵,用来存放解向量 %列主元高斯消去后的系数矩阵D
while(n>0)
X(n,1)=(C(n,y)-D(n,:)*X)/C(n,n); %求解三角阵,并存入X 矩阵
n=n-1;
end
X=vpa(X,5); %矩阵X5位有效数字显示
运行结果:
C =
Columns 1 through 5
31.0000 13.0000 0 0 0
0 40.4516 -9.0000 0 -11.0000
0 0 28.9976 -10.0000 -2.4474
0 0 0 75.5514 -30.8440
0 0 0 -0.0000 44.7525
0 0 0 -0.0000 0.0000
0 0 0 -0.0000 0.0000
0 0 0 -0.0000 0.0000
0 0 0 -0.0000 0.0000
Columns 6 through 10
-10.0000 0 0 0 -15.0000
-4.1935 0 0 0 20.7097
-0.9330 0 0 0 -18.3923
-0.3218 0 0 -9.0000 -6.3427
-7.1278 0 -5.0000 -3.5737 -22.5186
45.8851 -30.0000 -0.7821 -0.5590 8.4777
0 21.3858 -0.5113 -0.3655 -1.4572
0 0 26.4153 -2.4179 4.5958
0 0 0 27.3974 7.9060
P T =[ -.53692, .24457, -.74378, -.22582, -.43330, .15350,
-.58416e-1, .20039, .28857]
X T =[ -.53692, .24457, -.74378, -.22582, -.43330, .15350,
-.58416e-1, .20039, .28857]
故列主元高斯消去法的解是正确的。
心得:
通过这次编程,对列主元高斯消去法有了更加深刻的认识,特别是对一个n*n系数矩阵的增广矩阵需要进行多少次行交换,多少次消去有了准确的认识。另外,对矩阵有非常深入的了解之后可以一定程度上减少循环次数,简化程序。比如在程序最后阶段求解X 矩阵时,用了矩阵乘法,这样可以减少一个while 循环,大大简化了程序。并通过matlab 自带的求解逆矩阵的命令,对求解结果进行了验算。