〖目的〗
数值计算中产生自变量采样点的两个常用指令的异同。
〖解答〗
%方法一
t1=linspace(0,2*pi,10)
%方法二
t2=0:2*pi/9:2*pi %要注意采样间距的选择,如这里的2*pi/9.
t1 =
Columns 1 through 7
0 0.6981 1.3963 2.0944 2.7925 3.4907 4.1888
Columns 8 through 10
4.8869 5.5851 6.2832
t2 =
Columns 1 through 7
0 0.6981 1.3963 2.0944 2.7925 3.4907 4.1888
Columns 8 through 10
4.8869 5.5851 6.2832
〖目的〗
数组下标的不同描述:全下标和单下标。
sub2ind, int2str, disp的使用。
随机发生器的状态控制:保证随机数的可复现性。
〖解答〗
rng('default')
A=rand(3,5)
[ri,cj]=find(A>0.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')
A =
0.8147 0.9134 0.2785 0.9649 0.9572
0.9058 0.6324 0.5469 0.1576 0.4854
0.1270 0.0975 0.9575 0.9706 0.8003
大于0.5的元素的全下标
行号 1 2 1 2 2 3 1 3 1 3
列号 1 1 2 2 3 3 4 4 5 5
大于0.5的元素的单下标
1 2 4 5 8 9 10 12 13 15
〖目的〗
两种基本随机发生器的使用。
关系运算产生逻辑数组——可用于数组的元素的标识和寻访。
逻辑数组的应用。
如何判断两个整数数组是否相等。
〖解答〗
(1)运用均匀随机数解题法——解法1
rng default %为以下结果重现而设;产生默认随机流。详见第4.3.2节
A=rand(1,1000);
a=2*(A>0.5)-1;
Na=sum(a==-1)
Na =
512
(2)运用正态随机数解题法——解法2
randn('state',123)
B=randn(1,1000);
b=2*(B>0)-1;
Nb=sum(b==-1)
Nb =
462
(3)直接发生法——解法3
c=randsrc(1,1000,[-1,1]);
Nc=sum(c==-1)
Nc =
482
〖目的〗
数组运算和矩阵运算的不同。
如何判断两个双精度数组是否相等。
norm指令的应用。
〖解答〗
A=[1,2;3,4];
B1=A.^0.5
B2=A^0.5
A1=B1.*B1;
A2=B2*B2;
norm(A1-A2,'fro') % 求误差矩阵的F-范数,当接近eps量级时,就认为实际相等
B1 =
1.0000 1.4142
1.7321 2.0000
B2 =
0.5537 + 0.4644i 0.8070 - 0.2124i
1.2104 - 0.3186i 1.7641 + 0.1458i
ans =
8.4961e-016
〖目的〗
加强理解数组运算的机理和应用。
初步使用subplot, plot, xlabel, ylabel等指令绘图。
〖解答〗
%标量循环运算法
t=linspace(0,10,200);
N=length(t);
y1=zeros(size(t));
for k=1:N
y1(k)=1-exp(-0.5*t(k))*cos(2*t(k));
end
subplot(1,2,1),plot(t,y1),xlabel('t'),ylabel('y1'),grid on
%数组运算法
y2=1-exp(-0.5*t).*cos(2*t);
subplot(1,2,2),plot(t,y2),xlabel('t'),ylabel('y2'),grid on
〖目的〗
常用指令diag的使用场合。
〖解答〗
clear,
format long
rng('default')
A=rand(3,3)
B=diag(diag(A))
C=A-B
A =
0.814723686393179 0.913375856139019 0.278498218867048
0.905791937075619 0.632359246225410 0.546881519204984
0.126986816293506 0.097540404999410 0.957506835434298
B =
0.814723686393179 0 0
0 0.632359246225410 0
0 0 0.957506835434298
C =
0 0.913375856139019 0.278498218867048
0.905791937075619 0 0.546881519204984
0.126986816293506 0.097540404999410 0
〖目的〗
初步感受三维曲面的绘制方法。
非数NaN的产生,非数的检测,和对图形的影响。
sum的应用。
eps如何克服“被零除”的尴尬。
〖解答〗
x=-3*pi:pi/15:3*pi;
y=x;
[X,Y]=meshgrid(x,y);
warning off
Z=sin(X).*sin(Y)./X./Y;
NumOfNaN=sum(sum(isnan(Z))) %计算“非数”数目
subplot(1,2,1),surf(X,Y,Z),shading interp,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),shading interp,title('无缝图')
NumOfNaN =
181
〖目的〗
正确理解sum的工作机理。
reshape的应用。
〖解答〗
(1)企图用以下程序完成题目要求。
for k=10:-1:1
A=reshape(1:10*k,k,10);
Sa(k,:)=sum(A);
end
Sa
Sa =
55 55 55 55 55 55 55 55 55 55
3 7 11 15 19 23 27 31 35 39
6 15 24 33 42 51 60 69 78 87
10 26 42 58 74 90 106 122 138 154
15 40 65 90 115 140 165 190 215 240
21 57 93 129 165 201 237 273 309 345
28 77 126 175 224 273 322 371 420 469
36 100 164 228 292 356 420 484 548 612
45 126 207 288 369 450 531 612 693 774
55 155 255 355 455 555 655 755 855 955
(2)正确性分析
除k=1外,计算所得Sa所有行的结果都正确。但k=1时,,Sa的第1行应该与相同。
上述程序的错误是对sum理解不正确。sum对二维数组,求和按列施行;而对一维数组,不管行数组或列数组,总是求那数组所有元素的和。
正确的程序应该写成
for k=10:-1:1
A=reshape(1:10*k,k,10);
Sa(k,:)=sum(A);
if k==1
Sa(k,:)=A;
end
end
Sa
Sa =
1 2 3 4 5 6 7 8 9 10
3 7 11 15 19 23 27 31 35 39
6 15 24 33 42 51 60 69 78 87
10 26 42 58 74 90 106 122 138 154
15 40 65 90 115 140 165 190 215 240
21 57 93 129 165 201 237 273 309 345
28 77 126 175 224 273 322 371 420 469
36 100 164 228 292 356 420 484 548 612
45 126 207 288 369 450 531 612 693 774
55 155 255 355 455 555 655 755 855 955
本文来源:https://www.2haoxitong.net/k/doc/d3940d2443323968011c927d.html
文档为doc格式