matlab 平滑曲线连接_MATLAB画图

1 基本命令

 一般画函数或方程式之图形,都是先标上几个图形上的点,进而再将点连接即为函数图形,其点愈多图形越平滑。MATLAB在简易2维画图(plot),也是相同做法,必须先点出 x 和 y 坐标(离散数据),再将这些点连接,语法如下:

 若取图形上n个点,则x=(x1,x2,…,xn), y=(y1,y2,…,yn)

plot(x,y)  % x为图形上之x坐标向量,y为其对应的y坐标向量

Review:快速产生一维A数组数据方法有二

利用 V=[a : b : c] 即以 a 起始,间隔为 b ,至 c 结束。(若后面间格位坐落在 c,则不包含)。<方便做等间格数据点>

X=linspace(a , b , n)  %a代表起始点,b代表终点,n代表所取点的个数。<方便做固定数据数>

例1:绘制y=sin(x)图像,x=0~2π,依序分别取 5,10,100个资料点个别画出。

>> x5= linspace(0,2*pi,5); %在 0 到2π 间,等分取 5 个点>> y5 = sin(x5);           %计算 x 的正弦函数值>> plot(x5,y5);            %进行二维平面描点作图

57f2f5079f3699f775fa5ebae4acecc2.png

>> figure;                 % 开新画图窗口>> x10= linspace(0,2*pi,10); %在 0 到2π 间,等分取 10 个点>> y10 = sin(x10);           %计算 x 的正弦函数值>> plot(x10,y10);

fe86cc42b92af98b1391bba2700bc98a.png

>> figure;                  % 开新画图窗口>> x100= linspace(0,2*pi,100); %在 0 到2π 间,等分取 100 个点>> y1000 = sin(x10);           %计算 x 的正弦函数值>> plot(x100,y100);

c095542119c9ed6cfc52c886d43c26b4.png

>> plot(x, sin(x), x, cos(x))  %进行多条曲线作图,输入依序为各曲线的x,y值

8c76ef650d5d2aa695ddfd863ebedeff.png

2 快速方程式画图(fplot,ezplot)

fplot:单纯画方程式图形,图形上之(x,y)坐标值会自动取,但必须输入x坐标的范围,其指令如下:

fplot('函式',[xmin,xmax,ymin,ymax])  %绘出函式图形,x轴的范围取xmin到%xmax,y轴的范围取ymin到ymax

例1:绘出图形

25f82ce6c8619148e1eb180f8e6e4959.png

>> fplot('x-cos(x^3)-sin(2*x^2)',[-3,3])   %绘出图形

18fcb54d23f88d3c1e8b1bdf7fa8fad7.png

 ezplot:类似fplot,可以绘出y=f(x)显函数,也可绘出f(x,y)=0隐函数以及参数式。指令如下: 

  ezplot('函式')

  ezplot('函式',[xmin,xmax,ymin,ymax])     % 绘出函式图形,x轴的范围取xmin到xmax

  ezplot('x参数式','y参数式',[tmin, tmax])  % 绘出参数式图形,t范围取tmin到tmax

例1:利用 ezplot 绘出f(x)=x2

>> ezplot('x^2')

94343c4326c12a7af50f350acbe32e08.png

提示:

à在' '内不需要写成先前x.^2元素对元素的形式,方程式直接像打计算器操作一样。

例2:利用 ezplot 绘出 f(x,y)=x2-y=0

>> ezplot('x^2-y',[-6 6 -2 8])  % 若不设x或y范围,则为预设的-2π到2π

901883157e4cb46c3ed229ef5e235e0e.png

ab213b1bc3c3345d2bad2f7481497e13.png

>> ezplot('cos(2*t)','sin(6*t)',[0,pi])  %绘图,t取0~π

练习:

a8df70364ab60d8c62a4d2e688043319.png

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
matlab离散连成的两曲线的交-intersections.m 本帖最后由 kastin 于 2012-12-29 11:47 编辑 引言     曾经思考过曲面求交,结果发现是学术界的一个难题,并且也想出了一个当前广泛使用方法原理一样的近似解法(追踪法)。当然网上也有很多方法,只不过那些方法非常粗糙,无非就是meshgrid出离散网格,比较两曲面在某位置的坐标是否在某一精度范围内,然后标记显示之。这个方法仅仅当离散网格非常细的时候才比较精确。除此之外,还有个非常严重的问题:上面的“精度范围”不是你随心所欲给的,而且也没规律寻找,当给得不恰当的时候,在格处两曲面作比较,会出很多个符合要求的,或者一个也没有。这样就会使得交线非常曲折,甚至断裂等,严重影响精确度。 ———————————————————分割线————————————————————————     当然,既然有曲面求交,那么也有曲线求交,其基本结构就是两曲线求交。只是曲线求交问题,事先得澄清一些注意:     1. 数学分析层面求两曲线,其实就是方程组求解;     2. “曲线”概念包括“直线”(处处曲率半径为无穷大);     3. Matlab的重是离散 矩阵运算,因此所有运算都是基于离散的,因而这里的曲线并不是绝对光滑的。     4. 近似试探与未知函数表达式。 对于1,我想说的是,如果你想要求得两曲线的精确交,并且一个不漏,那就直接求解方程组,不用看本帖下文; 对于2,直线在Matlab里面是两个确定,因此交如果是一段线(无穷个)的情况,可能只是显示两端为交; 对于3,很简单的例子,参数方程 x=cos,y=sin 在数学分析(即连续空间)层面上是个圆,但是如果你在离散t的时候,间距比较大,那么最后Matlab绘制的图像不是圆,而是正多边形了。因此,此时我们讨论曲线是这个离散连线的图形与其他图形的交,而非圆与其他交。这也是我在标题中加了“离散连成”的修饰词,防止被误会。 对于4,既然是求曲线,那么本方法可以作为求方程组的近似解。当然,如果离散够多,解的精确度可以保证,不过不能保证一个不漏。另外就是,对于一组离散构成的曲线,很难知道它们的解析表达式,因此想通过非线性方程组求解的方法来求交,就不大可能了(不过你可以用曲线拟合出函数解析式),因此,本帖的方法将会是一个较为有效求交的方法。     废话了那么多,下面就说说曲线求交的方法吧。除了求解方程组,很多人想到的方法就是“离散 判断距离是否足够接近”,这个方法原理跟引言中曲面求交的方法是一样的。因此缺也是一样的——太粗糙了。网上这种方法的代码也很多,这里就不上了。 下面将阐述我的方法以及给出例子代码。     我有两种思路,一种是高级绘图层面的(不涉及到底层操作),一种是底层的。我只给出了第一种的代码,因为我不会底层操作。     思路一:既然matlab曲线绘图是通过有序离散依次连线形成,也就是说,通过“以直代曲”的过程,那么曲线无非就是离散(结)或者两线段交。这比上面直接用交附近的结替代交的方法要精确得多了。而两直线交很容易求,只要知道四个坐标,那么交精确坐标自然可以表示出来。这就是求交的原理。只是还有一些细节处理和要注意的地方,我会留到后面再详细说。     思路二:仔细观察两曲线的特性,很容易发现,其实交就是操作系统底层绘图重叠的那些像素。因此,只要给要绘制的像素做个标记,将那些重合的突出显示(比如换个颜色),那么就相当于显示出交了。这种方法由于是本质性的,因此不会遗漏任何交,而且精确度极高,适用范围广。Matlab提供的plot plot3 surf等绘图函数都属于高级绘图,底层绘图(或称低级绘图)只有line surface以及patch等少数函数。但是,这里的“底层”并非真正的底层,因为它还是经过封装了的,而C 的MFC里面直接用刷子绘图,那才是依靠操作系统完成的真正的“底层”绘图操作(包括所有窗口都是操作系统绘制的)。这里扯远了,想要说明的就是底层绘图的概念而已。只是我不会用matlab实现这些底层绘图。     上面说了思路,下面就详细说说一些注意和需要处理的细节。     为了算法的健壮性,就必须考虑各种奇异的情况,防止bug。我们要考虑曲线有分支(很多代数曲线是这样的,代数几何里面研究的东西)、间断跳跃(有绝对值函数或者存在渐近线情况)、首尾是交、在切相交,等等这些情况。而且对于定位交处附近的四个最近端也是个问题(因为这里存在一个情况,如果曲线1上的一条线段与曲线2上的两条或者以上的线段相交,我的程序因为这个问题没能有效解决,出现在一些非常特殊的情况下会遗漏部分交)。上面的情况如果不考虑,那么你的程序就会出现各种各样的问题。     对于通常情况,我考虑使用变号法则来判断交(也就是高数里面“连续函数变号端内存在零”),对于上面说的特殊情况,那么预先处理,比如先看是否存在eps内的,或者为零的结,有则直接记录,没有的话,通过两线段求交来确定交。至于遍历顺序的问题,为了简便,我指考虑两曲线离散个数相同的情况(因为不同的话,会出现一些无法处理的情况),而且优先考虑离散的坐标值中x或者y都相同的情况(比如x=0:0.1:pi; y1=sin, y2=x.^2这两条曲线的x值相同分布)。 下面是曲线y=cos.*exp)与y2=sin.^2 cos在[0:pi/18:2*pi]区间内的交的代码: 注意:我没有写成接口的形式,虽然对于比那些较懒的人来说不太方便,但是这样做是为了让你能更好弄懂原理,并能自己改造代码。因此,下面的代码可以稍作修改,就能解决别的曲线求交。这样,不愿思考的懒人就没法达到自己的目的了~% 绘制两离散曲线的交 % 注意: %   1. 这里的“交”指的是离散连线绘出的图形的交,而非函数或者方程理论分析上的交, %      因此,这个程序不能作为求根来用。 %   2. 要求两曲线的离散个数一样。 %   3. 两个曲线出现参数方程的话,大多数情况正常。但是经测试发现,对于某些非常特殊的情况会出现bug, %      除非调用ezplot的数据(xdata,ydata)。 % %   by kastin @Mar 21, 2012 clear; debug=false; %关闭显示求交过程 % 曲线1 x=0:pi/18:2*pi; y=cos.*exp); % 曲线2 [x1 N]=sort;  %此处对于C1参数方程,C2为显式函数;或者均为参数方程时候有用 % 下面几句代码在本个案下没有什么特殊作用,但是当出现参数方程的时候,下面的方法改动一下就会有用。 y1=sin.^2 cos; %用于作图 x2=x; y2=sin.^2 cos; %用于寻 h=plot; y<=eps)=0; y20; neg=cy<=0; %确定变号位置 fro=diff~=0; %变号的前导位置 rel=diff~=0; %变号的尾巴位置 zpf=find; %记录索引 zpr=find 1; %记录索引 zpfr=[zpf; zpr]; hold on % 观看求交过程 if debug, hp=plot,y,'r.-',x2,y2,'g.-'); end %线性求交 x0=.*-y)-x.*-y))./ y2-y-y2); y0=y ).*-y)./-x); if any), y0=y2; end %加入已经判断为零的位置 x0=[x<=eps) x0].'; y0=[y<=eps) y0].'; hc=plot; %绘制交 if debug, legend;hp],'C1','C2','交','微线段1','微线段2',0); end legend xlabel, ylabel, zlabel; title axis equal hold off disp disp) %排除重复的复制代码经测试十几种奇怪的曲线相交(包括参数方程形式的曲线),目前发现上述代码的方法有四种情况会出现遗漏一两个交。(其实上面代码本意是求显式函数的曲线,或者未知表达式的离散曲线的交,并未针对参数方程,隐函数方程做优化,但是可以凑合着用用。)
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值