Presentation is loading. Please wait.

Presentation is loading. Please wait.

MATLAB程序设计教程(第二版) 刘卫国 主编 中国水利水电出版社.

Similar presentations


Presentation on theme: "MATLAB程序设计教程(第二版) 刘卫国 主编 中国水利水电出版社."— Presentation transcript:

1 MATLAB程序设计教程(第二版) 刘卫国 主编 中国水利水电出版社

2 第4章 MATLAB绘图 MATLAB二维数据曲线图的绘制 MATLAB三维图形的绘制 MATLAB图形修饰处理

3 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图细节,只需给出一些基本参数即可得到所需图形。这些函数称为高层绘图函数。除此之外,Matlab还提供了一些直接对图形句柄进行操作的低层绘图操作。低层操作将图形的每一个图形元素(如坐标轴、曲线、曲面等)看成一个独立的对象,系统对每一个图形对象分配一个句柄,以后可通过该句柄对图形元素进行操作。而不影响图形的其他部分。

4 格式:plot(x,y) %x,y为纵横坐标值,且长度相同的向量
4.1 二维数据曲线图 绘制单根二维曲线 plot函数的基本调用格式为: 格式:plot(x,y) %x,y为纵横坐标值,且长度相同的向量 其中x和y为长度相同的向量,分别用于存储x坐标和 y坐标数据。用于绘制分别以x坐标和y坐标为横、纵 坐标的二维曲线。x,y所包含的元素个数相等同,y(i) 是x(i)点的函数值

5 y=2*exp(-0.5*x).*cos(4*pi*x); plot(x,y)
y=2e-0.5xcos(4πx) 程序如下: x=0:pi/100:2*pi; y=2*exp(-0.5*x).*cos(4*pi*x); plot(x,y) 此点必加 计算函数值y时,指数函数与余弦函数之间要用点乘运算。

6 输出结果:

7 例4-2 绘制曲线。 程序如下: t=0:0.1:2*pi; x=t.*sin(3*t); y=t.*sin(t).*sin(t); plot(x,y);

8 plot函数最简单的调用格式是只包含一个输入参数:
plot(x) 在这种情况下,当x是实向量时,以该向量元素的下 标为横坐标,元素值为纵坐标画出一条连续曲线, 这实际上是绘制折线图。 当x是复数向量时,则分别以向量元素实部和虚部为 横、纵坐标绘制一条曲线。例如:画一个单位圆: t=0:0.01:2*pi; x=exp(i*t); %x为一复数向量,i是复数单位

9 绘制多根二维曲线 1.plot函数的输入参数是矩阵形式 (1) 当x是向量,y是有一维与x同维的矩阵时,则绘制出多根不同颜色的曲线。曲线条数等于y矩阵的另一维数,x被作为这些曲线共同的横坐标。如在同一坐标系中画出3条正弦曲线: x=linspace(0,2*pi,100); y=[sin(x);1+sin(x);2+sin(x)]; plot(x,y)

10 y=[sin(x1);1+sin(x2);2+sin(x3)] '; plot(x,y)
(2) 当x,y是同维矩阵时,则以x,y对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。 x1=linspace(0,2*pi,100); x2=linspace(0,3*pi,100); x3=linspace(0,4*pi,100); x=[x1;x2;x3] '; y=[sin(x1);1+sin(x2);2+sin(x3)] '; plot(x,y)

11 (3) 对只包含一个输入参数的plot函数,当输入参数是实矩阵时,则按列绘制每列元素值相对其下标的曲线,曲线条数等于输入参数矩阵的列数。
当输入参数是复数矩阵时,则按列分别以元素实部和虚部为横、纵坐标绘制多条曲线。下面程序绘制3个同心圆: t=0:0.01:2*pi; x=exp(i*t); %x为一复数向量,i是复数单位 y=[x;2*x;3*x]; plot(x)

12 2.含多个输入参数的plot函数 调用格式为: plot(x1,y1,x2,y2,…,xn,yn) (1) 当输入参数都为向量时,x1和y1,x2和y2,…,xn和yn分别组成一组向量对,每一组向量对的长度可以不同。每一向量对可以绘制出一条曲线,这样可以在同一坐标内绘制出多条曲线。 x1=linspace(0,2*pi,100); x2=linspace(0,3*pi,100); x3=linspace(0,4*pi,100); plot(x1,sin(x1),x2, 1+sin(x2) ,x3,2+sin(x3))

13 x1=linspace(0,2*pi,100); x2=linspace(0,3*pi,100);
(2) 当输入参数有矩阵形式时,配对的x,y按对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。 x1=linspace(0,2*pi,100); x2=linspace(0,3*pi,100); x3=linspace(0,4*pi,100); y1= sin(x1); y2= 1+sin(x2) ; y3=2+sin(x3); x=[x1;x2;x3] '; y=[y1;y2;y3] '; plot(x,y,x1,y1-1)

