分享

Matlab教程--进阶篇

 昵称2530266 2019-02-13

   Hello,大家好,上期智商经常性短期离线的上官小编又回来了。这次将为大家带来Matlab的进阶篇教程,这期将会介绍编程,绘图以及simulink的学习方法。


Matlab编程的基本方法

  不知道大家还记不记得上期教程中的一句话,Matlab的核心语言是C语言。在编程的过程中用到的很多思想都和C语言的编程非常相似,学过C语言的同学只要在学习Matlab的过程中举一反三,就能很容易的掌握这个方法了。

首先,为大家介绍一下M文件。我们编出来的程序都是以M文件的形式存放在计算机中的。M文件是以 .m为后缀的文件,根据调用方式的不同可分为脚本文件和函数文件。两者的区别就在于脚本文件只是一连串命令的集合体,而函数文件是有着输入和输出变量的。

  接下来为大家介绍一下函数文件。函数文件由function语句引导,基本的形式是


function[输出形参列表]=函数名(输入形参列表)


  其中函数的命名规则与变量相同,且开头必须是字母,当输出形参多于一个时必须用方括号括起来。下面为大家举个栗子。


function y = fliplr(x)

%FLIPLR Flip matrix in left/right direction.

 

if ~ismatrix(x)

  error(message('MATLAB:fliplr:SizeX'));

end

y = x(:,end:-1:1);


  这就是一个简单的将矩阵进行左右翻转的函数。并且为了用户的方便,通常会在函数里加入容错的指令,即if开始向下的部分,在函数的结尾用end表示结束。这样一个函数就编写完成了,当我们需要的时候直接调用就好了。而调用的方法和C语言也很相似。只需要 [输出实参列表]=函数名(输入实参列表),特被需要注意的是,函数调用时,实参的顺序应与函数定义时的形参的顺序一致,变量名无需一致。

下面再举一个调用的栗子。

>> a=[1,2,3;4,5,6;7,8,9];

          >> b=fliplr(a)


  就这样,一个函数的调用就完成了。在函数编写的过程中,一个函数是可以包含多个子函数的,但要注意,主函数必须位于子函数前面,子函数只能在所在函数文件内被主函数和其他子函数调用,不可以出现越级调用。

  接下来为大家介绍一下全局变量和局部变量。


局部变量

函数文件中的变量都是局部的,即一个函数文件中定义的变量不能被另一个函数文件或其它M文件使用。当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即全部被清除。 


全局变量

如果在若干个M文件中,都把某个变量定义为全局变量,则这些函数将公共使用这一变量。所有函数都可以对它进行存取和修改操作。全局变量的格式为 global 变量名列表变名列表中的各个变量用空格隔开,不能用逗号


全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而在结构化程序设计中,全局变量是不受欢迎的。特别是当程序较大,子程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使用全局变量。 


控制语句

控制语句的主要形式有循环结构(for,while),条件分支结构(if-else,swich-case),错误控制语句(try-catch),然后end结尾(这个千万不要忘了)。其实他们的功能与C语言中的控制语句基本一样。下面将介绍各种控制语句的使用方法。


for循环语句


1

格式:for 变量=(初始值:增量:终止值)

        statement(循环体)

end

tips:根据for后的增量语句限定循环次数

先执行statement再判断是否循环

至少执行一次statement

循环次数仅计算一次


while语句


2

语句格式:while expression(条件语句)

         statement(循环体)

end

tips:while后语句为循环进行的判定条件

先判定条件再执行statement

可以一次statement都不执行

(其实讲道理和C语言里的for和while一样有没有)


if-else条件语句


3

语句格式:if expression1 (条件1)

statement 1(语句组1)

elseif expression2(条件2)

          statement2(语句组2)

else statements(语句组)

end


switch-case开关语句


4

switch expression(表达式)

case value1(数值1)

statement1(语句组1)

case value2(数值2)

statement2(语句组2)

           otherwise statement(语句组)

end


try-catch错误控制语句


5

try

        statement1(如果正确执行,跳出结构)

catch

         statement2(如果statement1错误则执行)

end


控制指令

6

