Matlab绘图.docx
- 文档编号:17860765
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:45
- 大小:3.30MB
Matlab绘图.docx
《Matlab绘图.docx》由会员分享,可在线阅读,更多相关《Matlab绘图.docx(45页珍藏版)》请在冰点文库上搜索。
Matlab绘图
第2章绘图
要画一个函数的图像,先是选取一堆x,求出相对应的y值,然后按照数值描点,接着用光滑的曲线把点连接起来。
和数学课讲的一样,在matlab中,我们画图也分为三步
1.建立一个x的点集;
2.根据函数关系式算出每个x对应y的点集;
3.将这些点用平滑的曲线连接起来。
例如要画y=sinx在[0,10]区间内的图像,首先我们要确定出x的区间
>>x=[0:
0.1:
10];
命令的意思是,产生一个数集,它从0开始,每次加0.1,一直加到10为止
注意,命令后面的分号记得加上,否则matlab会把x的元素都打印出来,下面就是不加分号的后果:
有了x的数集后,我们再根据函数关系式y=sinx得出y的点集
>>y=sin(x);
同样的,别忘了把分号加上抑制程序输出y的具体值,以及sin(x)的括号别忘了加
到这里,我们已经把x和y确定下来,接下来只需用plot(x,y)命令即可绘制出图像
>>plot(x,y)
当然,如果你不定义y,而直接用一下嵌套命令也是可以的
>>plot(x,sin(x))
我们将x的增量变大一点,改为0到10,每次增幅为1,即
>>x=[0:
1:
10];
然后我们输入
>>plot(x,y)
我们会得到错误信息:
原因是之前我们定义的y是由之前的x决定的,当x改变后,y依然没有改变,为了解决这个问题,我们要把y重新定义一遍,即命令要完整再输入一遍
>>x=[0:
1:
10];
>>y=sin(x);
>>plot(x,y)
然后程序会绘制出和我们预期相同的图像
没错,我们将看到不光滑的曲线,这告诉我们,当使用plot(x,y)画图的时候x的增加幅度尽可能小一些,画出的图像才精确(跟数学里点越多图像越精确原理一样的)
为了美化图像(有时是为了更清楚的辨析图像),我们经常要为图像加上网格,为坐标轴命名,改变曲线的颜色、形状这些命令
2.1加上网格
我们使用gridon命令
我们这样书写:
>>x=[0:
0.1:
10];y=sin(x);
>>plot(x,y),gridon
这样就画出了带网格的图像
当然,也可以先画出没有网格的图像,再把窗口切回matlab命令输入窗口,输入gridon,这样图像就会加上网格,即
>>x=[0:
0.1:
10];y=sin(x);
>>plot(x,y)
>>gridon
2.2为坐标轴命名
为x坐标轴命名的命令是xlabel(),显然,y的就应该是ylabel()
比如这里,我想让x命名为x,y命名为sinx,则如下输入:
>>x=[0:
0.1:
10];y=sin(x);
>>plot(x,y),xlabel(‘x’),ylabel(‘sinx’)
注意,坐标轴的名字要用引号括起来,表示字符串
当然也可以画图后再标坐标轴,即:
>>x=[0:
0.1:
10];y=sin(x);
>>plot(x,y)
>>xlabel(‘x’)
>>ylabel(‘sinx’)
然后我们就可以看到坐标轴带命名的图像:
2.3绘制多条曲线
绘制多条曲线有两种情况,一种是在同一个坐标面内画多条曲线,另一种是在一个面内画多个独立的曲线
我们先讲第一种,假设我们要在一个坐标面内画sinx,cosx,tanx的图像
先定义x,y
>>x=[0:
0.1:
10]
>>y1=sin(x);
>>y2=cos(x);
>>y3=tan(x);
接着画图
>>plot(x,y1)
这时候函数绘制出了sinx的图像
接着我们继续画
>>plot(x,y2)
我们会发现程序会把之前的sinx图像抹掉,然后绘制cosx的图像
为了让他们同时存在,我们使用holdon命令,即画完一个图后,holdon,继续画
当我们再加上tanx后会得到这个图像
这是因为函数显示区间设置的原因,后面讲
2.4更改图像显示区间
从楼上我们已经在一个图中画出了sinx、cosx、tanx的图像,但是我们知道tanx的值域是负无穷到正无穷,而sin,cos的值域是-1到1,这导致了我们基本上看不到sin,cos的图像,为了解决这个问题,我们只需用axis命令即可,命令格式为axis([xminxmaxyminymax])即括号内跟一个区间,四个数字分别是x的起点,x的终点,y的起点,y的终点。
例如上一例中,我们要显示x=[0,10]区间,y=[-2,2]区间的图像,只需在画图后补充输入命令
>>axis([010-22])
注:
空格改成逗号也是可以的,即
>>axis([0,10,-2,2])也是正确的
那么我们就会得到如下图像
如果我们懒得输入显示区间,或者我们根本不知道选取什么样的区间合适,我们只需让matlab自动选取区间,使用如下命令
>>axisauto
那么软件就会选取它认为合适的区间显示
如果要matlab产生正方形平面的图象,只需用
>>axissquare
这样就产生一个方形平面
如果想恢复默认去,或者想matlab产生一个两坐标轴比例和间距都相同的图象则使用一下命令
>>axisequal
虽然这个图像看起来好怪,不过它是正确的
继续沿用上面的三个函数图像,我们发现,图像多了,难免会混乱,因为它们的颜色,形状都是一样的,那么我们可以修改它们的曲线属性来使图像更清晰
2.5修改曲线形状
我所知道的形状有四种(欢迎在这层楼补充),它们分别是实线:
用“-”表示(当然,默认下是实线的),虚线:
用“--”表示虚点线(工图上叫点划线):
用“-.”表示,点线:
用“:
”表示
这些属性只需在plot命令中输入即可
例如我们要sinx为虚线,cosx为点划线,tanx为点线,显示区间为[010-22]那么如下输入
>>plot(x,y1,'--',x,y2,'-.',x,y3,':
'),axis([010-22])
那么显示如下
漏讲了,要在一个平面内画多个图像,还可以不用holdon命令,而把图像合并到plot内,例如:
>>plot(x,y1,x,y2)
注意,x和y是一一对应的
2.6设置曲线颜色
虽然我们可以设置曲线形状,但是有时候我们也需要让曲线显示不同的颜色,我所知道的matlab支持的颜色有八种(欢迎在这层补充),他们分别是:
白色:
w,黑色:
k(默认),蓝:
b,红色:
r,青色(或者叫蓝绿色):
c,绿色:
g,洋红(或者叫浅紫色?
):
m,黄色:
y。
要改变曲线的颜色,我们只需把颜色代码添加到曲线形状后面即可,例如:
>>plot(x,y,‘--r’)
代表用红色虚线绘制图像
当然,形状和颜色的位置互换也是允许的,也就是说下面的写法也是正确的
>>plot(x,y,‘r--’)
我们使用如下命令:
将会得到红色虚线的sinx图像,蓝色点划线的cosx图像和绿色点线的tanx图像。
如下图显示:
有了曲线的颜色,形状作区分,虽然我们知道这是什么图像,但别人未必知道,参考很多书上的图,我们都会发现,书上都标有那条线代表什么函数,在matlab中我们也可以这样做。
2.7添加图例
专业的图象总是附有图例,告诉读者某个曲线是什么,在matlab中,我们只需使用命令legend()即可,它的调用格式是
>>legend(‘第一个函数的名字’,‘第二个函数的名字’,‘以此类推’)
例如,在上一例中,我们这样输入
>>legend('sinx','cosx','tanx')
那么就会得到如下图像
你可以用鼠标拖动那个小方块,使他放在合适的,你想要的地方
注意:
legend()命令必须一一对应,也就是说你的plot()画的是函数1,2,3,那么你的命名就必须按照1,2,3这个顺序
接下来我们讲另一种在同一个图上画多个函数的方法
2.8子图
从电路课了上我们知道一个波动曲线有时候是由两个波动曲线叠加得到的,而当我们想把这些曲线单独提取出来研究的时候可能用到子图
绘制子图的命令是subplot(n,m,a)
参数的意思是创建一个n×m的网格,讲接下来要画的图像画在第a幅上
沿用上面的例子,首先我们先定义函数
>>x=[0:
0.1:
10];
>>y1=sin(x);
>>y2=cos(x);
>>y3=tan(x);
接下来,我们把sin画在2×2的图上的第一个网孔
首先定位:
>>subplot(2,2,1)
程序会得到下图:
也就是现在为接下来绘制的图像腾出了空间
接着我们把sinx图像画上去
>>plot(x,y1)
然后就会得到如下图像,当然你也可以改变它的显示区间,形状,颜色,网格是否打开,x,y坐标轴名字等等这些内容
然后我们完成了第一幅图的绘制,我们绘制第二幅图
>>subplot(2,2,2)
将会得到下图
同样的道理,我们把所有的图像都绘制上去,以下是整个过程的命令
总结一句话就是:
先定位,后画图。
于是得到最后的结果:
1
接下来我们绘制复杂一点的图像,我们绘制y=sin(2x)的图像。
我们知道,sin(2x)=2sinxcosx,如果我们这样输入
>>x=[0:
0.1:
10];
>>y=2*sin(x)*cos(x);
那么就会出现错误信息:
追其原因,是因为matlab里*代表矩阵乘法,而sin(x)*cos(x)代表的是矩阵乘法,这个显然是错误的,要改正这个错误,我们要把*改为.*,点星符号才代表数量乘法,命令改为
>>y=2*sin(x).*cos(x);
这样我们调用plot函数,就会得到以下正确图像:
我们再看一下复杂一点的函数,我们绘制y=e^(-1.5x)sin(5x+3),我们输入以下命令
>>y=exp(-1.5*x).*sin(5*x+3);
注意点号不能漏掉,然后用
>>plot(x,y)
即可得出以下图像
总结一句:
当两个函数相乘的时候,乘号前的点号不能漏掉当平方(或更高次方)的时候点号也不能漏掉
但是我们难免会忘记*号改为.*号,为了解决这个问题我们使用在plot命令前加上一个f变成fplot即可,另外,使用fplot命令不需要定义增量,程序会自动为你设置,调用格式为
fplot('你要画的函数',[x的起始值,x的终点值],你所要求的误差)
注:
误差不写也可以,例如:
>>fplot('sin(x)',[0,10])
只需这一行命令,matlab就自动为你绘制函数
我们尝试一下复杂点的函数
>>fplot('exp(-t)*sin(t)',[0,4]);
这样程序就会绘制出下图
要绘制的函数别忘了用引号括起来,因为这里是字符串,而不再是矩阵了
2.9极坐标绘图
大家都学过工数,显然对极坐标是不陌生的,那么我们讲下怎么在matlab中绘制极坐标图像,要绘图制极坐标图只需用polar()即可
我们拿最简单的阿基米德螺线作例子,螺线方程为:
r=aθ
因为θ在matlab中打不出,我们就这样定义吧
y=ax其中a为常数
假设我们要画y=5x(这个不是线性方程,真不是)螺线的方程,其中x为0到2π,那么首先定义x的集(注意,matlab是默认以弧度制为单位的)
>>x=[0:
pi/100:
2*pi];
然后定义y
>>y=5*x;
然后调用极坐标绘图命令
>>polar(x,y)
于是就得出下面这个漂亮的图
我们XX百科一下“极坐标”,发现r(θ)=4(cos2x+sin0.5x)这个方程的图案挺好看,我们尝试画一下
>>x=[0:
pi/100:
2*pi];
>>y=4*cos(2*x)+4*sin(0.5*x);
>>polar(x,y)
然后就得到了挺漂亮的图案
注:
你也可以改变它的形状,颜色之类的,方法跟直角坐标的一样
2.10对数坐标图像
对数坐标的作用不详细讲了,我们就讲个例子来对比一下吧,比如我要画
y=e^(-10x^2)函数在[0,20]区间内的图像
那么在直角坐标系下的命令为
>>fplot('exp(-10*x^2)',[0,20])(当然你想先定义x,然后用plot命令也行,但是别忘了x^2要写成x.^2)
然后我们就得到图像
非常好,符合我们的预期,这个函数降幅非常大,所以我们要在对数坐标下绘图,完整的命令是
>>x=[0:
0.1:
20];
>>y=exp(-10*x.^2);
>>loglog(x,y)
然后我们就会得到对数坐标下的图像
如果你想x轴用对数,y轴用常规的坐标轴,就用以下命令
>>semilogx(x,y)
然后就得到如下图像
显然y用对数而x不用对数就是
>>semilogy(x,y)结果如下:
2.11绘制等高线
几何绘图我们知道是由点→线→面演变的,在讲三维绘图前先讲下绘制等高线,虽然这个跟后面的三维图像没有什么联系。
既然叫等高线,说明图像是三维的,也就是三元方程(你想想,二元函数怎么可能有高度这种东西)。
和二元步骤分一样分为三步,定义点集,定义函数,绘图。
但是三元的定义点集我们要用到一个新命令,也就是meshgrid()命令
我们画最简单的抛物体:
z=x^2+y^2在区间x=[-5,5],y=[-5,5]内的等高线
首先定义点集
>>[x,y]=meshgrid(-5:
0.1:
5,-5:
0.1:
5);
这行命令的意思是产生一系列的网格数据(meshgrid的采集点原理想知道的自己百科吧,我也讲不清楚)你可以简单理解为x从-5到5,增幅为0.1;y从-5到5,增幅为0.1。
因为这里x和y的起点,终点,增幅都是一样的,所以括号内的可以合并成一个
>>[x,y]=meshgrid(-5:
0.1:
5);
这行命令和前面的那行命令是等价的
注:
[x,y]中的逗号可以换成空格,x,y别忘了方括号括起来(因为他们是矩阵),行末分号别忘了
接着定义函数
>>z=x.^2+y.^2;
之前说过了,因为是矩阵,所以乘方^前的点号不能漏掉,也就是说下面的写法是不正确的。
当然这样写程序是不会报错的,但是得不到我们预期的结果,我们等一下分别试一试看有什么问题
然后是绘制等高线,我们使用命令contour即可
>>contour(x,y,z,50)
这行代表绘制50条平面等高线,当然50可以换成你想要的任何数字(劝你不要手贱输入10000这种大数字...........不信你就去试试),不输入的话程序自动为你选择。
然后就可以画出漂亮的等高线了
全部命令为:
>>[x,y]=meshgrid(-5:
0.1:
5,-5:
0.1:
5);
>>z=x.^2+y.^2;
>>contour(x,y,z,50)
于是我们就得到如下图像
当然,你也可以画投影到x平面的等高线,只需把contour(x,y,z)的顺序换一下就ok
>>contour(y,z,x)
这样程序就会自动为我们画出投影到x面的等高线,和预期一样,是抛物线
接下来我们看看定义函数的时候我们使用
>>z=x^2+y^2;以下是命令
>>[x,y]=meshgrid(-5:
0.1:
5,-5:
0.1:
5);
>>z=x^2+y^2;
>>contour(x,y,z)
然后你就得到以下图像
虽然图片很漂亮(上传后不好看了),但是这是错误的(根据工数知识我们知道它的等高线在z面应该是同心圆),所以切记!
乘方,乘除前面的点号不能漏掉
2.12绘制三维等高线
绘制三维等高线跟楼上的方法一样,只不过contour变成contour3就行(代表3D嘛)。
比如我们要画100条z=x^2+y^2的三维等高线,只需输入
>>[xy]=meshgrid(-5:
0.1:
5);
>>z=x.^2+y.^2;
>>contour3(x,y,z,100)
我们就会得到如下图像:
我们发现图像是由同心圆组成的,因为等高线是以Z面为基准的。
如果我们用x面为基准,我们知道等高线应该是抛物线
>>contour3(y,z,x,100)
将得到如下图像:
看起来摆得好像有点怪,不过没事,我们可以把它扳正过来点击菜单栏的
图标,我们就可以拖拽图案进行旋转。
这是旋转后的图案(随便摆得,大家自己去试试吧)。
再举个例子,我们绘制z=sinx·cosy的图像
>>[x,y]=meshgrid(-5:
0.1:
5);
>>z=sin(x).*cos(y);
>>contour3(x,y,z)
注意.*号,乘法前的点号不能漏掉,强调过很多次了
然后我们得到下面的图像:
程序默认分给我们的圈圈看起来有点少,我们尝试更多的线
>>contour3(x,y,z,100)
这样就画出了100条等高线组成的图像:
为了画三维图像,我们前两步和画等高线的步骤是一样的。
先定义区间,然后定义函数,然后画图,只不过把contour3换成了mesh(或者surf,它们的区别我们下面讲)
沿用上面的例子,我们要话z=x^2+y^2的图像,则输入如下命令
>>[xy]=meshgrid(-5:
0.1:
5);
>>z=x.^2+y.^2;
>>mesh(x,y,z)
这样就画出如下图像:
当然,如果你使用下面的命令
>>mesh(y,z,x)
就会得到以X面为底面的图像:
如果你用的是surf命令
>>surf(x,y,z)
你将得到如下图像:
对比surf命令和mesh命令画出的图像可以看出它们的区别mesh画出来的图像是彩色的线,白色的网格填充色。
surf画出来的图像是黑色的线,彩色的网格填充色。
接下来我们画一个看起来高端洋气冷艳高贵傲娇的图像z=ye^(-x^2-y^2)
输入以下命令
>>[xy]=meshgrid(-2:
0.05:
2);
>>z=y.*exp(-x.^2-y.^2);
>>surf(x,y,z)
将得到以下图像:
当然如果用mesh的画会得到下面的图案,大家感受一下
>>mesh(x,y,z)
我们再看看之前的z=sinx·cosy的图像
>>[xy]=meshgrid(-5:
0.1:
5);
>>z=sin(x).*cos(y);
>>surf(x,y,z)
将得到如下图像:
2.13三维图像美化
添加坐标轴名字,标题。
跟二维平面一样,要添加坐标轴命名,只需在绘图命令后加上xlabel()就行,例如
>>[xy]=meshgrid(-2:
0.05:
2);
>>z=y.*exp(-x.^2-y.^2);
>>surf(x,y,z),xlabel('x'),ylabel('y'),zlabel('ye^(-x^2-y^2)'),title('y=f(x)')
即可为x轴命名为x,y轴命名为y,z轴命名为ye^(-x^2-y^2),图像命名为y=f(x)
注意,xlabel(),title()这些括号内的引号不能省略,因为引号代表字符串。
如下图所示:
绘制带有等高线的图像。
如果你想要绘制一个三维图像,它的等高线投影到z平面上,只需用命令surfc(),它的命名规律是surf+contour的复合简写
比如我们用如下命令
>>surfc(x,y,z),xlabel('x'),ylabel('y'),zlabel('ye^(-x^2-y^2)'),title('y=f(x)')
就会得到如下图像;
大家可以看到,底面有一系列的等高线
绘制光照表面。
这个看起来好像好牛逼的感觉,就是光照投影到曲面的感觉
命令是surfl(),命名规律是lightedsurface的缩写。
比如我们使用如下命令
>>surfl(x,y,z),xlabel('x'),ylabel('y'),zlabel('ye^(-x^2-y^2)'),title('y=f(x)')
就会得到如下图像:
我们取消网格,使用如下命令
>>shadinginterp;
于是..........
接下来我们将它改成灰度的,使用以下命令
>>colormap(gray);
于是......
现在我们尝试绘制一下这个曲面z=(1+xy)^y,首先定义变量,定义函数:
>>[xy]=meshgrid(-5:
0.1:
5);
>>z=(1+x.*y).^y;
然后我们绘制图像
>>mesh(x,y,z)
接着惊人的一幕出现了
,matlab居然告诉我们出现错误了
mesh行不通,那我们看看surf行不行
我们发现,无论是用mesh或者surf命令,都会出现错误
我们来研究一下这个错误,程序说,X,Y,Z不能是虚数,好的我们看下x,y的变量,当x=-4且y=1/2时,z等于根号下-1,也就是i,而mesh和surf是不支持虚数的。
问题是,我们数学中很多这种类型的函数啊
比如球的方程是x^2+y^2+z^2=1
化简了就是z=sqrt(1-x^2-y^2)
我们尝试一下去绘制这个图像,为了使根号内的东西不为负,我们取x,y都在【-1,1】区间内。
输入以下命令:
>>[xy]=meshgrid(-1:
0.05:
1);
>>z=sqrt(1-x.^2-y.^2);
>>mesh(x,y,z)
程序依然报错
究其原因,我也不太懂,大概理解为matlab把x,y数集里的数一个一个的去算,当x=1且y=1的时候z就等于复数i了,可是我们知道,x=1,y=1显然不在球面上的为了解决出现虚数这个问题,我们使用一个新的命令ezmesh()或者ezsurf()
注:
关于mesh和surf的区别我上面已经讲过了,好的我们假设要画上面讲的z=(1+xy)^y
这个函数的图像,我们只需输入一行
>>ezsurf('(1+xy)^y')
ez你可以理解为“自动”这个前缀,括号内跟一个字符串(注意,字符串要用引号扩起来),而这个字符串代表的就是你函数z=f(x,y)里面的f(x,y)。
然后程序就会为你自动取点,取增量,绘图。
然后我们尝试一下绘制球的图案
>>ezsurf('sqrt(1-x^2-y^2)')
然后程序会为我们画出上半球面(其实我们画球往往不用这个函数的,画球有画球的函数)。
来找几个函数来画画
>>ezsurf('exp(-x)*sin(x+2*y)')
再试几个看看
>>ezsurf('1/(x^2+y^2)')
甚至之前我们讲的那种先建立点集再建立函数,然后画图的,这里用一行命令照样能绘制出来
>>ezsurf('y*exp(-x^2-y^2)')
总结:
用ezsurf()命令记得用引号把函数括起来,细心的同学已经发现,字符串了的.*或者.^符号变成了*和^符号,因为是字符串,所以没有矩阵这一说法,所以.*和*是等价的,也就是说,你爱写成'sin(x).*cos(y)'也行。
2.14Ezplot()的平面绘图
其实这一楼应该放在二维图像那里讲的,楼主忘记了,所以在这楼讲吧比如我要画一个平面曲线y=1-x^2/2+x^4/24,我们只需输入下面的一行命令
>>ezplot('1-x^2/2+x^4/24')
然后图像就出来了
继续找一个函数>>ezpl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 绘图