14 3.具有两个纵坐标标度的图形 在MATLAB中,如果需要绘制出具有不同纵坐标标度的两个图形,可以使用plotyy绘图函数。调用格式为: plotyy(x1,y1,x2,y2) 其中x1,y1对应一条曲线,x2,y2对应另一条曲线。横坐标的标度相同,纵坐标有两个,左纵坐标用于x1,y1数据对,右纵坐标用于x2,y2数据对。

15 例4-4 用不同标度在同一坐标内绘制曲线 y1=0.2e-0.5xcos(4πx) 和y2=2e-0.5xcos(πx)。 程序如下: x=0:pi/100:2*pi; y1=0.2*exp(-0.5*x).*cos(4*pi*x); y2=2*exp(-0.5*x).*cos(pi*x); plotyy(x,y1,x,y2);

16 4、图形保持 一般情况下,每执行一次绘图命令,就刷新一次图形窗口,图形窗口原有的图形将不复存在。若希望在已存在图形的窗口上添加新的图形,Matlab提供了函数hold,hold on/off命令控制是保持原有图形还是刷新原有图形,不带参数的hold命令在两种状态下切换。

17 例:用图形保持功能在同一坐标内绘制下面函数曲线及包络线
程序如下: 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

18 通过选项定义曲线的颜色和线性见p87表4-1。 4.1.3 设置曲线样式
设置曲线样式 MATLAB提供了一些绘图选项,用于确定所绘曲线的线型、颜色和数据点标记符号,它们可以组合使用。例如,“b-.”表示蓝色点划线,“y:d”表示黄色虚线并用菱形符标记数据点。当选项省略时,MATLAB规定,线型一律用实线,颜色将根据曲线的先后顺序依次。 要设置曲线样式可以在plot函数中加绘图选项,其调用格式为: plot(x1,y1,选项1,x2,y2,选项2,…,xn,yn,选项n) 通过选项定义曲线的颜色和线性见p87表4-1。

19 例4-6 在同一坐标内,分别用不同线型和颜色绘制曲线y1=0. 2e-0. 5xcos(4πx) 和y2=2e-0
例4-6 在同一坐标内,分别用不同线型和颜色绘制曲线y1=0.2e-0.5xcos(4πx) 和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*x1).*cos(4*pi*x1); %求y1与y2值相等点的y坐标 plot(x,y1,x,y2,'k:',x1,y3,'bp');

20 图形标注与坐标控制 1.图形标注 有关图形标注函数的调用格式为: title(图形名称) xlabel(x轴说明) ylabel(y轴说明) text(x,y,图形说明) legend(图例1,图例2,…)

21 说明: 前三个函数分别说明图形和坐标轴的名称 text和gtext是在坐标处添加图形说明。
legend函数用于绘制所用线型、颜色或数据点标记图例,图放置在图形的空白处,用户还可通过鼠标移动图例说明放置在希望处。 除legend函数外,其他均可用于三维图形,z坐标轴说明用zlabel。

22 函数中的说明文字,除使用标准的ASCII字符外,还可使用LaTeX格式的控制字符,这样就可以在图形上添加希腊字母、数学符号及公式等内容。例如,text(0.3,0.5,‘sin({\omega}t+{\beta})’)将得到标注效果sin(ωt+β)。

23 例4-7 在0≤x≤2区间内,绘制曲线y1=2e-0.5x和y2=cos(4πx),并给图形添加图形标注。
程序如下: 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 2{\pi}'); %加图形标题 xlabel('Variable X'); %加X轴说明 ylabel('Variable Y'); %加Y轴说明 text(0.8,1.5,'曲线y1=2e^{-0.5x}'); %在指定位置添加图形说明 text(2.5,1.1,'曲线y2=cos(4{\pi}x)'); legend('y1', 'y2') %加图例

24 Matalb的绘图中,可以自动根据数据范围选择合适的坐标刻度,若用户重新定义坐标范围可用函数axis
2、坐标控制 Matalb的绘图中,可以自动根据数据范围选择合适的坐标刻度,若用户重新定义坐标范围可用函数axis 格式:axis(xmin xmax ynim ymax zmin zmax) 若绘制二维图形则给出前4个参数即可,除此之外,aixs函数的常用功能还有: axis equal:纵横坐标轴采用等长刻度 axis square:产生方形坐标系(默认为矩形) axis auto:使用默认设置 axis off:取消坐标轴 axis on:显示坐标轴

25 例 绘制分段函数曲线并添加图形标注 grid on/off:控制是画还是不画网格线,不带参数的grid函数命令在两种状态之间切换
box on/off:控制是加边框还是不加边框,不带参数的box函数命令在两种状态之间切换 例 绘制分段函数曲线并添加图形标注

26 程序如下: x=linspace(0,10,100); y=[]; for x0=x if x0>=8 y=[y,1]; %y=1
elseif x0>=6 y=[y,5-x0/2]; %y=5-x/2 elseif x0>=4 y=[y,2]; %y=2 elseif x0>=0 y=[y,sqrt(x0)]; %y=sqrt(x) end plot(x,y) axis([ ]) title('分段函数曲线'); xlabel('Variable x'); ylabel('Variable 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');

