实验四数据可视化方法[实验目的]1.掌握曲线绘制的基本技法和指令,会使用线形、色彩、数据点标记表现不同数据的特征,掌握生成和运用标识注释图形。
2.进一步掌握函数编写及数据可视化方法。
[实验原理]MATLAB 提供了相当强大的可视化指令,通过这些指令,我们可以非常简单地实现数据的可视化。
首先我们来看离散数据和离散函数的可视化方法。
对于离散实函数y n=f(x n),当x n以递增(或递减)次序取值时,根据函数关系可以求得同样数目的y n,当把这两组向量用直角坐标中的点次序图示时,就实现了离散函数的可视化。
当然这种图形上的离散序列所反映的只是某确定的有限区间内的函数关系,不能表现无限区间上的函数关系。
通常我们可以采用plot 或者stem 来实现。
只是需要注意的是使用plot 时,需要使用星号或者点等标识来表示数据点,比如plot(x n,y n,’r*’,’MarkerSize’,20),就表示用字号20的红色星点来标识数据点,此时为了便于观察,通常随后加上一条语句“grid on”,即给图形加上坐标方格。
而采用stem 标识数据点的格式是stem(x n,y n)。
连续函数的可视化与离散函数可视化类似,也必须先在一组离散自变量上计算相应的函数值,并把这一组“数据点”用点图示。
但这些离散的点不能表现函数的连续性。
为了进一步表示离散点之间的函数函数情况,MATLAB 有两种常用处理方法:一是对区间进行更细的分割,计算更多的点,去近似表现函数的连续变化;或者把两点用直线连接,近似表现两点间的(一般为非线性的)函数形状。
但要注意,倘若自变量的采样点不足够多,则无论哪种方法都不能真实地反映原函数。
对于二维数据,常用指令仍旧是plot。
对于离散数据,plot指令默认处理方法是:自动地把这些离散数据用直线(即采用线性插值)连接,使之成为连续曲线。
对于三维图形的表示,通常有plot3 等指令。
通常,绘制二维或三维图形的一般步骤如下表所示:说明:●步骤1、3 是最基本的绘图步骤,一般来说,由这两步所画出的图形已经具备足够的表现力。
至于其他步骤,并不完全必需。
●用户可根据自己需要改变上面绘图步骤,并不必严格按照执行。
●步骤2 一般在图形较多情况下使用,此时需要指定图形窗、指定子图。
●步骤8 涉及图柄操作,需要对图形对象进行属性设置,较为复杂。
●MATLAB 提供了交互式图形编辑功能,可方便地对图形精细修饰。
plot 等绘图指令的典型调用格式为:plot(t,y,’s’)。
其中s 是用来指定线型、色彩、数据点形的选项字符串。
S 的合法取值如下所示,格式形如’r+’。
如果缺省,此时线型、色彩、数据点形将由MATLAB 默认设置确定。
plot 进一步的使用可参看帮助文档。
s 可用来指定的线形分别有:“-”实线,“:”虚线,“-.”点划线,“--”双划线。
s 可用来指定的色彩分别有:b-蓝,g-绿,r-红,c-青,y-黄,w-白,k-黑。
s 可用来指定的数据点形有:“.”实心黑点,“+”十字符,“^”朝上三角符,“v”朝下三角符,“d”菱形符,“p”五角星符等。
常用的坐标控制指令axis 使用是最多的,比如axis([x1,x2,y1,y2])可人工设定坐标范围,axis off 可取消轴背景,axis equal 横纵轴采用等长刻度等。
其他使用见帮助。
需要特别指出的是,当遇到在已经存在的图上再绘制一条或多条曲线,可使用hold on 指令,可保持当前轴及图形保持不被刷新,并准备接收此后绘制的新曲线,hold off 则 取消此功能。
对于想画多个独立的图形,则会用到figure(n)指令,这里n 为整数,可顺 序从1 向后排。
如果想在特定图形中布置几幅独立的子图,则会用到subplot(m,n,k), 即在(m ×n )幅子图中的第k 幅成为当前图;subplot(‘position ’,[left botton width height]),表示在指定位置上开辟子图,并成为当前图。
使用clf 指令可清除图 形窗的内容。
另外MATLAB 还提供了ginput 、gtext 、legend 等交换指令。
[x,y]=ginput(n),可用鼠标从二维图形上获取n 个点的数据坐标(x,y),该指令只 适用于二维图形,在数值优化、工程设计中十分有用。
通常在使用前先对图进行局部放大处 理。
[实验内容]一.仿照运行,体会数据可视化方法。
1.已知n=0,1,⋯⋯,12,y=|(n-6)|-1,运行下面程序,体会离散数据可视化方法。
% 用plot 实现离散数据可视化n=0:12; %产生一组自变量数据 y=1./abs(n-6); %计算相应点的函数值plot(n,y,'r*','MarkerSize',20) %用红花标出数据点 grid on %画坐标方格% 用stem 实现离散数据可视化 n=0:12;y=1./abs(n-6); stem(n,y)2.下面时用图形表示连续调制波形y = sin(t )sin(9t ) ,仿照运行,分析表现形式 不同的原因。
cleart1=(0:11)/11*pi; y1=sin(t1).*sin(9*t1);t2=(0:100)/100*pi; y2=sin(t2).*sin(9*t2);subplot(2,2,1),plot(t1,y1,'r.'),axis([0,pi,-1,1]),title('子图 (1)') subplot(2,2,2),plot(t2,y2,'r.'),axis([0,pi,-1,1]),title('子图 (2)') subplot(2,2,3),plot(t1,y1,t1,y1,'r.')axis([0,pi,-1,1]),title('子图 (3)')subplot(2,2,4),plot(t2,y2)axis([0,pi,-1,1]),title('子图 (4)')二.编程实现。
1.用图形表示连续调制波形y = sin(t)sin(9t) ,过零点及其包络线,如下图所示。
t=(0:pi/100:pi)';y1=sin(t)*[1,-1];y2=sin(t).*sin(9*t);t1=pi*(0:9)/9;y3=sin(t1).*sin(9*t1);plot(t,y1,'r:',t,y2,'b--',t1,y3,'go');title('sin(t1).*sin(9*t1);');2. 励条件下二阶系统归一化响应可表现为)sin(11)(θββξ+-=-t e t y t ,其中ξ为阻尼系数, 21ξβ-= ,)1(2ξξθ-=arctg 。
请用不同的颜色或线型,在同一张图上,绘制ξ= 0.2 : 0.2 : 2.0取值下系统在t ∈[0,18] 区间内的响应曲线,并要求用ξ= 0.2和ξ=2.0对它们相应的两条曲线进行醒目的文字标志。
syms k;t=0:0.1:18; hold on;%kz={'-r' '.g' 'b' 'c' 'm' 'y' 'k' 'w' ':r' ':g'}; kz='r g :b c m y k w r g r:'; i=0;for k=0:0.2:2; i=i+1; clear y;a=sqrt(1-k^2);b=atan(sqrt(1-k^2)/k); if k==1y=(exp(t)-t-1)./exp(t); %plot(t,y,kz(i)) elsey=1-1/a*exp(-k*t).*sin(a*t+b); plot(t,y,kz(i)) end%plot(t,y,kz(i))text(14,0.9,'阻尼系数是2') endxlabel('t'); ylabel('y(t)');hold off3. 编写函数[x,n]=stepseq(n0,n1,n2),实现: ⎩⎨⎧<≤≤≤=021001)(n n n n n n n u n 为整数并编写脚本文件实现:x (n ) = n ⋅[u (n ) − u (n −10)] +10e -0.3(n-10) [u (n −10) − u (n − 20)], 0 ≤ n ≤ 20要求在脚本文件中调用stepseq 函数,最后绘出序列x (n ) 在给定区间的波形图。
function [x,n]=stepseq(n0,n1,n2) n=n1:n2; x=n>n0;[u:n1]=stepseq(0,0,20); [u10,n10]=stepseq(10,0,20); [u20,n20]=stepseq(20,0,20); n=0:20;x=n.*(u-u10)+(10*exp(-0.3*(n-10))).*(u10-u20);stem(x)4.编写一个函数文件[y,n]=sigadd(x1,n1,x2,n2),实现两个对应样本之间的相加,其中x1 是长度为n1 的序列,x2 是长度为n2 的序列,n1、n2 分别是x1、x2 的位置信息(n1、n2 均为整数),如:n1={ -3,-2,-1,0,1,2,3,4},对应的x1={ 2, 3, 1,4,1,3,1,2};n2={-4,-3,-2,-1,0,1,2},对应的x2={ 1, 3, 2, 5,1,3,4}。
当调用函数[y,n]=sigadd(x1,n1,x2,n2)时,我们应该得到:n={-4,-3,-2,-1,0,1,2,3,4},对应的y={ 1, 5, 5, 6,5,4,7,1,2}。
仔细观察sigadd 函数的功能。
编好函数文件程序后,请在命令窗口调用,验证正确性,记录验证结果。
function [y,n]=sigadd(x1,n1,x2,n2)n=(min(n1(1),n2(1)):max(n1(end),n2(end));y1=zeros(1,length(n));y2=y1;y1=(find((n>=n1(1)&(n<=n1(end))==1))=x1;y2=(find((n>=n2(1)&(n<=max(n2))==1))=x1;y=y1+y2;end。