ontinue: 在for或者while循环中直接跳至下一个循环的执行(即如果符合条件直接返回循环的开始执行循环,与后边的break直接跳出循环要区分开)

  break:终止for或while循环,跳出执行循环后的下一个语句(直接跳出循环)

  return:提前终止函数,回到主调文件中

(这个控制指令也和C语言没有太大区别)


关系运算

首先强调下=与==的区别,=是赋值操作,b=a即把a的值赋给b,而b==a是关系运算,变量b和变量a进行比较,如果相等,则返回真。

接下来介绍几种逻辑运算。

&&和||比&和|更智能,当一个数满足条件时,不计算另一个数。


到这里编程所需的基本语句和运算符号都介绍完毕了,小编提醒,在未来编程的过程中为了提高编程效率,要令自己的程序功能层次合理,满足脚本——高级函数——低级函数的顺序,尽量少使用循环,可以用矩阵的操作代替,尽量避免使用全局变量、递归调用。最后为大家介绍一个求解非线性方程的常用方法,牛顿迭代:


下面将以方程x2+2xex+e2x=0为例,运用牛顿迭代法求方程的根。 

算得迭代数列的前20项为-0.2500,-0.3986,-0.4802,-0.5230,-0.5449,-0.5560,-0.5615,-0.5643,-0.5657,-0.5664,-0.5668,-0.5670,-0.5671,-0.5671,-0.5671,说明迭代是收敛的, 且第五次迭代时误差就不超过10^-3。


Matlab绘图的基本方法

  还在为做完实验得到的一大堆数据不知道怎么处理而头疼吗?不要慌,下面小编将教你使用Matlab处理数据。先送个小彩蛋,sphere可以画球,sphere(正整数)不同值可以画出不一样颜色的球。Sphere(1000)是黑球,sphere(100)是彩球,想知道怎么回事就往下看吧。


   通常处理数据有两种方式,一个是拟合,一个是插值。拟合是要设法找出某条光滑曲线,它最佳地拟合数据,但不必要经过每一个数据点。插值是假定数据是正确的,要求以某种方法描述数据点之间所发生的情况。


多项式的拟合

 

  通常我们采用的拟合方式是最小二乘法。最小二乘曲线拟合的函数为p=polyfit(x,y,n),其中x,y为数据点,n为多项式最高阶的阶数,p是多项式的系数向量。下面再举个栗子:x=[0, .1 , .2 , .3 , .4 , .5 , .6 , .7 , .8 , .9 , 1 ];

                       y=[-.447 , 1.978 , 3.28,6.16 , 7.08 , 7.34 , 7.66 , 9.56 , 9.48 , 9.30 , 11.2];             p=polyfit(x,y,n)

  这样就可以得出拟合出来的多项式的系数了。多项式阶次的选择是有点任意的。

  1)两点决定一直线或一阶多项式。三点决定一个平方 或2阶多项式。按此进行,n+1数据点唯一地确定n 阶多项式。

  2)在上面的情况下,有11个数据点,我们可选一个高达10阶的多项式。

   3)高阶多项式给出很差的数值特性,不应选择比所需的阶次高的多项式。随着多项式阶次的提高,近似变得不够光滑。

函数的插值

  一维插值:一维插值函数:

             yi=interp1(x,Y,xi)

返回插值向量yi,每一元素对应于参量xi, 同时由向量x与Y的内插值决定。参量x指定数据Y的点。