27 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 plot(x,y) axis([ ]) title('分段函数曲线'); xlabel('Variable x'); ylabel('Variable y'); gtext('y=x^(1/2)'); gtext('y=2'); gtext('y=5-x/2'); gtext('y=1');

28

29 例4-8 在同一坐标中,可以绘制3个同心圆,并加坐标控制。
例4-8 在同一坐标中,可以绘制3个同心圆,并加坐标控制。 程序如下: t=0:0.01:2*pi; x=exp(i*t); y=[x;2*x;3*x]'; plot(y) grid on; %加网格线 box on; %加坐标边框 axis equal %坐标轴采用等刻度

30 图形的可视化编辑 MATLAB 在图形窗口中提供了可视化的图形编辑工具,利用图形窗口菜单栏或工具栏中的有关命令可以完成对窗口中各种图形对象的编辑处理。 后面讲

31 4、图形窗口的分割 在实际应用中,经常需要在一个图形窗口绘制若干个独立的图形,这就需要对窗口进行分割。分割后的图形窗口由若干个绘图区组成,每个绘图区可以建立独立的坐标系并绘制图形。 格式: subplot(m,n,p) 说明: 该函数将当前图形窗口分成m×n个绘图区,即每行n个,共m行,区号按行优先编号,且选定第p个区为当前活动区。在每一个绘图区允许以不同的坐标系单独绘制图形。

32 例:在一个图形窗口同时绘制正弦、余弦、正切和余切曲线
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('tg(x)');axis([0 2*pi ]); subplot(2,2,4); plot(x,ct) title('ctg(x)'),axis([0 2*pi ]) 程序如下:

33 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);stairs(x,y); %绘制梯形图 title('sin(x)-1');axis([0,2*pi,-1,1]); subplot(2,1,2);stem(x,y); %产生脉冲序列 title('sin(x)-2');axis([0 2*pi -1 1]); subplot(4,4,3);plot(x,y) title('sin(x)');axis([0 2*pi -1 1]); subplot(4,4,4);plot(x,z) title('cos(x)');axis([0 2*pi -1 1]); subplot(4,4,7);plot(x,t) title('tg(x)');axis([0 2*pi ]); subplot(4, 4 ,8); plot(x,ct); title('ctg(x)');axis([0 2*pi ])

34 4.2 其他二维图形 格式:fplot(filename,lims,tol,选项)
4.2 其他二维图形 4.2.1对函数自适应采样的绘图函数 格式:fplot(filename,lims,tol,选项) 说明:filename为函数名,用以字符串形式出现,它可以是由多个分量函数构成的行向量,分量函数可以是函数的直接字符串,也可以是内部函数名或函数文件名,但自变量都必须为x。Lims为x,y的取值范围,以行向量形式出现,若取二元向量[xmin,xmax]时,x轴的范围被人为确定,若取四维向量[xmin,xmax,ymin,ymax]时,x,y轴的范围被人为确定。Tol为相对允许误差。默认值为2e-3。选项定义与plot相同。

35 例:用fplot函数绘制 的曲线 先建立函数文件myf.m: 在用fplot函数绘制myf.m函数曲线。在命令窗口键入
function y=myf(x) y=cos(tan(pi*x)); 在用fplot函数绘制myf.m函数曲线。在命令窗口键入 fplot('myf',[-0.4,1.4],1e-4) 也可直接用fplot函数绘图 fplot('cos(tan(pi*x))',[-0.4,1.4],1e-4) 输出结果:

36

37 其他坐标系下的二维数据曲线图 1.对数坐标图形 在实际应用中,经常用到对数坐标图,例如控制理论中的bode图。MATLAB提供了绘制对数和半对数坐标曲线的函数,调用格式为: semilogx(x1,y1,选项1,x2,y2,选项2,…) semilogy(x1,y1,选项1,x2,y2,选项2,…) loglog(x1,y1,选项1,x2,y2,选项2,…) 其中:选项的定义与plot函数完全一致,前两项为半坐标对数图,第三个为全坐标图

38 程序如下: 例4-11 绘制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

39 2.极坐标图 polar函数用来绘制极坐标图,其调用格式为: polar(theta,rho,选项) 其中theta为极坐标极角,rho为极坐标矢径,选项的内容与plot函数相似。

40 例4-12 绘制r=sin(t)cos(t)的极坐标图,并标记数据点。
程序如下: t=0:pi/50:2*pi; r=sin(t).*cos(t); polar(t,r,'-*');

41 二维统计分析图 在MATLAB中,二维统计分析图形很多,常见的有条形图、阶梯图、杆图和填充图等,所采用的函数分别是: bar(x,y,选项) –––– 绘制直方图 stairs(x,y,选项) –––– 绘制阶梯图 stem(x,y,选项) –––– 绘制火柴杆图 fill(x1,y1,选项1,x2,y2,选项2,…) polar –––– 绘制极坐标图 hist –––– 绘制统计直方图 rose –––– 绘制统计扇形图 comet –––– 绘制彗星曲线 area –––– 区域图 pie –––– 饼图

