1第3章数值数组及其运算习题3及解答1要求在闭区间]2,0[上产生具有10个等距采样点的一维数组。试用两种不同的指令实现。〖目的〗数值计算中产生自变量采样点的两个常用指令的异同。〖解答〗%方法一t1=linspace(0,2*pi,10)%方法二t2=0:2*pi/9:2*pi%要注意采样间距的选择,如这里的2*pi/9.t1=Columns1through700.69811.39632.09442.79253.49074.1888Columns8through104.88695.58516.2832t2=Columns1through700.69811.39632.09442.79253.49074.1888Columns8through104.88695.58516.28322由指令rng('default'),A=rand(3,5)生成二维数组A,试求该数组中所有大于0.5的元素的位置,分别求出它们的“全下标”和“单下标”。〖目的〗数组下标的不同描述:全下标和单下标。sub2ind,int2str,disp的使用。随机发生器的状态控制:保证随机数的可复现性。〖解答〗rng('default')A=rand(3,5)[ri,cj]=find(A0.5);id=sub2ind(size(A),ri,cj);ri=ri';cj=cj';disp('')disp('大于0.5的元素的全下标')disp(['行号',int2str(ri)])disp(['列号',int2str(cj)])disp('')disp('大于0.5的元素的单下标')disp(id')2A=0.81470.91340.27850.96490.95720.90580.63240.54690.15760.48540.12700.09750.95750.97060.8003大于0.5的元素的全下标行号1212231313列号1122334455大于0.5的元素的单下标124589101213153采用默认全局随机流,写出产生长度为1000的“等概率双位(即取-1,+1)取值的随机码”程序指令,并给出-1码的数目。〖目的〗两种基本随机发生器的使用。关系运算产生逻辑数组——可用于数组的元素的标识和寻访。逻辑数组的应用。如何判断两个整数数组是否相等。〖解答〗(1)运用均匀随机数解题法——解法1rngdefault%为以下结果重现而设;产生默认随机流。详见第4.3.2节A=rand(1,1000);a=2*(A0.5)-1;Na=sum(a==-1)Na=512(2)运用正态随机数解题法——解法2randn('state',123)B=randn(1,1000);b=2*(B0)-1;Nb=sum(b==-1)Nb=462(3)直接发生法——解法3c=randsrc(1,1000,[-1,1]);Nc=sum(c==-1)Nc=4824已知矩阵4321A,运行指令B1=A.^(0.5),B2=A^(0.5),可以观察到不同运算方法所得结果不同。(1)请分别写出根据B1,B2恢复原矩阵A的程序。(2)用指令检验所得的两个恢复矩阵是否相等。〖目的〗数组运算和矩阵运算的不同。如何判断两个双精度数组是否相等。3norm指令的应用。〖解答〗A=[1,2;3,4];B1=A.^0.5B2=A^0.5A1=B1.*B1;A2=B2*B2;norm(A1-A2,'fro')%求误差矩阵的F-范数,当接近eps量级时,就认为实际相等B1=1.00001.41421.73212.0000B2=0.5537+0.4644i0.8070-0.2124i1.2104-0.3186i1.7641+0.1458ians=8.4961e-0165在时间区间[0,10]中,绘制teyt2cos15.0曲线。要求分别采取“标量循环运算法”和“数组运算法”编写两段程序绘图。〖目的〗加强理解数组运算的机理和应用。初步使用subplot,plot,xlabel,ylabel等指令绘图。〖解答〗%标量循环运算法t=linspace(0,10,200);N=length(t);y1=zeros(size(t));fork=1:Ny1(k)=1-exp(-0.5*t(k))*cos(2*t(k));endsubplot(1,2,1),plot(t,y1),xlabel('t'),ylabel('y1'),gridon%数组运算法y2=1-exp(-0.5*t).*cos(2*t);subplot(1,2,2),plot(t,y2),xlabel('t'),ylabel('y2'),gridon051000.511.5ty1051000.511.5ty26先运行clear,formatlong,rng('default'),A=rand(3,3),然后根据A写出两个矩阵:一个对角阵B,其相应元素由A的对角元素构成;另一个矩阵C,其对角元素全为0,而其余元素与对应的A阵元素相同。〖目的〗4常用指令diag的使用场合。〖解答〗clear,formatlongrng('default')A=rand(3,3)B=diag(diag(A))C=A-BA=0.8147236863931790.9133758561390190.2784982188670480.9057919370756190.6323592462254100.5468815192049840.1269868162935060.0975404049994100.957506835434298B=0.8147236863931790000.6323592462254100000.957506835434298C=00.9133758561390190.2784982188670480.90579193707561900.5468815192049840.1269868162935060.09754040499941007先运行指令x=-3*pi:pi/15:3*pi;y=x;[X,Y]=meshgrid(x,y);warningoff;Z=sin(X).*sin(Y)./X./Y;产生矩阵Z。(1)请问矩阵Z中有多少个“非数”数据?(2)用指令surf(X,Y,Z);shadinginterp观察所绘的图形。(3)请写出绘制相应的“无裂缝”图形的全部指令。〖目的〗初步感受三维曲面的绘制方法。非数NaN的产生,非数的检测,和对图形的影响。sum的应用。eps如何克服“被零除”的尴尬。〖解答〗x=-3*pi:pi/15:3*pi;y=x;[X,Y]=meshgrid(x,y);warningoffZ=sin(X).*sin(Y)./X./Y;NumOfNaN=sum(sum(isnan(Z)))%计算“非数”数目subplot(1,2,1),surf(X,Y,Z),shadinginterp,title('有缝图')%产生无缝图XX=X+(X==0)*eps;YY=Y+(Y==0)*eps;ZZ=sin(XX).*sin(YY)./XX./YY;subplot(1,2,2),surf(XX,YY,ZZ),shadinginterp,title('无缝图')NumOfNaN=18158下面有一段程序,企图用来解决如下计算任务:有矩阵kkkkkkkk10229221911A,当k依次取10,9,8,7,6,5,4,3,2,1时,计算矩阵kA“各列元素的和”,并把此求和结果存放为矩阵Sa的第k行。例如3k时,A阵为306329522841,此时它各列元素的和是一个)101(行数组87156,并把它保存为Sa的第3行。问题:该段程序的计算结果对吗?假如计算结果不正确,请指出错误发生的根源,并改正之。〖目的〗正确理解sum的工作机理。reshape的应用。〖解答〗(1)企图用以下程序完成题目要求。fork=10:-1:1A=reshape(1:10*k,k,10);Sa(k,:)=sum(A);endSaSa=555555555555555555553711151923273135396152433425160697887102642587490106122138154154065901151401651902152402157931291652012372733093452877126175224273322371420469361001642282923564204845486124512620728836945053161269377455155255355455555655755855955(2)正确性分析除k=1外,计算所得Sa所有行的结果都正确。但k=1时,]10,,2,1[1A,Sa的第16行应该与1A相同。上述程序的错误是对sum理解不正确。sum对二维数组,求和按列施行;而对一维数组,不管行数组或列数组,总是求那数组所有元素的和。正确的程序应该写成fork=10:-1:1A=reshape(1:10*k,k,10);Sa(k,:)=sum(A);ifk==1Sa(k,:)=A;endendSaSa=123456789103711151923273135396152433425160697887102642587490106122138154154065901151401651902152402157931291652012372733093452877126175224273322371420469361001642282923564204845486124512620728836945053161269377455155255355455555655755855955