yi = interp1(x,Y,xi,method)  用指定的算法计算插值

  ‘nearest’:最近邻点插值,直接完成计算;

  ‘linear’:线性插值(缺省方式),直接完成计算;

  ‘spline’:三次样条函数插值。对于该方法,命令 interp1调用函数spline、ppval、mkpp、umkpp。这些命令生成一系列用于分段多项式操作的函数。命令spline用它们执行三次样条函数插值;

  ‘pchip’:分段三次Hermite插值。对于该方法,命令 interp1调用函数pchip,用于对向量x与y执行分段三次内插值。该方法保留单调性与数据的外形;

  ‘cubic’:与’pchip’操作相同。 


    下面就要教大家怎么画图了。使用函数plot即可作出图像。plot(X,Y) 当X,Y均为实数向量,且为同维向量(可以不是同型向量),X=[x(i)],Y=[y(i)],则plot(X,Y)先描出点(x(i),y(i)),然后用直线依次相连; 若X,Y均为同维同型实数矩阵,X = [X(i)],Y = [Y(i)],其中X(i),Y(i)为列向量,则plot(X,Y)依次画出plot(X(i),Y(i)),矩阵有几列就有几条线;若X,Y中一个为向量,另一个为矩阵, 且向量的维数等于矩阵的行数或者列数,则矩阵按向量的方向分解成几个向量,再与向量配对分别画出,矩阵可分解成几个向量就有几条线。

   plot(Y)若Y为实数向量,Y的维数为m,则plot(Y)等价于plot(X,Y),其中x=1:m;若y为实数矩阵,则把y按列的方向分解成几个列向量,而y的行数为n,则plot(Y)等价于plot(X,Y)其中x=[1;2; … ;n]

                                          

 plot(X1,Y1,LineSpec1,X2,Y2,LineSpec2 ) 将按顺序分别画出由三参数定义Xi,Yi,LineSpeci的线条。其中参数LineSpeci指明了线条的类型,标记符号,和画线用的颜色。在plot命令中我们可以混合使用三参数和二参数的形式。

    参数LineSpec:定义线的属性

  线条宽度 LineWidth:指定线条的宽度,取值为整数(单位为像素点) 

  标记大小 MarkerSize:指定标记符号的大小尺寸,取值为整数(单位为像素) 

  标记面填充颜色 MarkerFaceColor:指定用于填充标记符面的颜色。取值在上表。 

  标记周边颜色 MarkerEdgeColor :指定标记符颜色或者是标记符(小圆圈、正方形、棱形、正五角星、正六角星和四个方向的三角形)周边线条的颜色。 

  所以一个曲线的格式应该是这样的:    plot(t,sin(2*t),'-mo', 'LineWidth',2,'MarkerEdgeColor','k', 'MarkerFaceColor',[.49 1 .63],'MarkerSize',12) 


fplot (‘function‘,limits)

  指定的范围limits内画出一元函数y=f(x)的图形。其中向量x的分量分布在指定的范围内,y是与x同型的向量,对应的分量有函数关系:y(i)=f(x(i))。若对应于x的值,y返回多个值,则y是一个矩阵,其中每列对应一个f(x)。注意,函数function必须是一个m-文件函数或者是一个包含变量x,且能用函数eval计算的字符串。 

  如‘sin(x)*exp(2*x)’,’[sin(x),cos(x)]’ limits是一个指定x-轴范围的向量[xmin xmax]或者是x轴和y轴的范围的向量[xmin xmax ymin ymax]。同样的,fplot也可以用LineSpec进行线型和标记的区分。


特殊平面图形命令

  polar:功能画极坐标图。该命令接受极坐标形式的函数 rho=f(θ),在笛卡儿坐标系平面上画出该函数,且在面上画出极坐标形式的格栅。格式:polar(theta,rho,LineSpec)用极角theta和极径rho画出极坐标图形。极角theta为从x轴到半径的单位为弧度的向量,极径rho为各数据点到极点的半径向量。 栗子又来了:

              t = 0:.01:2*pi;

polar(t,sin(3*t).*cos(2*t),'--r')

  pie 功能:饼形图pie(X) 用x中的数据画一饼形图,x中的每一元素代表饼形图中的一部分。X中元素X(i)所代表的扇形大小通过X(i)/sum(X)的大小来决定。 pie(X,explode) 从饼形图中分离出一部分,explode为元素为零或非零的、与x相对应的向量或矩阵。与 explode的非零值对应的部分将从饼形图中心分离出来。explode必须与x同型。

栗子:

x = [1 3 0.5 2.5 2];

pie(x)

explode = [0 1 0 0 0];

pie(x,explode)


教程的最后,彩蛋附送,要考试的童鞋们看过来:

考试题型:

一、单选题(1分×10题=10分)

二、判断题(1分×10题=10分)

三、简答题(5分×4题=20分)

四、程序设计与建模(10分×4题=40分)

复习重点:

矩阵操作

牛顿迭代

函数文件

绘图

解方程

simulink


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多