42 绘制和编辑条形图 条形图可以显示矢量数据和矩阵数据,如果用户需要表现跨时间段的运算结果、不同数据的比较结果以及部分相对于整体比较结果时,常会用到条形图绘制离散数据。MATLAB中提供了条形图绘制函数bar,函数bar有4种,

43 例4-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('stem(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]);

44 MATLAB提供的统计分析绘图函数还有很多,例如,用来表示各元素占总和的百分比的饼图、复数的相量图等等。
例4-14 绘制图形: (1) 某企业全年各季度的产值(单位:万元)分别为:2347,1827,2043,3025,试用饼图作统计分析。 (2) 绘制复数的相量图:7+2.9i、2-3i和-1.5-6i。

45 程序如下: subplot(1,2,1); pie([2347,1827,2043,3025]); title('饼图'); legend('一季度','二季度','三季度','四季度'); subplot(1,2,2); compass([7+2.9i,2-3i,-1.5-6i]); title('相量图');

46 例:①某次考试优良、良好、中等、及格、不及格的人数为7、17、23、19、5,试用饼形图进行成绩统计分析
举例说明 例:①某次考试优良、良好、中等、及格、不及格的人数为7、17、23、19、5,试用饼形图进行成绩统计分析 ②绘制复数的向量图:3+2i、5.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('向量图');

47 输出结果

48 4.3 隐函数绘图 MATLAB提供了一个ezplot函数绘制隐函数图形,下面介绍其用法。 (1) 对于函数f = f(x),ezplot函数的调用格式为: ezplot(f):在默认区间-2π<x<2π绘制f = f(x)的图形。 ezplot(f, [a,b]):在区间a<x<b绘制f = f(x)的图形。

49 (2) 对于隐函数f = f(x,y),ezplot函数的调用格式为:
ezplot(f):在默认区间-2π<x<2π和-2π<y<2π绘制f(x,y) = 0的图形。 ezplot(f, [xmin,xmax,ymin,ymax]):在区间xmin<x<xmax和ymin<y<ymax绘制f(x,y) = 0的图形。 ezplot(f, [a,b]):在区间a<x<b和a<y< b绘制f(x,y) = 0的图形。

50 (3) 对于参数方程x = x(t)和y = y(t),ezplot函数的调用格式为:
ezplot(x,y):在默认区间0<t<2π绘制x=x(t)和y=y(t)的图形。 ezplot(x,y, [tmin,tmax]):在区间tmin < t < tmax绘制x=x(t)和y=y(t)的图形。

51 例4-15 隐函数绘图应用举例。 程序如下: subplot(2,2,1); ezplot('x^2+y^2-9');axis equal
例4-15 隐函数绘图应用举例。 程序如下: 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])

52 例如:绘制空间曲线 4.4 三维图形 4.4.1 三维曲线 plot3函数与plot函数用法十分相似,其调用格式为:
4.4 三维图形 三维曲线 plot3函数与plot函数用法十分相似,其调用格式为: plot3(x1,y1,z1,选项1,x2,y2,z2,选项2,…,xn,yn,zn,选项n) 其中每一组x,y,z组成一组曲线的坐标参数,选项的定义和plot函数相同。当x,y,z是同维向量时,则x,y,z 对应元素构成一条三维曲线。当x,y,z是同维矩阵时,则以x,y,z对应列元素绘制三维曲线,曲线条数等于矩阵列数。 例如:绘制空间曲线

53 程序如下: 输出结果 曲线对应的参数方程为: 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,'rp'); title('Line in 3-D space'); text(0,0,0,'origin'); xlabel('x');ylabel('y');zlabel('z');grid 输出结果

54

55 例4-16 绘制三维曲线。 程序如下: t=0:pi/100:20*pi; x=sin(t); y=cos(t);
例4-16 绘制三维曲线。 程序如下: t=0:pi/100:20*pi; x=sin(t); y=cos(t); z=t.*sin(t).*cos(t); plot3(x,y,z); title('Line in 3-D Space'); xlabel('X');ylabel('Y');zlabel('Z'); grid on;

56 三维曲面 1.产生三维数据 在MATLAB中,利用meshgrid函数产生平面区域内的网格坐标矩阵。其格式为: x=a:d1:b; y=c:d2:d; [X,Y]=meshgrid(x,y); 语句执行后,矩阵X的每一行都是向量x,行数等于向量y的元素的个数,矩阵Y的每一列都是向量y,列数等于向量x的元素的个数。

57 4.4.2、三维曲面 (1)平面网格坐标矩阵的生成 绘制z=f(x,y)所代表的三维曲面,首先要在xy平面选定一矩形区域,假定矩形区域D=[a,b]×[c,d],然后将[a,b]在x方向分成m份,将[c,d]在y方向分为n份,由各划分点分别作平行于两坐标轴的直线,将区域D分成m×n各小矩形,生成代表每一个小矩形顶点坐标平面网络坐标矩阵,最后利用有关矩阵函数绘图。

