加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

刘卫国 Matlab 例题 4-5章

(2011-03-14 12:13:52)
标签:

教育

5

4.1  建立一个命令文件将变量a,b的值互换,然后运行该命令文件。

    程序1

首先建立命令文件并以文件名exch.m存盘:

clear;

a=1:10;

b=[11,12,13,14;15,16,17,18];

c=a;a=b;b=c;

a

b

然后在MATLAB的命令窗口中输入exch,将会执行该命令文件。

    2

    首先建立函数文件fexch.m

function [a,b]=exch(a,b)

c=a;a=b;b=c;

然后在MATLAB的命令窗口调用该函数文件:

clear;

x=1:10;

y=[11,12,13,14;15,16,17,18];

[x,y]=fexch(x,y)

    4.2  求一元二次方程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=',num2str(x(2))]);

4.3  计算分段函数:

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

x=input('请输入x的值:');

if x==10

  y=cos(x+1)+sqrt(x*x+1);

else

  y=x*sqrt(x+sqrt(x));

end

y

也可以用单分支if语句来实现:

x=input('请输入x的值:');

y=cos(x+1)+sqrt(x*x+1);

if x~=10

   y=x*sqrt(x+sqrt(x));

end

y

或用以下程序:

x=input('请输入x的值:');

if x==10

   y=cos(x+1)+sqrt(x*x+1);

end

if x~=10

   y=x*sqrt(x+sqrt(x));

end

y

   4.4 输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。

c=input('请输入一个字符','s');

if c>='A' & c<='Z'

   disp(setstr(abs(c)+abs('a')-abs('A')));

elseif c>='a'& c<='z'

    disp(setstr(abs(c)- abs('a')+abs('A')));

elseif c>='0'& c<='9'

    disp(abs(c)-abs('0'));

else

    disp(c);

end

4.5  某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示) 

    price<200           没有折扣

    200≤price<500       3%折扣

    500≤price<1000      5%折扣

    1000≤price<2500     8%折扣

    2500≤price<5000     10%折扣

5000≤price          14%折扣

输入所售商品的价格,求其实际销售价格。

price=input('请输入商品价格');

switch fix(price/100)

   case {0,1}                 %价格小于200

      rate=0;

   case {2,3,4}              %价格大于等于200但小于500

      rate=3/100;

   case num2cell(5:9)       %价格大于等于500但小于1000

      rate=5/100;

   case num2cell(10:24)     %价格大于等于1000但小于2500

      rate=8/100;

   case num2cell(25:49)     %价格大于等于2500但小于5000

      rate=10/100;

   otherwise                  %价格大于等于5000

      rate=14/100;

end

price=price*(1-rate)        %输出商品实际销售价格

4.6  矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。

A=[1,2,3;4,5,6];

B=[7,8,9;10,11,12];

try

   C=A*B;

catch

   C=A.*B;

end

C

lasterr                %显示出错原因

4.7  一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。

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

    4.8  已知 file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />,当n=100时,求y的值。

y=0;n=100;

for i=1:n

y=y+1/i/i;

end

y

    在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作,所以上述程序通常由下面的程序来代替:

n=100;

i=1:n;

f=1./i.^2;

y=sum(f)

4.9  file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

a=0;b=3*pi;

n=1000; h=(b-a)/n;

x=a; s=0;

f0=exp(-0.5*x)*sin(x+pi/6);

for i=1:n

    x=x+h;

    f1=exp(-0.5*x)*sin(x+pi/6);

    s=s+(f0+f1)*h/2;

    f0=f1;

end

s

上述程序来源于传统的编程思想。也可以利用向量运算,从而使得程序更加简洁,更赋有MATLAB的特点。程序如下:

a=0;b=3*pi;

n=1000; h=(b-a)/n;

x=a:h:b;

f=exp(-0.5*x).*sin(x+pi/6);

for i=1:n

    s(i)= (f(i)+f(i+1))*h/2;

end

s=sum(s)

    4.10  写出下列程序的执行结果。

s=0;

a=[12,13,14;15,16,17;18,19,20;21,22,23];

for k=a

    s=s+k;

end

