Matlab程序设计语言基础

2.1Matlab程序设计语言基础

1.若i和j不改写,它们将表示虚数的。但是在Matlab程序的设计过程中,经常使用i或者j作为循环的变量。如果涉及到虚数运算,应当先确认这两个量有没有被改写,如果被改写了,用i=sqrt(-1)来重置。

2.无穷大,在Matlab中用inf表示,负无穷大相应地用-inf表示。

3.NaN,指的是不定式(not a number,NaN),通常由0/0运算、Inf/Inf及其他可能的运算得出。

4.pi,圆周率的双精度浮点表示。

2.1.2数据结构

1.数值型。Matlab中最常用的数值量是双精度的浮点数,占8个字节(64位),在matlab中其表示为double()。

2.符号型。Matlab中还定义了符号型变量,用来区别数值型变量,可以用于推导公式和数学解析求解。在进行解析运算之前要将采用的变量声明为符号变量,利用的命令是syms.具体用法是syms vars props,其中vars是需要声明的变量列表,可以同时生命多个变量,中间用空格分隔,而不是用逗号分隔开。如果需要,还可以进一步生命变量的类型:props,可以使用的类型由real、positive等。例如,将a、b定义为符号变量可以表达为:syms a b,假设要将a定义成实数,那就用syms a real

符号型数值可以通过变精度算法函数vpa()以任意指定的精度显示出来。该函数的调用格式为vpa(A),或vpa(A,n),其中A是要显示的数值或者矩阵,n为指定的有效数字位数,前者以默认的十进制位数(32位)显示结果

例2-1.自然对数底e的前300位有效数字可以由下面的语句直接显示出来。代码中首先要把1转换成符号量。

如果没有把1转换成符号量,则结果如下:

 说明如果没有把1转换成符号类型,虽然要求了提供前300位的解析解,但是程序做不到。

3.其他数据结构。

3.1字符串。Matlab支持字符串变量,与其他语言不同的是,matlab的字符串需要用单引号括起来。(这点跟Python有点像)

3.2多维数组。三维数组是一般矩阵的直接拓展。在控制系统的分析中也可以直接用于多变量系统的表示上。在实际编程中还可以使用维数更高的数组。

3.3单元数组。单元数组是矩阵的直接扩展,其存储格式类似于普通的矩阵,而矩阵的每个元素不是数值,可以认为能储存任意类型的信息,这样每个元素称为“单元”(cell),例如A{i,j}可以表示单元数组A的第i行,第j列的内容。

3.4类与对象。后面再介绍,高阶内容。

2.1.3Matlab的基本语句结构

1.直接赋值语句

变量=值。例如考虑矩阵:

 由下面的语句将值直接赋值给矩阵A

2.函数调用语句

基本形式:[返回变量列表]=函数名(输入变量列表),其中,函数名的要求和变量名的要求是一致的,一般函数名应该对应再MATLAB路径下的一个文件。

例如函数名为:my_fun应该对应于my_fun.m文件。还有一些函数名需对应于MATLAB的内核函数(built-n function),如inv()等函数。

返回变量列表和输入变量列表均可以由若干个变量名组成,它们之间应该分别用逗号。返回变量还允许使用空格分隔,例如[U S V]=svd(X),这是对矩阵X进行SVD分解的函数,返回值是S,V,D这三个变量,如果不想返回某个变量,则可以用~符号占位。 

2.1.4冒号表达式于子矩阵提取

这一部分很重要,因为控制系统中的运算除了少数简单的的纯代数运算,大部分都是矩阵运算。冒号表达式时MATLAB中很有用的表达式,在向量生成、子矩阵提取等很多方面极其重要。冒号表达式的原型为:v=s1:s2:s3,该函数将生成一个行向量v,其中s1时向量的起始值,s2为步距:该向量从s1出发,每隔步距s2就取一个点,直至不超过s3的最大值就可以构成一个向量。若省略s2,则步距默认取1.

例2-4选择不同的步距,则可以用下面语句在t∈[0,Π]区间去除一些点构成向量。

下面尝试冒号表达式的不同写法

很明显步距无法是负的,所以v2取出来是个空的向量。

如果省略了s2,程序会默认步距为1.

如果把上下限反过来写,步距写成-1,那么就会逆序排列构成新向量。 

        提取子矩阵是在MATLAB操作中非常容易用到的操作。提取子矩阵的具体方法是B=A(v1,v2),其中,v1向量表示子矩阵要包含的行号构成的向量,v2表示要包含的列号构成的向量,这样从A矩阵中提取有关的行和列,就可以构成子矩阵B了。如果v1的地方用冒号占位,即B=A(:,v2)意思是要提取A矩阵所有的行。子矩阵提取通常配合关键字end使用,end用于表示最后一行/列。