58 产生平面区域内的网络坐标矩阵有两种方法 利用矩阵运算生成 x=a:dx:b; y=(c:dy:d)’; X=ones(size(y))*x;
Y=y*ones(size(x)); 上述语句执行后,矩阵X的每一行都是向量x,行数等于向量y的元素的个数,矩阵Y的每一列都是向量y,列数等于向量x的元素的个数。于是X和Y相同位置上的元素(X(i,j),Y(i,j))恰好是区域D的(i,j)网络坐标。若根据每个网格点上的x,y坐标求函数值z,则得到函数值矩阵Z。由X,Y,Z各列或各行所对应坐标,对应空间一条曲线,而空间曲线的集合组成空间曲面

59 利用meshgrid函数生成 x=a:dx:b; y=(c:dy:d); [X,Y]=meshgrid(x,y) 执行上述语句后,所得到的网络坐标X,Y与①得到的相同,当X=Y时,meshgrid函数可写成meshgrid(x)

60 (2)绘制三维曲面的函数 格式:mesh(x,y,z,c) surf(x,y,z,c) 一般情况:x,y,z是维数相同的矩阵,x,y是网络坐标矩阵,z是网点上的高度矩阵,c是指在不同高度下的颜色范围。C省略时,Matlab认为c=z,即颜色的设定正比于图形的高度,这样可以得到层次分明的三维图。当x与y是向量时,x的长度与z矩阵的列相等,y的长度与z矩阵的行相等,x、y向量元素的组合构成网格点的x、y坐标,z坐标则取自z矩阵。

61 例:用三维曲面表现函数 程序1 x=0:0.1:2*pi; [X,Y]=meshgrid(x); z=sin(Y).*cos(X);
mesh(X,Y,z); %用mesh函数绘制三维曲面图 xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis'), title('mesh') 输出结果

62

63 程序2 x=0:0.1:2*pi; [X,Y]=meshgrid(x); z=sin(Y).*cos(X); surf(X,Y,z);%用surf函数绘制三维曲面图 xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis'), title('surf') 输出结果

64

65 程序3 输出结果 x=0:0.1:2*pi; [X,Y]=meshgrid(x); z=sin(Y).*cos(X);
plot3(X,Y,z); %用plot函数绘制三维曲面图 xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis'), title('plot3-1'),grid 输出结果

66

67 例:分析由函数z=x2-2y2构成的曲面形状及平面z=a的交线
[x,y]=meshgrid(-10:0.3:10); z1=(x.^2-2*y.^2)+eps; a=input('a=?'); z2=a*ones(size(x)); subplot(1,2,1);surf(x,y,z1);hold on;surf(x,y,z2); axis([-10,10,-10,10,-100,100]);grid; hold off r0=abs(z1-z2)<=1; xx=r0.*x;yy=r0.*y;zz=r0.*z2; subplot(1,2,2); plot3(xx(r0~=0),yy(r0~=0),xx(r0~=0),'*')

68 输出结果(a=0)

69 此外,还有两个和mesh函数相似的函数,即带等高线的三维网格曲面函数meshc盒带底座的三维网格曲面函数meshz,其用法与mesh类似,不同的是meshc还在xy平面上绘制曲面再z轴方向的等高线,meshz还在xy平面上绘制曲面的底座。 函数surf也有两个类似的函数,即具有等高线的曲面函数surfc和具有光照效果的曲面函数surfl

70 例:在xy平面内选择区域[-8,8] ×[-8,8],绘制函数
的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)');

71 输出结果:

72 格式:[x,y,z]=sphere(n) %球面函数
(3)标准三维曲面 Matlab提供了sphere和cylinder函数,分别绘制三维球面和柱面。 格式:[x,y,z]=sphere(n) %球面函数 该函数将产生(n+1) ×(n+1)矩阵x,y,z,采用这三个矩阵可以绘制圆心在原点、半径为1的单位球体。若调用该函数时不输出函数,则直接绘制球面。n决定球面的圆化程度,默认值为20,n越小,则绘制出多面体表面图。

73 例:cylinder(3) %生成圆柱 格式:[x,y,z]=cylinder(R,n) %柱面
R是一个向量,存放柱面各个等间隔高度上的半径,n表示在圆柱圆周上有n个间隔点默认值为20。 例:cylinder(3) %生成圆柱

74 例: cylinder([10,1]) %生成一圆锥

75 例:下面的程序生成正弦型柱面 t=0:pi/100:4*pi; R=sin(t); cylinder(R,30)

76 例:peaks(30) %产生一个多峰图 Matlab的多峰函数:peaks
f(x,y) = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... - 1/3*exp(-(x+1).^2 - y.^2)

77 例如: [x,y]=meshgrid(-5:0.1:5); peaks(x,y)

78 例:绘制标准三维曲面图形 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) ;%绘制多峰

79

80 4.4.3、其他三维图形 在介绍二维图形时,曾经提到过条形图、杆图、饼图和填充图形,他们都可以出现在三维图中,使用的函数分别为bar3、stem3、pie3和fill3 bar3的调用格式 bar(y) bar(x,y) 在第一种格式中,y的每个元素对应一个条形,第二种格式在x制定的位置上绘制y中元素的条形图