disp(s');

    4.11  从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。

sum=0;

n=0;

x=input('Enter a number (end in 0):');

while (x~=0)

     sum=sum+x;

     n=n+1;

     x=input('Enter a number (end in 0):');

end

if (n>0)

    sum

    mean=sum/n

end

4.12  根据矩阵指数的幂级数展开式求矩阵指数。

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

X=input('Enter X:');

E=zeros(size(X));

F=eye(size(X));

n=1;

while norm(F,1)>0

   E=E+F;

   F=F*X/n;

   n=n+1;

end

E

expm(X)            %调用MATLAB矩阵指数函数求矩阵指数

    4.13  [100,200]之间第一个能被21整除的整数。

for n=100:200

if rem(n,21)~=0

      continue

end

break

end

n

4.14  若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。

4.15  用筛选法求某自然数范围内的全部素数。

        m=input('m=');

p=1:m; p(1)=0;

for i=2:sqrt(m)

   for j=2*i:i:m

      p(j)=0;

   end

end

n=find(p~=0);

p(n)

    关于在p中划去i的倍数(不包括i),可利用矩阵运算一步完成,从而得到更为简洁的程序:

m=input('m=');

p=2:m;

for i=2:sqrt(m)

   n=find(rem(p,i)==0&p~=i);

   p(n)=[];

end

p

    4.16  编写函数文件求半径为r的圆的面积和周长。

    函数文件如下:       

function [s,p]=fcircle(r)

%CIRCLE  calculate the area and perimeter of a circle of radii r

%r          圆半径

%s          圆面积

%p          圆周长

 

06230日编

s=pi*r*r;

p=2*pi*r;

    将以上函数文件以文件名fcircle.m存盘,然后在MATLAB命令窗口调用该函数:

[s,p]=fcircle(10)

    4.17  利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。

    函数文件tran.m

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

    4.18  利用函数的递归调用,求n!。

function f=factor(n)

if n<=1

   f=1;

else

   f=factor(n-1)*n;    %递归调用求(n-1)!

end

    在命令文件main2.m中调用函数文件factor.ms=1!+2!+3!+4!+5!

s=0;

for i=1:5

   s=s+factor(i);

end

s

4.19  任意排列问题。MATLAB提供的函数randperm(n),可以产生一个从整数1到整数n的任意排列。编写一个函数来实现randperm(n)函数的功能,即给出一个由任意数组成的行向量,然后产生这个行向量元素的任意排列。

function Y=rndprm1(X)

%RNDPRM1    for循环产生一个行向量的任意排列

%RNDPRM1(X)产生行向量X的任意排列

[m,n]=size(X);

if m>1

   error('RNDPRM1 accepts as inputs only vectors');

end

Y=[];                     %从一个空矩阵开始

l=n;                      %X的元素个数

for i=1:n

k=1+fix(l*rand);        %随机选择Y的下一个元素的位置

x=X(k);                   %被选择的元素

      Y=[Y,x];            %X添加到Y

      X(k)=[];            %X中删除x元素 

      l=l-1  ;             %更新X的元素个数

end

第二个程序用函数的递归调用:

function Y=rndprm2(X)

%RNDPRM2    用递归调用产生一个行向量的任意排列

%RNDPRM2(X)产生一个X的任意排列

[m,n]=size(X);

l=n;

if m>1

   error('RNDPRM2 accepts as inputs only vectors')

end

if n<=1

    Y=X;

else

k=1+fix(l*rand);        %随机选择Y的下一个元素的位置

x=X(k);                   %被选择的元素

X(k)=[];                  %X中删除x元素 

    Z=rndprm2(X);            %将剩下的元素随机排列

    Y=[Z,x];                  %构造输出向量

    l=l-1;

end

    4.20  nargin用法示例。

    函数文件examp.m

function fout=charray(a,b,c)

if nargin==1

   fout=a;

elseif nargin==2

   fout=a+b;

elseif nargin==3

   fout=(a*b*c)/2;

end

    命令文件mydemo.m

x=[1:3];

y=[1;2;3];

examp(x)

examp(x,y')

examp(x,y,3)

    4.21  全局变量应用示例。

    先建立函数文件wadd.m,该函数将输入的参数加权相加。

function f=wadd(x,y)

global ALPHA BETA

f=ALPHA*x+BETA*y;

    在命令窗口中输入:

global ALPHA BETA

ALPHA=1;

BETA=2;

s=wadd(1,2)

 

5.1  0≤X≤2p区间内,绘制曲线y=2e-0.5xsin(2πx)

x=0:pi/100:2*pi;

y=2*exp(-0.5*x).*sin(2*pi*x);

plot(x,y)

5.2  绘制曲线

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

t=-pi:pi/100:pi;

x=t.*cos(3*t);

y=t.*sin(t).*sin(t);

plot(x,y);

5.3  用不同线型和颜色在同一坐标内绘制曲线y=2e-0.5xsin(2πx)及其包络线。

x=(0:pi/100:2*pi)';

y1=2*exp(-0.5*x)*[1,-1];

y2=2*exp(-0.5*x).*sin(2*pi*x);

x1=(0:12)/2;

y3=2*exp(-0.5*x1).*sin(2*pi*x1);

plot(x,y1,'k:',x,y2,'b--',x1,y3,'rp');

5.4  用不同标度在同一坐标内绘制曲线y1=e-0.5xsin(2πx)及曲线y2=1.5e-0.1xsin(x)

x1=0:pi/100:2*pi;

x2=0:pi/100:3*pi;

y1=exp(-0.5*x1).*sin(2*pi*x1);

y2=1.5*exp(-0.1*x2).*sin(x2);

plotyy(x1,y1,x2,y2);

5.5  绘制分段函数曲线并添加图形标注。

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

x=linspace(0,10,100);

y=[];

for x0=x

   if x0>=8

      y=[y,1];

   elseif x0>=6

      y=[y,5-x0/2];

   elseif x0>=4

      y=[y,2];

   elseif x0>=0

      y=[y,sqrt(x0)];

   end

end

plot(x,y)

axis([0 10 0 2.5])            %设置坐标轴

title('分段函数曲线');          %加图形标题

xlabel('Variable X');         %X轴说明

ylabel('Variable Y');         %Y轴说明

text(2,1.3,'y=x^{1/2}');      %在指定位置添加图形说明

text(4.5,1.9,'y=2');

text(7.3,1.5,'y=5-x/2');

text(8.5,0.9,'y=1');

5.6  用图形保持功能在同一坐标内绘制曲线y=2e-0.5xsin(2πx)及其包络线。

x=(0:pi/100:2*pi)';

y1=2*exp(-0.5*x)*[1,-1];

y2=2*exp(-0.5*x).*sin(2*pi*x);

plot(x,y1,'b:');

axis([0,2*pi,-2,2]);        %设置坐标

hold on;        %设置图形保持状态

plot(x,y2,'k');

legend('包络线','包络线','曲线y');       %加图例

hold off;        %关闭图形保持

grid              %网格线控制

5.7  在一个图形窗口中以子图形式同时绘制正弦、余弦、正切、余切曲线。

x=linspace(0,2*pi,60);

y=sin(x);

z=cos(x);

t=sin(x)./(cos(x)+eps);

ct=cos(x)./(sin(x)+eps);

subplot(2,2,1);

plot(x,y);

title('sin(x)');axis([0,2*pi,-1,1]);

subplot(2,2,2);

plot(x,z);

title('cos(x)');axis([0,2*pi,-1,1]);

subplot(2,2,3);

plot(x,t);

title('tangent(x)');axis([0,2*pi,-40,40]);

subplot(2,2,4);

plot(x,ct);

title('cotangent(x)');axis([0,2*pi,-40,40]);

请看下面的程序。

x=linspace(0,2*pi,60);

y=sin(x);

z=cos(x);

t=sin(x)./(cos(x)+eps);

ct=cos(x)./(sin(x)+eps);

subplot(2,2,1);     %选择2×2个区中的1号区

stairs(x,y);title('sin(x)-1');axis ([0,2*pi,-1,1]);

subplot(2,1,2);     %选择2×1个区中的2号区

stem(x,y);title('sin(x)-2');axis ([0,2*pi,-1,1]);

subplot(4,4,3);      %选择4×4个区中的3号区

plot(x,y);title('sin(x)');axis ([0,2*pi,-1,1]);

subplot(4,4,4);      %选择4×4个区中的4号区

plot(x,z);title('cos(x)');axis ([0,2*pi,-1,1]);

subplot(4,4,7);       %选择4×4个区中的7号区

plot(x,t);title('tangent(x)');axis ([0,2*pi,-40,40]);

subplot(4,4,8);        %选择4×4个区中的8号区

plot(x,ct);title('cotangent(x)');axis ([0,2*pi,-40,40]);

5.8  分别以条形图、填充图、阶梯图和杆图形式绘制曲线y=2e-0.5x

x=0:0.35:7;

y=2*exp(-0.5*x);

subplot(2,2,1);bar(x,y,'g');

title('bar(x,y,''g'')');axis([0,7,0,2]);

subplot(2,2,2);fill(x,y,'r');

title('fill(x,y,''r'')');axis([0,7,0,2]);

subplot(2,2,3);stairs(x,y,'b');

title('stairs(x,y,''b'')');axis([0,7,0,2]);

subplot(2,2,4);stem(x,y,'k');

title('stem(x,y,''k'')');axis([0,7,0,2]);

5.9  绘制ρ=sin(2θ)cos(2θ)的极坐标图。

theta=0:0.01:2*pi;

rho=sin(2*theta).*cos(2*theta);

polar(theta,rho,'k');

5.10  绘制y=10x2的对数坐标图并与直角线性坐标图进行比较。

x=0:0.1:10;

y=10*x.*x;

subplot(2,2,1);

plot(x,y);

title('plot(x,y)');grid on;

subplot(2,2,2);

semilogx(x,y);

title('semilogx(x,y)');grid on;

subplot(2,2,3);

semilogy(x,y);

title('semilogy(x,y)');grid on;

subplot(2,2,4);

loglog(x,y);

title('loglog(x,y)');grid on;

5.11  fplot函数绘制f(x)=cos(tan(πx))的曲线。

先建立函数文件myf.m

function y=myf(x)

y=cos(tan(pi*x));

再用fplot函数绘制myf.m函数的曲线:

fplot('myf',[-0.4,1.4],1e-4)

得到如图5.12所示曲线。从图5.12中可看出,在x=0.5附近采样点十分密集。

也可以直接用fplot函数绘制f(x)=cos(tan(πx))的曲线:

fplot('cos(tan(pi*x))',[ -0.4,1.4],1e-4)

5.12  绘制图形:

(1)某次考试优秀、良好、中等、及格、不及格的人数分别为:7,17,23,19,5,试用饼图作成绩统计分析。

(2)绘制复数的相量图:3+2i5.5-i-1.5+5i

subplot(1,2,1);

pie([7,17,23,19,5]);

title('饼图');legend('优秀','良好','中等','及格','不及格');

subplot(1,2,2);

compass([3+2i,5.5-i,-1.5+5i]);title('相量图');

5.13  绘制空间曲线:

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

t=0:pi/50:2*pi;

x=8*cos(t);

y=4*sqrt(2)*sin(t);

z=-4*sqrt(2)*sin(t);

plot3(x,y,z,'p');

title('Line in 3-D Space');

text(0,0,0,'origin');

xlabel('X'),ylabel('Y'),zlabel('Z');grid;

5.14  已知6<x<3015<y<36,求不定方程2x+5y=126的整数解。

x=7:29;

y=16:35;

[x,y]=meshgrid(x,y);  %[7,29]×[16,35]区域生成网格坐标

z=2*x+5*y;

k=find(z==126);        %找出解的位置  

x(k)',y(k)'             %输出对应位置的x,y即方程的解

5.15  用三维曲面图表现函数z=sin(y)cos(x)

程序1

x=0:0.1:2*pi;

[x,y]=meshgrid(x);

z=sin(y).*cos(x);

mesh(x,y,z);

xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');

title('mesh');

程序2

x=0:0.1:2*pi;

[x,y]=meshgrid(x);

z=sin(y).*cos(x);

surf(x,y,z);

xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');

title('surf');

程序3

x=0:0.1:2*pi;

[x,y]=meshgrid(x);

z=sin(y).*cos(x);

plot3(x,y,z);

xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');

title('plot3-1');grid;

5.16  绘制个直径相等的圆管的相交图形。

%两个等直径圆管的交线

m=30;

z=1.2*(0:m)/m;

r=ones(size(z));

theta=(0:m)/m*2*pi;

x1=r'*cos(theta);y1=r'*sin(theta);      %生成第一个圆管的坐标矩阵

z1=z'*ones(1,m+1);

x=(-m:2:m)/m;

x2=x'*ones(1,m+1);y2=r'*cos(theta);     %生成第二个圆管的坐标矩阵

z2=r'*sin(theta);

surf(x1,y1,z1);                  %绘制竖立的圆管

axis equal,axis off

hold on

surf(x2,y2,z2);                 %绘制平放的圆管

axis equal,axis off

title('两个等直径圆管的交线');

hold off

5.17  分析由函数z=x2-2y2构成的曲面形状及与平面z=a的交线。

[x,y]=meshgrid(-10:0.2:10);

z1=(x.^2-2*y.^2)+eps;       %1个曲面

a=input('a=?');

z2=a*ones(size(x));          %2个曲面

subplot(1,2,1);

mesh(x,y,z1);hold on;mesh(x,y,z2);           %分别画出两个曲面

v=[-10,10,-10,10,-100,100];axis(v);grid;    %1子图的坐标设置

hold off;

r0=abs(z1-z2)<=1;                        %求两曲面z坐标差小于1的点

xx=r0.*x; yy=r0.*y; zz=r0.*z2;        %求这些点上的x,y,z坐标,即交线坐标

subplot(1,2,2);

plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'*');        %在第2子图画出交线

axis(v);grid;       %2子图的坐标设置

5.18  xy平面内选择区域[-8,8]×[-8,8],绘制函数

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

4种三维曲面图。

 [x,y]=meshgrid(-8:0.5:8);

z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps);

