5. MATLAB的图形功能 5.1 二维图形的绘制 5.1.1 基本形式 5.1 二维图形的绘制 5.1.1 基本形式 二维图形的绘制是MATLAB语言图形处理的基础,MATLAB最常用的画二维图形的命令是plot,看两个简单的例子: >> y=[0 0.58 0.70 0.95 0.83 0.25]; >> plot(y) 生成的图形见右图,是以序号为横坐标、数组y的数值为纵坐标画出的折线。
>> x=linspace(0,2*pi,30); % 生成一组线性等距的数值 >> y=sin(x); >> plot(x,y) 生成的图形见下图,是上30个点连成的光滑的正弦曲线。
5.1.2 多重线 在同一个画面上可以画许多条曲线,只需多给出几个数组,例如 >> x=0:pi/15:2*pi; >> y1=sin(x); >> y2=cos(x); >> plot(x,y1,x,y2) 则可以画出右图。 多重线的另一种画法是利用hold命令。在已经画好的图形上,若设置hold on,MATLA将把新的plot命令产生的图形画在原来的图形上。而命令hold off 将结束这个过程。例如: >> x=linspace(0,2*pi,30); y=sin(x); plot(x,y) 先画好前面的图,然后用下述命令增加cos(x)的图形,也可得到上图。 >> hold on >> z=cos(x); plot(x,z) >> hold off
5.1.3 线型和颜色 MATLAB对曲线的线型和颜色有许多选择,标注的方法是在每一对数组后加一个字符串参数,说明如下: 线型 线方式: - 实线 :点线 -. 虚点线 - - 波折线。 线型 点方式: . 圆点 +加号 * 星号 x x形 o 小圆 颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青. 以下面的例子说明用法: >> x=0:pi/15:2*pi; >> y1=sin(x); y2=cos(x); >> plot(x,y1,’b:+’,x,y2,’g-.*’) 可得下图。
5.1.4 网格和标记 在一个图形上可以加网格、标题、x轴标记、y轴标记,用下列命令完成这些工作。 >> x=linspace(0,2*pi,30); y=sin(x); z=cos(x); >> plot(x,y,x,z) >> grid >> xlabel(‘Independent Variable X’) >> ylabel(‘Dependent Variables Y and Z’) >> title(‘Sine and Cosine Curves’) 它们产生右图。 也可以在图形的任何位置加上一个字符串,如用: >> text(2.5,0.7,’sinx’) 表示在坐标x=2.5, y=0.7处加上字符串sinx。更方便的是用鼠标来确定字符串的位置,方法是输入命令: >> gtext(‘sinx’) 在图形窗口十字线的交点是字符串的位置,用鼠标点一下就可以将字符串放在那里。
5.1.5 坐标系的控制 在缺省情况下MATLAB自动选择图形的横、纵坐标的比例,如果你对这个比例不满意,可以用axis命令控制,常用的有: axis([xmin xmax ymin ymax]) [ ]中分别给出x轴和y轴的最大值、最小值 axis equal 或 axis(‘equal’) x轴和y轴的单位长度相同 axis square 或 axis(‘square’) 图框呈方形 axis off 或 axis(‘off’) 清除坐标刻度 还有axis auto axis image axis xy axis ij axis normal axis on axis(axis)用法可参考在线帮助系统。
5.1.6 多幅图形 可以在同一个画面上建立几个坐标系, 用subplot(m,n,p)命令;把一个画面分成m×n个图形区域, p代表当前的区域号,在每个区域中分别画一个图,如 >> x=linspace(0,2*pi,30); y=sin(x); z=cos(x); >> u=2*sin(x).*cos(x); v=sin(x)./cos(x); >> subplot(2,2,1),plot(x,y),axis([0 2*pi –1 1]),title(‘sin(x)’) >> subplot(2,2,2),plot(x,z),axis([0 2*pi –1 1]),title(‘cos(x)’) >> subplot(2,2,3),plot(x,u),axis([0 2*pi –1 1]),title(‘2sin(x)cos(x)’) >> subplot(2,2,4),plot(x,v),axis([0 2*pi –20 20]),title(‘sin(x)/cos(x)’)
共得到4幅图形,见下 图。
5.2 三维图形的绘制 5.2.1 带网格的曲面 例 作曲面z=f(x,y)的图形 用以下程序实现: 5.2 三维图形的绘制 5.2.1 带网格的曲面 例 作曲面z=f(x,y)的图形 用以下程序实现: >> x=-7.5:0.5:7.5; >> y=x; >> [X,Y]=meshgrid(x,y); (3维图形的X,Y数组) >> R=sqrt(X.^2+Y.^2)+eps; (加eps是防止出现0/0) >> Z=sin(R)./R; >> mesh(X,Y,Z) (3维网格表面) 画出的图形如右图. mesh命令也可以改为surf, 只是图形效果有所不同。
5.2.2 空间曲线 例 作螺旋线 x=sint, y=cost, z=t 用以下程序实现: 5.2.2 空间曲线 例 作螺旋线 x=sint, y=cost, z=t 用以下程序实现: >> t=0:pi/50:10*pi; >> plot3(sin(t),cos(t),t) (空间曲线作图函数, 用法类似于plot) 画出的图形如图。
5.3 图形的输出 5.2.3 等高线 5.2.4 三维直方图 bar3() 5.2.5 三维饼图 pie3() 5.2.3 等高线 用contour 或 contour3 画曲面的等高线,如对图5-7的曲面, 在上面的程序后接 contour(X,Y,Z,10) 即可得到10条等高线。 5.2.4 三维直方图 bar3() 5.2.5 三维饼图 pie3() 5.3 图形的输出 在数学建模中,往往需要将产生的图形输出到Word文档中。通常可采用下述方法: 首先,在MATLAB图形窗口中选择【File】菜单中的【Export】选项,将打开图形输出对话框,在该对话框中可以把图形以emf、bmp、jpg、pgm等格式保存。然后,再打开相应的文档,并在该文档中选择【插入】菜单中的【图片】选项插入相应的图片即可。
6. MATLAB的应用 6.1 MATLAB在数值分析中的应用 6.1.1 分段线性插值 插值与拟合是来源于实际、又广泛应用于实际的两种重要方法。随着计算机的不断发展及计算水平的不断提高,它们已在国民生产和科学研究等方面扮演着越来越重要的角色。下面对插值中分段线性插值、拟合中的最为重要的最小二乘法拟合加以介绍。 6.1.1 分段线性插值 所谓分段线性插值就是通过插值点用折线段连接起来逼近原曲线,这也是计算机绘制图形的基本原理。实现分段线性插值不需编制函数程序,MATLAB自身提供了内部函数interp1其主要用法如下: interp1(x,y,xi) 一维插值 ◆ yi=interp1(x,y,xi) 对一组点(x,y) 进行插值,计算插值点xi的函数值。x为节点向量值,y为对应的节点函数值。如果y 为矩阵,则插值对y 的每一列进行,若y 的维数超出x 或 xi 的维数,则返回NaN。 ◆ yi=interp1(y,xi) 此格式默认x=1:n ,n为向量y的元素个数值,或等于矩阵y的size(y,1)。
◆ yi=interp1(x,y,xi,’method’) ● nearest 线性最近项插值。 ● linear 线性插值。 ● spline 三次样条插值。 ● cubic 三次插值。 所有的插值方法要求x是单调的。x 也可能并非连续等距的。 正弦曲线的插值示例: >> x=0:0.1:10; >> y=sin(x); >> xi=0:0.25:10; >> yi=interp1(x,y,xi); >> plot(x,y,’0’,xi,yi) 则可以得到相应的插值曲线。 Matlab也能够完成二维插值的运算,相应的函数为interp2,使用方法与interpl基本相同,只是输入和输出的参数为矩阵,对应于二维平面上的数据点,详细的用法见Matlab联机帮助。
6.1.2 最小二乘法拟合 在科学实验的统计方法研究中,往往要从一组实验数据中寻找出自变量x 和因变量y之间的函数关系y=f(x) 。由于观测数据往往不够准确,因此并不要求y=f(x)经过所有的点 ,而只要求在给定点上误差按照某种标准达到最小,通常采用欧氏范数作为误差量度的标准。这就是所谓的最小二乘法。在MATLAB中实现最小二乘法拟合通常采用polyfit函数进行。 函数polyfit是指用一个多项式函数来对已知数据进行拟合,我们以下列数据为例介绍这个函数的用法: >> x=0:0.1:1; >> y=[ -0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2 ] 为了使用polyfit,首先必须指定我们希望以多少阶多项式对以上数据进行拟合,如果我们指定一阶多项式,结果为线性近似,通常称为线性回归。我们选择二阶多项式进行拟合。
>> P= polyfit (x, y, 2) -9.8108 20.1293 -0.0317 函数返回的是一个多项式系数的行向量,写成多项式形式为: 为了比较拟合结果,我们绘制两者的图形: >> xi=linspace (0, 1, 100); %绘图的X-轴数据。 >> Z=polyval (p, xi); %得到多项式在数据点处的值。 当然,我们也可以选择更高幂次的多项式进行拟合,如10阶: >> p=polyfit (x, y, 10); >> xi=linspace (0, 1,100); >> z=ployval (p, xi); 读者可以上机绘图进行比较,曲线在数据点附近更加接近数据点的测量值了,但从整体上来说,曲线波动比较大,并不一定适合实际使用的需要,所以在进行高阶曲线拟合时,“越高越好”的观点不一定对的。
6.2 符号工具箱及其应用 在数学应用中,常常需要做极限、微分、求导数等运算,MATLAB称这些运算为符号运算。MATLAB的符号运算功能是通过调用符号运算工具箱(Symbolic Math Toolbox)内的工具实现,其内核是借用Maple数学软件的。MATLAB的符号运算工具箱包含了微积分运算、化简和代换、解方程等几个方面的工具,其详细内容可通过MATLAB系统的联机帮助查阅,本节仅做简单介绍。 6.2.1 符号变量与符号表达式 MATLAB符号运算工具箱处理对象主要是符号变量与符号表达式。要实现符号运算,首先要将处理对象定义为符号变量或符号表达式,定义格式如下: 格式1: sym (‘变量名’) 或 sym (‘表达式’) 功能: 定义一个符号变量或符号表达式。 例如: >> sym (‘x’) % 定义变量x为符号变量 >> sym(‘x+1’) % 定义表达式x+1为符号表达式 格式2: syms 变量名1 变量名2 …… 变量名n 功能: 定义变量名1、变量2 ……、变量名 n为符号变量。 >> syms a b x t % 定义a,b, x,t 均为符号变量
6.2.2 微积分运算 1、极限 格式:limit (f, t, a, ‘left’ or ‘right’) 功能:求符号变量t 趋近a 时,函数f 的(左或右)极限。‘left’ 表示求左极限,‘right’ 表示求右极限,省略时表示求一般极限;a省略时变量t 趋近0; t省略时默认变量为x ,若无x则寻找(字母表上)最接近字母x 的变量。 例如:求极限的命令及结果为: >> syms x t >> limit ((1+2*t/x)^(3*x) , x, inf ) ans= exp(6*t) 再如求函数x / |x| ,当时的左极限和右极限,命令及结果为: >> syms x >> limit(x/abs(x), x, 0, ’left’) ans = -1 >> limit(x/abs(x),x, 0, ’right’) ans = 1
2、导数 格式: diff (f,t,n) 功能: 求函数f 对变量 t的n 阶导数。当n省略时,默认 n=1;当t省略时,默认变量x, 若无x时则查找字母表上最接近字母x 的字母。 例如:求函数f=a*x^2+b*x+c对变量 x的一阶导数, 命令及结果为 >> syms a b c x >> f=a*x^2+b*x+c; >> diff(f) ans= 2*a*x+b 求函数f 对变量b的一阶导数(可看作求偏导), 命令及结果为 >> diff(f,b) ans=x 求函数f 对变量x的二阶导数, 命令及结果为 >> diff(f,2) ans=2*a
3、积分 格式: int(f,t,a,b) 功能: 求函数f 对变量 t从a 到b的定积分. 当a和b省略时求不定积分;当t省略时, 默认变量为(字母表上)最接近字母x的变量。 例如:求函数f=a*x^2+b*x+c对变量x不定积分, 命令及结果为 >> syms a b c x >> f=a*x^2+b*x+c; >> int(f) ans= 1/3*a*x^3+1/2*b*x^2+c*x 求函数f 对变量b不定积分, 命令及结果为 >> int(f,b) a*x^2*b+1/2*b^2*x+c*b 求函数f 对变量x 从 1到5的定积分, 命令及结果为 >> int(f,1,5) 124/3*a+12*b+4*c
4、级数求和 格式: symsum (s,t,a,b) 功能:求表达式s中的符号变量t从第a项到第b项的级数和。 例如: 求级数的前三项的和, 命令及结果为 >> symsum(1/x,1,3) ans=11/6
6.2.3 化简和代换 MATLAB符号运算工具箱中,包括了较多的代数式化简和代换功能,下面仅举出部分常见运算。 simplify 利用各种恒等式化简代数式 expand 将乘积展开为和式 factor 把多项式转换为乘积形式 collect 合并同类项 horner 把多项式转换为嵌套表示形式 例如:进行合并同类项执行 >> syms x >> collect(3*x^3-0.5*x^3+3*x^2) ans= 5/2*x^3+3*x^2) 进行因式分解执行 >> factor(3*x^3-0.5*x^3+3*x^2) 1/2*x^2*(5*x+6)
6.2.4 解方程 1、代数方程 格式:solve (f,t) 6.2.4 解方程 1、代数方程 格式:solve (f,t) 功能:对变量t 解方程f=0,t 缺省时默认为x 或最接近字母x 的符号变量。 例如:求解一元二次方程f=a*x^2+b*x+c的实根, >> syms a b c x >> f=a*x^2+b*x+c; >> solve (f,x) ans= [1/2/a*(-b+(b^2-4*a*c)^ (1/2))] [1/2/a*(-b-(b^2-4*a*c)^ (1/2))] 2、微分方程 格式:dsolve(‘s’, ’s1’, ’s2’,…, ’x’) 其中s为方程;s1,s2,……为初始条件,缺省时给出含任意常数c1,c2,……的通解;x为自变量,缺省时默认为t 。 例如:求微分方程的通解 >> dsolve(‘Dy=1+y^2’) tan(t+c1)