81 格式: stem3(z) 格式: pie3(x) 格式: fill(x,y,z,c) stem(x,y,z)
第一种格式将数据序列z表示从xy平面向上延伸的杆图,x和y自动生成。 第二种格式在x,y指定的位置上绘制数据序列z的杆图,x、y、z的维数必须相同 格式: pie3(x) X为向量 格式: fill(x,y,z,c) 式中x、y、z作为三角形的顶点,c为指定的填充颜色

82 程序如下 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')

83 瀑布图的绘制,Matlab提供的调用函数waterfall,其用法及效果与函数meshz函数相似,只是在x轴方向出现瀑布效果。
等高线图分二维和三维两种,分别用函数contour和contour3绘图。

84 例:绘制多峰函数的瀑布图和等高线图 程序如下 观看执行后的效果 subplot(1,2,1); [X,Y,Z]=peaks(80);
waterfall(X,Y,Z); xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis'); subplot(1,2,2); contour3(X,Y,Z,12,'k'); 观看执行后的效果

85 例:绘制曲面图表现函数z=x2+y2。 程序如下 观看执行后的效果 clf x=-4:4;y=x; %确定自变量的取值范围
[X,Y]=meshgrid(x,y); %生成x-y平面的点格矩阵 Z=X.^2+Y.^2; %计算点格上的函数值 surf(X,Y,Z); %绘制曲面图 colormap(hot) %采用hot色图 hold on stem3(X,Y,Z,'bo') %绘制杆图 hold off xlabel('x'),ylabel('y'),zlabel('z') axis([-5,5,-5,5,0,inf]) %设置坐标范围 view([-84,21]) %控制视角 观看执行后的效果

86 view([az,el]) 通过方位角、俯视角设置视点
4.5 三维图形的精细处理 1、视角控制view 在日常生活中,从不同的角度观察物体所得到的形状是不同的。Matlab提供函数view改变试点获得较好的视角效果,视角控制有两方法 view([az,el]) 通过方位角、俯视角设置视点 az---方位角Azimyth), 默认值-370 el---俯视角(Elevation), 默认值300 当az=00,el=900,图形将以平面直角表现

87 view([vx,vy,vz]) 通过直角坐标设置视点
Matlab图形窗可交互式调节视点,为获得最佳的视觉效果,用户可先用鼠标操作调节视点,然后用[az0,el0]=view获得视觉效果的方位角和俯视角,再把这对参数通过view([az0,el0])用于绘图指令中。

88 格式:colormap(CM) 设置当前图形窗的着色色图为CM
说明: Matlab每个图形窗只能有一个色图colormap 色图为(m×3)矩阵,它的每一行是RGB三元组。色像即可通过矩阵元素的直接赋值定义,也可按某种数学规律生成。 Matlab提供了一组对不同曲面/网线图、图像进行着色矩阵。这些与定义色图矩阵只由[0,1]区间数据组成的(64×3)矩阵。如表4.4、表4.5

89 MATLAB的预定义色图矩阵CM CM 含 义 autumn 红、黄浓淡色 jet 蓝头红尾饱和值色 bone 蓝色调浓淡色 lines
含 义 autumn 红、黄浓淡色 jet 蓝头红尾饱和值色 bone 蓝色调浓淡色 lines 采用plot绘线色 colorcube 三浓淡多彩交错色 pink 淡粉红色图 cool 青、品红浓淡色 prism 光谱交错色 copper 纯铜色调线性浓淡色 SPRING 青、黄浓淡色 flag 红-白-蓝-黑交错色 summer 绿、黄浓淡色 gray 灰色调线性浓淡色 winter 蓝、绿浓淡色 hot 黑、红、黄、白浓淡色 white 全白色 hsv 两端为红的饱和值色 注意:jet时默认色图。

90 格式:shading options 图形对象着色的浓淡处理
说明: mesh、surf、pcolor、fill和fill3创建图形非数据点的着色处理 指令中选项options可有三种方式 flat—网络线某整条线段,或曲面图的某整个贴 片都是一种颜色;颜色取自该线段两端或 贴片四周顶点数据中下标最小那点的颜色。

91 intep---网络线段或曲面贴片上各点的颜色由 该线
段两端,或该贴片丝顶点处的颜色经线形插 值而得;这种方法的用色比较细腻,但最费 时。 faceted—在flat用色的基础上,再在贴片的四周勾画 黑色网线,这种方式立体感最强,是 shading 的默认值 shading是设置当前轴上“面”对象的EdgeColor和FaceColor属性的高层指令。

92 例:三种浓淡处理的比较 程序如下 观看执行后的效果 clf x=-4:4;y=x; [X,Y]=meshgrid(x,y);
Z=X.^2+Y.^2; surf(X,Y,Z) colormap(jet) subplot(1,3,1),surf(Z),axis off subplot(1,3,2),surf(Z),axis off,shading flat subplot(1,3,3),surf(Z),axis off,shading interp set(gcf,'Color','w') 观看执行后的效果