subplot(2,2,1);

meshc(x,y,z);

title('meshc(x,y,z)')

subplot(2,2,2);

meshz(x,y,z);

title('meshz(x,y,z)')

subplot(2,2,3);

surfc(x,y,z)

title('surfc(x,y,z)')

subplot(2,2,4);

surfl(x,y,z)

title('surfl(x,y,z)')

5.19  绘制标准三维曲面图形。

t=0:pi/20:2*pi;

[x,y,z]= cylinder(2+sin(t),30);

subplot(1,3,1);

surf(x,y,z);

subplot(1,3,2);

[x,y,z]=sphere;

surf(x,y,z);

subplot(1,3,3);

[x,y,z]=peaks(30);

meshz(x,y,z);

5.20  绘制三维图形:

(1)绘制魔方阵的三维条形图。

(2)以三维杆图形式绘制曲线y=2sin(x)

(3)已知x=[2347,1827,2043,3025],绘制三维饼图。

(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' )

5.21  绘制多峰函数的瀑布图和等高线图。

subplot(1,2,1);

[X,Y,Z]=peaks(30);

waterfall(X,Y,Z)

xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');

subplot(1,2,2);

contour3(X,Y,Z,12,'k');          %其中12代表高度的等级数

xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');

5.22  从不同视点绘制多峰函数曲面。

subplot(2,2,1);mesh(peaks);

view(-37.5,30);       %指定子图1的视点

title('azimuth=-37.5,elevation=30')

subplot(2,2,2);mesh(peaks);

view(0,90);            %指定子图2的视点

title('azimuth=0,elevation=90')

subplot(2,2,3);mesh(peaks);

view(90,0);             %指定子图3的视点

title('azimuth=90,elevation=0')

subplot(2,2,4);mesh(peaks);

view(-7,-10);           %指定子图4的视点

title('azimuth=-7,elevation=-10')

5.23  3图形着色方式的效果展示

z=peaks(20);colormap(copper);

subplot(1,3,1);surf(z);

subplot(1,3,2); surf(z);shading flat;

subplot(1,3,3);surf(z);shading interp;

5.24  绘制两个球面,其中一个球在另一个球里面,将外面的球裁掉一部分,使得能看见里面的球。

[x,y,z]=sphere(20);

%生成外面的大球

z1=z;

z1(:,1:4)=NaN;    %将大球裁掉一部分

c1=ones(size(z1));

surf(3*x,3*y,3*z1,c1);

%生成里面的小球

hold on

z2=z;

c2=2*ones(size(z2));

c2(:,1:4)=3*ones(size(c2(:,1:4)));

surf(1.5*x,1.5*y,1.5*z2,c2);

colormap([0,1,0;0.5,0,0;1,0,0]);

grid on

hold off

5.25  隐函数绘图应用举例。

subplot(2,2,1);

ezplot('x^2+y^2-9');axis equal

subplot(2,2,2);

ezplot('x^3+y^3-5*x*y+1/5')

subplot(2,2,3);

ezplot('cos(tan(pi*x))',[ 0,1])

subplot(2,2,4);

ezplot('8*cos(t)','4*sqrt(2)*sin(t)',[0,2*pi])

5.26  在同一坐标下画红、绿两根不同曲线,希望获得绿色曲线的句柄,并对其进行设置。

x=0:pi/50:2*pi;

y=sin(x);

z=cos(x);

plot(x,y,'r',x,z,'g');

H=get(gca,'Children');               %获取两曲线句柄向量H

for k=1:length(H) 

   if get(H(k),'Color')==[0 1 0]    %[0 1 0]代表绿色

      Hg=H(k);       %获取绿色线条句柄

   end

end

pause                %便于观察设置效果

set(Hg,'LineStyle',':','Marker','p');     %对绿色曲线进行设置

    5.27  建立一个图形窗口。该图形窗口没有菜单条,标题名称为“图形窗口示例”,起始于屏幕左下角、宽度和高度分别为300像素点和150像素点,背景颜色为绿色,且当用户从键盘按下任意一个键时,将显示“Hello,Keyboard Key Pressed.”字样。

hf=figure('Color',[0,1,0],'Position',[1,1,300,150],...

 'Name','图形窗口示例','NumberTitle','off','MenuBar','none',...

 'KeyPressFcn','disp(''Hello,Keyboard Key Pressed.'')');

5.28  分别在4个不同的图形窗口绘制出正弦、余弦、正切、余切曲线。要求先建立一个图形窗口并绘图,然后每关闭一个再建立下一个,直到建立第4个窗口并绘图。

x=linspace(0,2*pi,60);

y=sin(x);

z=cos(x);

t=tan(x);

ct=1./(t+eps);;

%命令组待用

C4=['figure(''Name'',''cotangent(x)'',''NumberTitle'',',...

    '''off'');plot(x,ct);axis([0,2*pi,-40,40]);'];

C3=['figure(''Name'',''tangent(x)'',''DeleteFcn'',C4,',...

    '''NumberTitle'',''off'');plot(x,t);axis([0,2*pi,-40,40]);'];

C2=['figure(''Name'',''cos(x)'',''DeleteFcn'',C3,',...

    '''NumberTitle'',''off'');plot(x,z);axis([0,2*pi,-1,1]);'];

%先创建1个图形窗口并绘制曲线

figure('Name','sin(x)','DeleteFcn',C2,'NumberTitle','off');

plot(x,y);

axis([0,2*pi,-1,1]);

5.29  利用坐标轴对象实现图形窗口的任意分割。

clf;   %清图形窗口

x=linspace(0,2*pi,20);

y=sin(x);

axes('Position',[0.2,0.2,0.2,0.7] ,'GridLineStyle','-.');

plot(y,x);title('sin(x)-1');

axes('Position',[0.4,0.5,0.2,0.1]);

stairs(x,y);title('sin(x)-2');

axes('Position',[0.55,0.6,0.25,0.3]);

stem(x,y);title('sin(x)-3');

axes('Position',[0.55,0.2,0.25,0.3]);

[x,y]=meshgrid(-8:0.5:8);

z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps);

mesh(x,y,z); title('mesh(x,y,z)');

5.30  利用曲线对象绘制曲线file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image012.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />

t=0:pi/100:pi/2;

y1=sin(2*pi*t);

y2=sqrt(3)/2*exp(-4*t).*sin(4*sqrt(3)*t+pi/3);

figh=figure;

axes('GridLineStyle',':','XLim',[0,pi/2],'YLim',[-1,1]);

line('XData',t,'YData',y1,'LineWidth',1);

line(t,y2);

grid on

5.31  利用曲线对象绘制file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image016.gifMatlab 例题 4-5章" TITLE="刘卫国 Matlab 例题 4-5章" />并利用文字对象完成标注。

theta=-pi:.1:pi;

y1=sin(theta);

y2=cos(theta);

h=line(theta,y1,'LineStyle',':','Color','g');

line(theta,y2,'LineStyle','--','Color','b');

xlabel('-\pi \leq \theta \leq \pi')

ylabel('sin(\theta)')

title('Plot of sin(\theta)')

text(-pi/4,sin(-pi/4),'\leftarrow sin(-\pi\div4)','FontSize',12)

set(h,'Color','r','LineWidth',2)       %改变曲线1的颜色和线宽

5.32  利用曲面对象绘制三维曲面z=sin(y)cos(x)

x=0:0.1:2*pi;

[x,y]=meshgrid(x);

z=sin(y).*cos(x);

axes('view',[-37.5,30]);

hs=surface(x,y,z,'FaceColor','w','EdgeColor','flat');

grid on;

xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');

title('mesh-surf');

pause;

set(hs,'FaceColor','flat'); 

5.33  绘制两个等直径圆柱体的交线。

作图时,常常需要改变曲线的属性,例如线型、线宽、颜色等。如果对多根曲线做同样的操作可能是很烦琐的,下面的函数可以简化操作。

%PLINE  绘制给定点和属性的直线。

%   pline(P,w,c,s)绘制两点间的直线

%   直线的坐标在矩阵P中描述,宽度是w,颜色是c,线型是s

%   矩阵P的格式

%      [ x1  x2       xn

%        y1  y2       yn]

%   其中 x1,y1是坐标的第一个点,其余坐标点类推。三维曲线相应作修改

function pline(P,w,c,s)

[m,n]=size(P);

if m==2                     % 二维曲线

    H1=plot(P(1,:),P(2,:));

    set(H1,'Linewidth',w,'Color',c,'LineStyle',s)

elseif m==3                  % 三维曲线

    H2=plot3(P(1,:),P(2,:),P(3,:));

    set(H1,'LineWidth',w,'Color',c,'LineStyle',s)

else

    error('Input argument P has inadequate dimensions')

end

下面是绘制两个等直径圆柱体管交线的程序。

r1=5;             % 第一个圆柱体的半径

r2=5;             % 第二个圆柱体的半径

%前视图

% 开始做水平圆柱

P0=[0;0]; P1=[-5;5];

P2=[-13;5]; P3=[-13;-5];

P4=[13;-5]; P5=[13;5];

P6=[5;5];

patch([P0(1),P6(1),P5(1),P4(1),P3(1),P2(1),P1(1)],...

[P0(2),P6(2),P5(2),P4(2),P3(2),P2(2),P1(2)],'y')

axis([-15 30 -27 18]),axis equal,axis off

hold on

%开始做垂直圆柱

P7=[5;15];P8=[-5;15];

patch([P0(1),P6(1),P5(1),P4(1),P3(1),P2(1),P1(1)],...

[P0(2),P6(2),P5(2),P4(2),P3(2),P2(2),P1(2)],'g')

pline([P0 P1 P2 P3 P4 P5 P6 P0],2.5,'k','-')      %设置水平圆柱的外围线

pline([P6 P7 P8 P1],2.5,'k','-')                    %设置垂直圆柱的外围线

%侧视图

t=0:pi/90:2*pi;                   %水平圆柱

xc=23+r1*cos(t); zc=r1*sin(t);

patch(xc,zc,'y')

% 开始做垂直圆柱

z1=0;

P11=[28;z1];P12=[28;15];

P13=[18;15];P14=[18;z1];

%定义交线

ti=0:pi/90:pi;

xi2=23+r1*cos(ti);zi2=r1*sin(ti);

%垂直圆柱

patch([xi2,P11(1),P12(1),P13(1),P14(1)],...

[zi2,P11(2),P12(2),P13(2),P14(2)],'g')

pline([xc;zc],2.5,'k','-')

pline([P11 P12 P13 P14],2,'k','-')

ha=plot([-14 29],[0 0],'k-.');              %水平轴

set(ha,'LineWidth',1.5)

ha=plot([0 0],[-6 16],'k-.');

% 侧视图的垂直轴

set(ha,'LineWidth',1.5)

ha=plot([23 23],[-6 16],'k-.');

% 侧视图的垂直轴

set(ha,'LineWidth',1.5)

ht=title('Intersection of perpendicular,equal-diameter cylinders');

set(ht,'FontSize',14)

t1='horizontal cylinder:       y^2+z^2=r^2';

ht=text(-12,-10,t1);

set(ht,'FontSize',14)

t2='vertical cylinder:             x^2+y^2=r^2';

ht=text(-12,-15,t2);

set(ht,'FontSize',14)

ht=text(-12,-20,'projection of intersection:z^2-x^2=0');

set(ht,'FontSize',14)

hold off

5.34  在同一个图形窗口中创建矩形、圆角矩形、椭圆和圆各一个并使用了不同的线型和线宽。

subplot(2,2,1);

rectangle('Position',[2,3,25,15],'LineWidth',3);

subplot(2,2,2);

rectangle('Position',[3,5,15,8], 'Curvature',0.4,'LineWidth',2);

subplot(2,2,3);

rectangle('Position',[5,3,10,15],'Curvature',[1,1]);

subplot(2,2,4);

rectangle('Position',[5,3,10,10],'Curvature',[1,1],...

      'LineStyle','--','FaceColor','r');

axis equal

5.35  光照处理后的球面并观察不同光照模式下的效果。

 [x,y,z]=sphere(20);

subplot(1,4,1);

surf(x,y,z);axis equal;

shading interp;

hold on;

subplot(1,4,2);

surf(x,y,z);axis equal;

light('Position',[0,1,1]);

shading interp;lighting flat;

hold on;

plot3(0,1,1,'p');text(0,1,1,' light');

subplot(1,4,3);

surf(x,y,z);axis equal;

light('Position',[0,1,1]);

shading interp;lighting gouraud;

hold on;

subplot(1,4,4);

surf(x,y,z);axis equal;

light('Position',[0,1,1]);

shading interp;lighting phong;

5.36  生成一个球体和一个立方体,观察不同光照属性对应的显示效果。

sphere(36);

h=findobj('Type','surface');

set(h,'FaceLighting','phong','FaceColor','interp',...

'EdgeColor',[0.4,0.4,0.4],'BackFaceLighting','lit')

hold on

vert=[2,0,-1;2,1,-1;3,0,0;3,0,-1;2,0,0;2,1,0;3,1,0;3,0,0];

fac=[1,2,3,4;2,6,7,3;4,3,7,8;1,5,8,4;1,2,6,5;5,6,7,8];

patch('Faces',fac,'Vertices',vert,'FaceColor','y');

light('Position',[1,3,2]);

light('Position',[-3,-1,3]);

material shiny

axis equal

hold off

5.37  E盘根目录下有一图像文件flower.jpg,在图形窗口显示该图像。

[x,cmap]=imread('e:\flower.jpg');       %读取图像的数据阵和色图阵

image(x);           %显示图像

colormap(cmap);

axis image off     %保持宽高比并取消坐标轴

5.38  播放一个直径不断变化的球体。

[x,y,z]=sphere(50);

m=moviein(30);        %建立一个30列大矩阵

for i=1:30

   surf(i*x,i*y,i*z)      %绘制球面

   m(:,i)=getframe;      %将球面保存到m矩阵

end

movie(m,10);        %以每秒10幅的速度播放球面

5.39  模拟布朗运动。

n=30;               %指定布朗运动的点数

s=0.02;            %指定温度或速率

%产生n个随机点(x,y),处于-0.50.5之间

x=rand(n,1)-0.5;

y=rand(n,1)-0.5;

h=plot(x,y,'.');       %绘制随机点

axis([-1 1 -1 1]) ;

axis square

grid off

set(h,'EraseMode','Xor','MarkerSize',20);    %设置擦除模式为Xor

%循环5000次,产生动画效果

for i=linspace(1,10,5000)

    drawnow

    x=x+s*randn(n,1);      %在坐标点附近添加随机噪声

    y=y+s*randn(n,1);

    set(h,'XData',x,'YData',y);   %通过改变数据属性来重新绘图

end


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有