1、,例2-3 分别建立33、32和与矩阵A同样大小的零矩阵。 (1) 建立一个33零矩阵。 zeros(3) (2) 建立一个32零矩阵。 zeros(3,2) (3) 设A为23矩阵,则可以用zeros(size(A)建立一个与矩阵A同样大小零矩阵。 A=1 2 3;4 5 6; %产生一个23阶矩阵A zeros(size(A) %产生一个与矩阵A同样大小的零矩阵,例2-4 建立随机矩阵: (1) 在区间20,50内均匀分布的5阶随机矩阵。 (2) 均值为0.6、方差为0.1的5阶正态分布随机矩阵。 命令如下: x=20+(50-20)*rand(5) y=0.6+sqrt(0.1)*ran
2、dn(5) 此外,常用的函数还有reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成mn的二维矩阵。,例2-8 产生5阶随机方阵A,其元素为10,90区间的随机整数,然后判断A的元素是否能被3整除。 (1) 生成5阶随机方阵A。 A=fix(90-10+1)*rand(5)+10) (2) 判断A的元素是否可以被3整除。 P=rem(A,3)=0 其中,rem(A,3)是矩阵A的每个元素除以3的余数矩阵。此时,0被扩展为与A同维数的零矩阵,P是进行等于(=)比较的结果矩阵。,例2-9 建立矩阵A,然后找出大于4的元素的位置。 (1) 建立矩阵A。 A=4,-65,-5
3、4,0,6;56,0,67,-45,0 (2) 找出大于4的元素的位置。 find(A4),例2-10 先建立55矩阵A,然后将A的第一行元素乘以1,第二行乘以2,第五行乘以5。 A=17,0,1,0,15;23,5,7,14,16;4,0,13,0,22;10,12,19,21,3;. 11,18,25,2,19; D=diag(1:5); D*A %用D左乘A,对A的每行乘以一个指定常数,例2-13 建立一个字符串向量,然后对该向量做如下处理: (1) 取第15个字符组成的子字符串。 (2) 将字符串倒过来重新排列。 (3) 将字符串中的小写字母变成相应的大写字母,其余字符不变。 (4)
4、统计字符串中小写字母的个数。,命令如下: ch=ABc123d4e56Fg9; subch=ch(1:5) %取子字符串 revch=ch(end:-1:1) %将字符串倒排 k=find(ch=a %将小写字母变成相应的大写字母 char(ch) length(k) %统计小写字母的个数,例3-3 求一元二次方程ax2 +bx+c=0的根。 程序如下: a=input(a=?); b=input(b=?); c=input(c=?); d=b*b-4*a*c; x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a); disp(x1=,num2str(x(1),x2=,n
5、um2str(x(2);,例3-5 输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。 c=input(请输入一个字符,s); if c=A end,例3-6 某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示): price200 没有折扣200price500 3%折扣500price1000 5%折扣1000price2500 8%折扣2500price5000 10%折扣 5000price 14%折扣 输入所售商品的价格,求其实际销售价格。,price=input(
6、请输入商品价格); switch fix(price/100) case 0,1 %价格小于200rate=0;case 2,3,4 %价格大于等于200但小于500rate=3/100;case num2cell(5:9) %价格大于等于500但小于1000rate=5/100;case num2cell(10:24) %价格大于等于1000但小于2500rate=8/100;case num2cell(25:49) %价格大于等于2500但小于5000rate=10/100;otherwise %价格大于等于5000rate=14/100; end price=price*(1-rate)
7、 %输出商品实际销售价格,例3-8 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。程序如下: for m=100:999 m1=fix(m/100); %求m的百位数字 m2=rem(fix(m/10),10); %求m的十位数字 m3=rem(m,10); %求m的个位数字 if m=m1*m1*m1+m2*m2*m2+m3*m3*m3 disp(m) end end,例3-11 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。 程序如下: sum=0; cnt=0; val=input(Enter a number (end in 0):
8、); while (val=0)sum=sum+val;cnt=cnt+1;val=input(Enter a number (end in 0):); end if (cnt 0)summean=sum/cnt end,例3-13 若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求1,500之间的全部完数。 for m=1:500 s=0; for k=1:m/2 if rem(m,k)=0 s=s+k; end end if m=sdisp(m); end end,例3-15 利用函数文件,实现直角坐标(x,y)与极坐标(,)之间的转换。函数文件tran.m
9、: function rho,theta=tran(x,y) rho=sqrt(x*x+y*y); theta=atan(y/x);调用tran.m的命令文件main1.m: x=input(Please input x=:); y=input(Please input y=:); rho,the=tran(x,y); rho the,例3-16 利用函数的递归调用,求n!。n!本身就是以递归的形式定义的: 显然,求n!需要求(n-1)!,这时可采用递归调用。递归调用函数文件factor.m如下: function f=factor(n) if n=1f=1; elsef=factor(n-1
10、)*n; %递归调用求(n-1)! end,3.4 程序举例 例3-19 猜数游戏。首先由计算机产生1,100之间的随机整数,然后由用户猜测所产生的随机数。根据用户猜测的情况给出不同提示,如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“You won”,同时退出游戏。用户最多可以猜7次。,例3-20 用筛选法求某自然数范围内的全部素数。素数是大于1,且除了1和它本身以外,不能被其他任何整数所整除的整数。用筛选法求素数的基本思想是:要找出2m之间的全部素数,首先在2m中划去2的倍数(不包括2),然后划去3的倍数(不包括3),由于4已被划去,再找5的倍数 (不包括5)
11、,直到再划去不超过的数的倍数,剩下的数都是素数。,Fibonacci数列定义如下: f1=1 f2=1 fn=fn-1+fn-2 (n2) 求Fibonacci数列的第20项,例5-1 在0x2区间内,绘制曲线y=2e-0.5xcos(4x) 程序如下: x=0:pi/100:2*pi; y=2*exp(-0.5*x).*cos(4*pi*x); plot(x,y),例5-4 用不同标度在同一坐标内绘制曲线y1=0.2e-0.5xcos(4x) 和y2=2e-0.5xcos(x)。 程序如下: x=0:pi/100:2*pi; y1=0.2*exp(-0.5*x).*cos(4*pi*x);
12、y2=2*exp(-0.5*x).*cos(pi*x); plotyy(x,y1,x,y2);,例5-6 在同一坐标内,分别用不同线型和颜色绘制曲线y1=0.2e-0.5xcos(4x) 和y2=2e-0.5xcos(x),标记两曲线交叉点。 程序如下: x=linspace(0,2*pi,1000); y1=0.2*exp(-0.5*x).*cos(4*pi*x); y2=2*exp(-0.5*x).*cos(pi*x); k=find(abs(y1-y2)1e-2); %查找y1与y2相等点(近似相等)的下标 x1=x(k); %取y1与y2相等点的x坐标 y3=0.2*exp(-0.5*
13、x1).*cos(4*pi*x1); %求y1与y2值相等点的y坐标 plot(x,y1,x,y2,k:,x1,y3,bp);,例5-7 在0x2区间内,绘制曲线y1=2e-0.5x和y2=cos(4x),并给图形添加图形标注。 程序如下: x=0:pi/100:2*pi; y1=2*exp(-0.5*x); y2=cos(4*pi*x); plot(x,y1,x,y2) title(x from 0 to 2pi); %加图形标题 xlabel(Variable X); %加X轴说明 ylabel(Variable Y); %加Y轴说明 text(0.8,1.5,曲线y1=2e-0.5x);
14、 %在指定位置添加图形说明 text(2.5,1.1,曲线y2=cos(4pix); legend(y1, y2) %加图例,例5-13 分别以条形图、阶梯图、杆图和填充图形式绘制曲线y=2sin(x)。 程序如下: x=0:pi/10:2*pi; y=2*sin(x); subplot(2,2,1);bar(x,y,g); title(bar(x,y,g);axis(0,7,-2,2); subplot(2,2,2);stairs(x,y,b); title(stairs(x,y,b);axis(0,7,-2,2); subplot(2,2,3);stem(x,y,k); title(ste
15、m(x,y,k);axis(0,7,-2,2); subplot(2,2,4);fill(x,y,y); title(fill(x,y,y);axis(0,7,-2,2);,例5-17 绘制三维曲面图z=sin(x+sin(y)-x/10。 程序如下: x,y=meshgrid(0:0.25:4*pi); z=sin(x+sin(y)-x/10; mesh(x,y,z); axis(0 4*pi 0 4*pi -2.5 1);,例5-20 绘制三维图形: (1) 绘制魔方阵的三维条形图。 (2) 以三维杆图形式绘制曲线y=2sin(x)。 (3) 已知x=2347,1827,2043,3025
16、,绘制饼图。 (4) 用随机的顶点坐标值画出五个黄色三角形。,subplot(2,2,1); bar3(magic(4) subplot(2,2,2); y=2*sin(0:pi/10:2*pi); stem3(y); subplot(2,2,3); pie3(2347,1827,2043,3025); subplot(2,2,4); fill3(rand(3,5),rand(3,5),rand(3,5), y ),例6-11 某观测站测得某日6:00时至18:00时之间每隔2小时的室内外温度(),用3次样条插值分别求得该日室内外6:30至17:30时之间每隔2小时各点的近似温度()。 设时间
17、变量h为一行向量,温度变量t为一个两列矩阵,其中第一列存放室内温度,第二列储存室外温度。命令如下: h =6:2:18; t=18,20,22,25,30,28,24;15,19,24,28,34,32,30; XI =6.5:2:17.5 YI=interp1(h,t,XI,spline) %用3次样条插值计算,例6-13 某实验对一根长10米的钢轨进行热源的温度传播测试。用x表示测量点0:2.5:10(米),用h表示测量时间0:30:60(秒),用T表示测试所得各点的温度()。试用线性插值求出在一分钟内每隔20秒、钢轨每隔1米处的温度TI。 命令如下: x=0:2.5:10; h=0:30
18、:60; T=95,14,0,0,0;88,48,32,12,6;67,64,54,48,41; xi=0:10; hi=0:20:60; TI=interp2(x,h,T,xi,hi,例6-15 给定数学函数 x(t)=12sin(210t+/4)+5cos(240t) 取N=128,试对t从01秒采样,用fft作快速傅立叶变换,绘制相应的振幅-频率图。 在01秒时间范围内采样128点,从而可以确定采样周期和采样频率。由于离散傅立叶变换时的下标应是从0到N-1,故在实际应用时下标应该前移1。又考虑到对离散傅立叶变换来说,其振幅| F(k)|是关于N/2对称的,故只须使k从0到N/2即可。,N
19、=128; % 采样点数 T=1; % 采样时间终点 t=linspace(0,T,N); % 给出N个采样时间ti(I=1:N) x=12*sin(2*pi*10*t+pi/4)+5*cos(2*pi*40*t); % 求各采样点样本值x dt=t(2)-t(1); % 采样周期 f=1/dt; % 采样频率(Hz) X=fft(x); % 计算x的快速傅立叶变换X F=X(1:N/2+1); % F(k)=X(k)(k=1:N/2+1) f=f*(0:N/2)/N; % 使频率轴f从零开始 plot(f,abs(F),-*) % 绘制振幅-频率图 xlabel(Frequency); yl
20、abel(|F(k)|),例8-1 求定积分。(1) 建立被积函数文件fesin.m。 function f=fesin(x) f=exp(-0.5*x).*sin(x+pi/6);(2) 调用数值积分函数quad求定积分。 S,n=quad(fesin,0,3*pi) S =0.9008 n =77,例8-7 用不同的方法求函数f(x)的数值导数,并在同一个坐标系中做出f(x)的图像。 程序如下: f=inline(sqrt(x.3+2*x.2-x+12)+(x+5).(1/6)+5*x+2); g=inline(3*x.2+4*x-1)./sqrt(x.3+2*x.2-x+12)/2+1/
21、6./(x+5).(5/6)+5); x=-3:0.01:3; p=polyfit(x,f(x),5); %用5次多项式p拟合f(x) dp=polyder(p); %对拟合多项式p求导数dp dpx=polyval(dp,x); %求dp在假设点的函数值 dx=diff(f(x,3.01)/0.01; %直接对f(x)求数值导数 gx=g(x); %求函数f的导函数g在假设点的导数 plot(x,dpx,x,dx,.,x,gx,-); %作图,syms a m x; f=(x*(exp(sin(x)+1)-2*(exp(tan(x)-1)/(x+a); limit(f,x,a) ans = (1/2*a*exp(sin(a)+1/2*a-exp(tan(a)+1)/a 极限2: syms x t; limit(1+2*t/x)(3*x),x,inf) ans = exp(6*t),