93 V可以取0到1之间的数值,0表示完全透明,1表示不透明。
4、透明度控制alpha 格式: alpha(v) 对面、块、象三种图形对象的透明 度加以控制 V可以取0到1之间的数值,0表示完全透明,1表示不透明。 例:半透明表面图 程序如下 clf surf(peaks) %绘制一个多峰曲面 shading interp %浓淡处理 alpha(0.5) %半透明处理 colormap(summer) %绿、黄浓淡色设置 观看执行后效果

94 5、灯光设置light 格式: light('color',option1,'style',option2,'position',option3) 说明: 在该指令使用前,图形采用强度各处相等的漫射光,一旦该指令被执行,虽然光源本身并不出现,但图形上“面”等子对象所有与“光”有关的属性(如背景光、边缘光)都被激活。 加入该指令不包含任何输入宗量,则采用默认设置:白光、无穷远、穿过[1,0,1]射向坐标原点。

95 任何一个输入宗量对都可以空缺,那时采用默认值。
option1可采采用RGB三元组或相应的色彩子符,如[1 0 0],或‘r’,都代表红光。 option2有两个取值:‘infinite’和‘local’。前者表示无穷光,后者为近光。 option3总为直角坐标的三元数组形式,对远光,它表示光线穿过该点射向原点;对近光它表示光源所在的地方。

96 格式:lighting options %设置照明模式
说明: 该指令只有在light指令执行后才起作用 options有以下四种取值: flat—入射光均匀洒落在图形对象的每个面上, 主要与facted配用,它是默认模式 gouraud—先对顶点颜色插补,在对顶点勾画的色棉进行插补;用于曲面表现, phohg—对顶点处法线插值,在计算个像素的反光;表现效果最好,但最费时。 none—是所有的光源关闭

97 例:透视演示 程序如下: 观看执行的效果 [X0,Y0,Z0]=sphere(30);%产生单位球面的三坐标
X=2*X0;Y=2*Y0;Z=2*Z0;%产生半径为2的球面三坐标 surf(X0,Y0,Z0); %画单位球面 shading interp %采用插补明暗处理 hold on, mesh(X,Y,Z), %画半径为2的球面 colormap(hot) %采用hot色图 hold off hidden off %产生透明效果 axis equal,axis off 观看执行的效果

98 例:表面切面 程序如下 观看执行的效果 clf,x=[-8:0.1:8];y=x;
[X,Y]=meshgrid(x,y);ZZ=X.^2-Y.^2; ii=find(abs(X)>6|abs(Y)>6); %确定超出[-6.6]范围的各点下标 ZZ(ii)=zeros(size(ii)); %强制为0 surf(X,Y,ZZ),shading interp;colormap(copper) light('position',[0,-15,1]);lighting phong material([0.8,0.8,0.5,10,0.5]) 观看执行的效果

99 例:利用“非数”NaN,对图形进行镂空处理
程序如下 P=peaks(30); %从Matlab提供的双变量正态分布曲面获取数据 P(18:20,9:15)=NaN; %为镂空赋值 surfc(P); %带等位线的曲面图 colormap(hot) light('position',[50,-10,5]) material([0.9,0.9,0.6,15,0.4]) grid off,box on 观看执行的效果

100 例:图形函数 程序如下 观看执行的效果 clf
[x,y,z] = meshgrid(-2:.2:2,-2:.25:2,-2:.16:2); %产生三维点格阵 v =x.*exp(-x.^2-y.^2-z.^2); xs = [-0.7,0.7]; ys = 0; zs =0; %确定切片位置 slice(x,y,z,v,xs,ys,zs) %产生切片图 colorbar shading interp colormap hsv xlabel('x'),ylabel('y'),zlabel('z') title('The color-to-v(x,y,z) mapping') view([-22,39]) alpha(0.3) 观看执行的效果

101 例:在c盘根目录下有一图形文件winter.jpg,在图形窗口显示该图像。
程序如下 [x,cmap]=imread('c:\winter.jpg'); image(x); colormap(cmap) axis image off

102 七、动画制作 Matlab中的动画形式有两种:
(1)一种是影片动画---影片动画预先制作图形,存放在图形缓冲区,然后逐贞播放,这种动画适用于难于实时绘制的复杂图画,这种方法计算量大,占用内存多,但回放速度快,画面连贯。 (2)另一种是实时动画---实时动画保持图形窗口中绝大部分的像素色彩不变,而知识更新部分像素的颜色从而构成运动图像。这种动画适用于每次变化较少、图形精度变化不是很高的场合。

103 例:播放一个直径不断变化的球体 [x,y,z]=sphere(50); m=moviein(30); for i=1:30
surf(i*x,i*y,i*z) m(:,i)=getframe; end movie(m,10)

104 影片动画播放

105 例:制作红色小球沿一条封闭路径的下璇线运动的实时动画。
首先编写anim_zzy1.m函数文件,并将其存放在Mtalab的work文件夹内 然后在命令窗口键入 f=anim_zzy1(2,450) 执行后得

