2.4 函数编写与调试 2.4.1 基本结构 两种源程序文件格式:M-文件、M-函数。常用后者。 保留变量nargin和nargout用于确定函数的输入和输出变量的个数。 [输出变量列表]=函数名(输入变量列表),均用逗号分隔。 help 函数名:显示注释语句内容,但空格行下方的注释不被显示。 if abs(n-floor(n))>eps|n<0 error(‘n应该是非负整数’);="" 上面的代码涉及abs、floor、eps、error、|等符号,用于判定是否为非负整数。="" 函数可以递归调用:="" function="" srhf\_fact(n)="" if="" n="">1 k=n*srhf_fact(n-1); elseif any[0,1]==n k=1 end 2.4.2 可变输入输出个数 如何建立起无限个输入或输出变量的函数?这种方式被广泛采用。 conv(A,B)用于求多项式的乘积,多个多项式的乘积只能嵌套使用此函数,即conv(C, conv(A,B))。这样很不方便,可以考虑编写一个新的函数convs,其输入变量不限于2个,而是无限个,在MATLAB中“无限”并不是纯粹数学上的无限,而是指输入或输出变量的个数不再于函数编写时加以限制,所以在函数中需要知道用户在输入变量列表中给出了几个变量,这需要调用length函数。 函数输入变量列表可以是一个变量(实际上是一个向量) varargin,此变量是保留变量,它表示多个变量的集合,那么length(varargin)的输出变量是一个正整数,表示varargin中具体包含的变量数量。 function a=convs(varargin) a=1; varnum= length(varargin); for i=1:varnum a=conv(a,varargin{i}); end end 2.4.3 inline函数与匿名函数 一个简单的函数,没有必要单独创建一个.m文件,只用一行代码进行描述即可。 function a=f(x,y) a=sin(x.^2+y.^2) end 上面的函数是在.m文件中的代码,而有些情况下,如微分方程求解和最优化问题,这样的函数可以采用inline函数的形式给出。 f=inline(‘sin(x.^2+y.^2)’,’x’,’y’) 以上两种函数定义形式,无论采用哪种,都可以通过z=f(3,6)直接求出z=0.8509,显然inline函数更为简便。 匿名函数跟inline函数类似,区别有二:更简洁、可直接使用工作空间中的变量。 简洁体现在f=@(x,y) sin(x.^2+y.^2) 变量的优势十分明显:一般函数中的变量,无论是输入变量还是输出变量只在函数内部使用,跟工作空间中的变量是相对隔离的,工作变量作为输入变量代入函数,工作变量便替换函数变量进行计算,最后函数将输出变量的结果代入工作变量返回工作空间。这样做虽然严谨,有效避免了变量使用上的混乱,但有时不够方便,匿名函数的引入,有效地将工作变量和函数变量结合起来,使用上更为灵活,但有一点需要注意,匿名函数直接引用工作变量,只是引用当时的工作变量的值,引用完成之后,如果工作变量的值发生变化,匿名函数所引用的工作变量值不会随着变化,仍然是之前的值。 2.5 二维图形绘制 2.5.1基本函数:plot(t,y) t1,t2,t3时刻的函数值分别是y(t1),y(t2),y(t3),将其输入MATLAB就是两个向量t=[t1,t2,t3],y=[ y(t1),y(t2),y(t3) ],这种曲线实际上是各个时刻对应函数值之间的折线,当t向量足够密集,看起来就是曲线了,所以在某些特殊区间(慢变化区间)可以取点较稀疏,以提高运算速度,在另一些区间(快变化区间)则需要较密集,以得到这些特殊区间的较为准确的图形。 (1) t、y均为向量,如上,还有更为简单的形式plot([t1,t2,t3],[y1,y2,y3]) (2) t为向量,y为矩阵。将y矩阵的每一行作为y向量与t共同绘制一条曲线,曲线数量跟y矩阵行数相等,这要求y矩阵的列数跟t向量的元素个数相等。 (3) t、y均为矩阵。要求t、y矩阵行列数均相等,取t矩阵的一行与y矩阵的同一行组成向量对进行绘制。 (4) 以上三种组合形式,如果不止一对t、y,而是多对,那么不必多次使用plot函数,可以这样一次绘出所有的图形plot(t1,y1,t2,y2,t3,y3)或plot(t1,y1,Option1,t2,y2, Option2,t3,y3, Option3),Option的具体用法参见P30. 图形的附属命令: grid on/off:打开或关闭网格 hold on/off:保护当前坐标,以后再用plot函数时新的曲线将叠印在现有坐标系上 title():添加标题 xlabel()和ylabel():给坐标轴加标注 (abs(x)>n):将此式与其他解析式点乘,当x在(-n,n)区间以外此式取1,否则取0,这是分段函数在MATLAB中的表达方式。 所得图形中有多个对象,如曲线、坐标轴、图形窗口等,每个对象都可以设置具体属性,属性也可以被读取。 set(句柄,’属性名1’,属性值1,’属性名2’,属性值2…) v=get(句柄,’属性名1’) 属性名必须加单引号,属性值不加。 2.5.2 特殊意义的图形绘制函数:参见P32. 2.5.3隐函数的绘制 隐函数:f(x,y)=0 ezplot(‘f(x,y)’)或ezplot(‘f(x,y)’,[-m,n]) 仅在[-m,n]上绘制隐函数图形 2.6 三维图形绘制 2.6.1三维曲线绘制 plot3(x,y,z)或plot3(x1,y1,z1,选项1,…) 2.6.2 三维曲面绘制 已知z=f(x,y),先用meshgrid()绘制网格矩阵数据x,y,再基于此平面绘制三位曲面,mesh()网格图,surf()表面图,surfc()带等高线,surfl()带光照,contour()等高线,contour3()三维等高线。例: [x,y]=meshgrid(0:10,-5:5) %在(x,y)平面上绘制一个正方形网格矩阵 z=x.^2+y.^2 surf(x,y,z) axis(-31,31,0,62,0,1) %将所得图形的立方体内的部分放大,名为重设坐标系,增大可读性 shading faceted/interp/flat %修饰显示形式,默认第一个 set(gca,’xlim,[-5,5]) %将x轴限制在一个区间内 2.6.3 三位图形的视角 view(a,b),方位角a表示从-y轴向+x轴方向逆时向旋转的角度,仰角b表示从xy平面向+z轴方向旋转的角度,默认情况下a=-37.5,b=30. 下图是我用MATLAB绘制出的第一张图,纪念一下。 0>
z=x.^2+y.^2