例2-5 下面将列出若干命令,并加以解释。

提取矩阵A的奇数行和所有列。这里嵌套了冒号表达式,我们知道冒号表示的格式是,a=s1:s2:s3,其中s2为步距。那么在B1=A(1:2:end,:)中,逗号前的语句就是冒号表达式,即1:2:end,意思是,从第一行开始,以步距为2,取下一行,一直到行数的末尾。 这样就实现了奇数行的提取。而逗号之后是一个冒号,意思是所有的列都取。

取A矩阵的第3、2、1行和2、3、4列组成新矩阵B2

取A矩阵的所有行,列从第一列到最后一列反着排列组成新矩阵B3。实际上就是左右颠倒个儿。 

2.2 基本数学运算

2.2.1矩阵代数运算

如果一个矩阵A有n行、m列元素,则称A矩阵为nxm矩阵;若n=m则矩阵为仿真。

1.矩阵转置

矩阵转置记作B=A^T,其元素定义为b_{ji}=a_{ij},i=1,2,...,n,j=1,2,...,m,故B为mxn矩阵。如果A矩阵含有复数元素,则对之转置时,其转置矩阵B的元素定义为b_{ji}=a_{ij}^*,j=1,2,..,n,j=1,2,...,m即先对各个元素进行转置,然后再逐项求取其共轭复数值。这种转置又称为Hermit转置,其数学符号是B=A^*。MATLAB中用A'可以求出A矩阵的Hermit转置,矩阵的转置则可以由A.'求出。

2.加减法

假设再MATLAB环境下有两个矩阵A和B,则可以由C=A+BC=A-B命令取执行矩阵加减法。若A和B的矩阵维数相同,它将会自动地将A和B矩阵对应元素相加减,从而得到正确的结果,并赋值给C变量。若二者之一为标量,则应该将其遍加(减)于两一个矩阵。在其他情况下,MATLAB将自动地给出错误信息,提示用户两个矩阵的维数不匹配。

3.矩阵乘法

4.矩阵的左右除

MATLAB中用“\"和"/"分别表示矩阵的左除和右除,A\B为方程AX=B的解XX=B/A为方程XA=B的解。若A为非奇异方阵,则左除和右除分别为X=A^{-1}BBA^{-1}

5.矩阵翻转

矩阵A进行左右翻转再赋值给B:B=fliplr(A),而C=flipud(A)是指把矩阵A上下翻转再赋值给C,D=rot90(A)是将矩阵A逆时针旋转90度再赋值给D

6.矩阵乘方

矩阵乘方要求A必须是方阵,代码为F=A^x,其中x可以是整数、分数、无理数和复数。

7.点运算

MATLAB中的特殊运算。两个矩阵之间的点运算是它们对应元素的直接运算。例如C=A.*B表示A和B的相应元素之间直接进行点乘运算,然后将结果赋值给C矩阵,即c_{ij}=a_{ij}b_{ij}。这种点乘运算又称为Hadamard乘积。注意,点乘积要求A和B矩阵的维数相同或其一为标量。这种运算和普通乘法不同。

点运算在MATLAB中起到很重要的作用。例如,当x是一个向量时,则求取数值[x_i^5]时不能直接写成x^5,而必须写成x.^5。在进行矩阵的点运算时,同样要求运算的两个矩阵是维度一致的。其实一些特殊的函数,例如sin()也是由点运算的形式进行的,因为它要对矩阵的每个元素求取正弦值。

矩阵点运算不仅可以用于点乘积,还可以用于其他。例如进行A.^A运算,则新的矩阵元素为a_{ij}^{a_{ij}}

2.2.2矩阵的逻辑运算 

2.2.4解析结果的化简与变换

MATLB的化简函数为simple(),具体用法:

s1=simple(s) %从各种方法中自动选取最简单格式

[s1,how]=simple(s)%化简并返回实际采用的化简方法

除此之外还有collect()函数,可以合并同类项,expand()函数可以展开多项式,factor()函数可以因式分解,numden()函数可以提取多项式的分子和分母,sincos()可以进行三角函数的化简等。这些函数的信息与调用格式都可以用help查看。

例2.6 假设一致含有因式的多项式

试用各种化简函数对其进行处理,并理解得出的变换结果。 

这里需要注意,高版本的matlab好像已经没有simple函数,取而代之的是simplify()

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值