106 function f=anim_zzy1(k,ki);
%anim_zzy1.m演示红色小沿一条封闭螺线运动的实时动画 %仅演示实时动画的调用格式为: anim_zzy1(k) %即演示实时动画又拍摄照片的调用格式为: f=anim_zzy1(k,ki) %k--红球运动循环数(不小于1) %ki--制定拍照的瞬间,取1~1034(自变量采样点数)间的任意值 %f--存储拍摄照片数据,可用image(f.cdata)观察照片 %产生封闭的运动轨迹 t1=(0:1000)/1000*10*pi;x1=cos(t1);y1=sin(t1);z1=-t1; t2=(0:10)/10;x2=x1(end)*(1-t2);y2=y1(end)*(1-t2);z2=z1(end)*ones(size(x2)); t3=t2;z3=(1-t3)*z1(end);x3=zeros(size(z3));y3=x3; t4=t2;x4=t4;y4=zeros(size(x4));z4=y4; x=[x1 x2 x3 x4];y=[y1 y2 y3 y4];z=[z1 z2 z3 z4]; plot3(x,y,z,'color',[1,0.6,0.4],'LineWidth',2.5) axis off

107 %定义活动对象的颜色,点形,大小和擦除方式 h=line('xdata',x(1),'ydata',y(1),'zdata',z(1),'Color',[1 0 0],'Marker','.','MarkerSize',40,.... 'EraseMode','xor') %使小球运动 n=length(x);i=2;j=1; while 1 set(h,'xdata',x(i),'ydata',y(i),'zdata',z(i)); drawnow; pause(0.0005) i=i+1; if nargin==2 & nargout==1 if (i==ki & j==1);f=getframe(gcf);end end if i>n i=1;j=j+1; if j>k;break;end

108 小球沿螺旋线运动

109 例:模拟布朗运动 程序如下 n=30; s=0.02; %产生n个随机点(x,y),处于-0.5到0.5之间
x=rand(n,1)-0.5;y=rand(n,1)-0.5; h=plot(x,y,'.'); %绘制随机点 axis([ ]);axis square grid off set(h,'EraseMode','Xor','MarkerSize',20) %循环5000次,%产生动画效果 for i=linspace(1,10,500); drawnow x=x+s*randn(n,1); y=y+s*randn(n,1); set(h,'XData',x,'YData',y); end

110 例如: clf;shg,x=3*pi*(-1:0.05:1);y=x;[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;Z=sin(R)./R; h=surf(X,Y,Z);colormap(jet);axis off n=12;mmm=moviein(n); for i=1:n rotate(h,[0 0 1],25); mmm(:,i)=getframe; end movie(mmm,5,10)

111 例:振荡曲线的动画显示 n=20; for i=1:n x=0:0.1:i;
y=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3)); plot(x,y) axis([0,20,0,1.5]); %固定坐标轴 M(i)=getframe; %抓取画面 end movie(M,3) %播放3次

112 例:制作小红球沿振荡曲线运动动画 %使用对象方式产生动画 x=0:0.1:20;
y=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3)); plot(x,y) h=line('color','red','marker','.','markersize',40,'erasemode','xor'); %定义红色的小球 for i=1:length(x) set(h,'xdata',x(i),'ydata',y(i)); %设置小球的新位置 pause(0.005) %暂停0.005秒 drawnow end

113 图形用户界面设计 众所周知:现在制作的软件人机交互越来越方便和智能化,就是因为借助于图形用户窗口来实现的。图形用户界面(Graphical User Interface,简称GUI),就是通过窗口、菜单、按钮、文字说明等对象构建完美的界面,提供用户利用鼠标和键盘方便的实现操作。Matlab提供的Demo演示程序就是图形界面很好的范例。 Matlab设计图形用户界面方法有两种: ①使用可视化界面环境 ②通过编写程序

114 ②通过编写程序 输入信息对话框 运行后弹出如下对话框 answer=inputdlg('prompt','defans','off')
p=inputdlg(prompt,'输入参数',1,defans) 运行后弹出如下对话框

115 下面主要介绍使用可视化界面环境 Matlab提供了可视化的界面环境Guide,其功能与微软的软件VB等很相似,可以方便的创建界面 打开可视化界面环境方法: 选择File/New/GUI 在命令窗口输入“Guide”或“Guide Filename” 就会出现“Guide快速开始”界面

116 如果要创建空白的可视化图形文件选择“Blank GUI(Defult)”然后单击“ok”按钮就出现空白的可视化的界面窗口
GUI with Uicontrols GUI with Axes and menu ---可创建具有控件或坐标轴、选单等界面

117 界面编辑面板 图形对象面板

118 ---对象对齐工具(Align Objects)
---选单编辑器(Menu Editor) ---属性编辑器(Property Inspector) ---对象编辑器(Object Browser) 单击这4个按钮就会出现相应的窗口

119 例如:使用控件设计用户界面,根据阻尼系数绘制二阶系统的时域曲线
功能:在图形界面中,通过弹出式选单选择二阶系统的阻尼系数,然后单击不同的按钮,在坐标轴中绘制不同阻尼系数不同颜色的时域曲线 界面设计:


Download ppt "MATLAB程序设计教程(第二版) 刘卫国 主编 中国水利水电出版社."

Similar presentations


Ads by Google