控制系统与仿真CAD(2)——Matlab语言程序设计基础part1

一,数据结构

1.MATLAB语言的变量与常量

MATLAB语言的变量名规则:由一个字母引导,后面可以为其他字符(字母,数字,下划线)。

注意:

运算符号“+”“-”等,不属于其他符号。

因此,类似于“MyZar+”这样的变量名就是错误的

同时,除了变量之外,MATLAB为了计算方便,提供了一些保留常量

Eg:

pi — 表示圆周率π

eps — 表示判零的一个误差限,它的值大约是10^(-16)左右。

inf — 表示无穷大

NaN — 表示不定式,即0/0或∞/∞

2.MATLAB语言的数据结构

(1)数值型数据结构

双精度数值变量(通常使用的都是双精度数据结构):遵从IEEE标准,采用64位二进制数来表示一个数值。

其他数据类型:单精度数据结构single(),32位;uint8(),常用于图像表示和处理,8位;int8();int16();int32();

(2)符号型数据结构

符号型,sym(A),常用于公式推导和求解析解

变量声明 syms var_list var_props  (定义符号型的变量)

如果有了数值A,可以通过vpa(A)把它显示出来;也可以通过sym(A)把它转换成符号型的数据结构。

显示符号变量的任何精度:vpa(A)    vpa(A,n)                  默认精度,32位十进制有效数字

显示符号变量的属性:assumptions()

设置符号变量类型:assume()    assumeAlso()

Eg1:符号型数值与双精度数值的区别。

以1/3为例,如果采用符号型数值结构,在计算的全程中,它一直会使用1/3这样一个有理数;而用双精度数值结构,使用的值是0.333...33,保留15位有效数字(后续可能有其他数值,但是没有意义,只有前15位是有效的)。

Eg2:圆周率π。

求出π的300位有效数字。

Matlab代码    vpa(pi,300)               

可以任意增加有效数字的位数。但是,随着有效数字位数的增加,运行时间会变长,位数要求过多可能无法显示。

Eg3:试用符号型数据结构表示数值12345678901234567890。

错误写法:A=sym(12345678901234567890)

正确写法:B=sym('12345678901234567890')                       把数值用单引号引起来变成字符串

(3)其他数据结构

字符串型数据:用单引号括起来

多维数组:是矩阵的直接扩展,多个下标

单元数组:将不同类型数据集成到一个变量名下面,用{}表示

表格数据结构:可以定义带表头的表格

类与对象:可以定义重载函数,类与对象是“面向对象”编程的基本元素——传递函数对象

二,矩阵与向量的输入方法

1.两种基本语句结构

(1)直接赋值语句

接赋值语句的基本结构

variable=expression

一个变量名后面是表达式,表达式运算完之后将结果传给变量名。

赋值语句的末尾加一个分号可以阻止显示运算的结果。

保留变量:ans,存放最近一次无赋值变量语句的计算结果。

当赋值语句没有左边的变量,直接给出表达式,这个结果也会计算,计算结果赋给一个保留变量ans。ans里总是存放最后的运算结果。

Eg:表示矩阵  \begin{bmatrix} 1&2&3\\ 4&5&6\\ 7&8&9\\ \end{bmatrix}

MATLAB代码:A=[1,2,3;4,5,6;7,8,9]

同样,还可以B=[1,2;4,5];

                      A=[[B;[7,8]],[3;6;9]]

其中,逗号表示换列,分号表示换行。

(2)函数调用语句

[returned_arguments]=function_name(input_arguments]

左边方括号里面有一些返回变量,返回的变量名之间可以用逗号也可以用空格表示。右边是函数名以及函数的输入变量。

函数调用举例 [U S V]=svd(X)

一般函数在MATLAB下都有对应的.m文件,可以通过m文件进行调用。

2.冒号表达式与子矩阵提取

冒号表达式是定义行向量的有效方法

v=s1:s2:s3;

开始于值s1,步长为值s2,终止于值s3。如果不设置的话,步长默认为1。

v1=0:0.2:pi;                      %%0到π之间,从0开始,间隔0.2取值

v2=linspace(0,pi,50);                     %%0到π之间,均匀地取50个数

3子矩阵提取

子矩阵提取的基本语句格式

B=A(v1,v2);

v1表示子矩阵要保留的行号构成的向量

v2表示要保留的列号构成的向量

:, 表示要提取所有行或列,取决于其位置

end的使用

举例

B=A(1:2:end,:),表示以1开始,步距为2,直至最后一行(end),即把A矩阵的奇数行提取出来。并且,提取所有的列(;) 。

C=A([1,1,1,1],:) ,表示把A矩阵的第一行重复4遍,并提取所有列。

三,矩阵的代数运算

1.矩阵转置       

Hermite转置   c_{ij}={a^*}_{ji}        C=A'

一般转置   b_{ij}=a_{ji}        B=A.'              (注意不要漏了.

2.加减法运算

C=A+B

C=A-B

在新版本中,如果A是一个n*n的矩阵,B是一个n*1的列向量,也可以进行加减运算,即将列向量B加到矩阵A对应的列上。

3.矩阵乘法
C=A*B

4.矩阵除法(注意左除与右除符号的异同

矩阵左除:求解线性方程组AX=B

MATLAB解法:X=A\B

若A为非奇异方阵,X=A^{-1}B;如果A不可逆,得到的是方程的最小二乘解。最小二乘解的含义是,使得表达式\left | AX-B \right |最小所对应的X矩阵。

矩阵右除:求解线性方程组XA=B

MATLAB解法:X=B/A

即,若A为非奇异方阵,X=BA^{-1}

5.矩阵翻转

左右翻转,B=fliplr(A)

上下翻转,B=flipud(A)

旋转90°,D=rot90(A)       注意:这里是逆时针旋转。

旋转180°,D=rot90(A,2)

6.矩阵乘方

即矩阵A的x次幂,数学表达式为:F=a^{x}

MATLAB命令:F=a^x

这里,A为方阵,x为实数或者复数。

7.点运算

矩阵对应元素的直接计算。

C=A.*B

 四,矩阵的其他运算

1.矩阵的逻辑运算

逻辑变量:非0元素表示逻辑1,0元素表示逻辑0.

逻辑运算

与运算    A&B

或运算    A|B

非运算    B=~A

异或运算    xor(A,B)

Eg:find语句的应用。

A=[1,2,3;4,5,6;7,8,0];
i=find(A>=5)'       %%原本会以列的形式输出,加了单引号后会以行的形式输出

i中输出的结果是A矩阵中满足大于等于5元素的序号。矩阵中元素的序号是按列表示的,结果中的

i =

     3     5     6     8

表示矩阵按列排序所得的第三个第五个第六个第八个元素。

如果不喜欢单序号,也可以用双序号表示,即

A=[1,2,3;4,5,6;7,8,0];
[i,j]=find(A>=5)

输出结果如下所示,i表示行号,j表示列号。

2.解析结果的简化与变换

如果有一个符号表达式,可以调用simplify()进行一个自动的化简。

numden() ——把符号表达式的分子分母提取出来。

collect() ——做合并同类项处理。

expand() ——做展开处理。

factor() ——做因式分解。

Eg:多项式处理。

化简多项式P(s)=(s+3)^2(s^2+3s+2)(s^3+12s^2+48s+64)

syms s;
P=(s+3)^2*(s^2+3*s+2)*(s^3+12*s^2+48*s+64);
P1=simplify(P)

多项式因式分解与展开

P3=factor(P)
P4=prod(P3)

3.变量替换

将符号表达式中的x1,替换为x1*:

f1=subs(f,x1,x1*)

将符号表达式中的若干个变量同时进行替换:

f1=subs(f,{x1,x2,...,xn},{x1*,x2*,...,xn*})

Eg:对P(s)=(s+3)^2(s^2+3s+2)(s^3+12s^2+48s+64)做双线性变换。

双线性变换,即用z替换s,s=(z-1)/(z+1)。

syms s z;        %%定义符号变量s和z
P=(s+3)^2*(s^2+3*s+2)*(s^3+12*s^2+48*s+64);
P1=simplify(subs(P,s,(z-1)/(z+1)))
latex(P1)        %%P1表达式的Latex表示

4.常用计算函数

floor()    向下取整

ceil()    向上取整

round()    四舍五入取整

fix()    往0方向取整

k=gcd(n,m)    求最大公约数

k=gcd(n,m)    求最小公倍数

[n,d]=rat(x)    实现表达式的有理化,将分子分母提取出来

Eg:Hilbert矩阵

Hilbert矩阵可以由hilb()定义,试对一个3*3Hilbert矩阵其进行有理数变换。

h_{i,j}=\frac{1}{i+j-1}

A=hilb(3)        %%生成3*3Hilbert矩阵
[n,d]=rat(A)       %% n是分子矩阵,d是分母矩阵

 

Eg:全排列计算

假设5个人照集体照,共有多少种排列方式?

Matlab的perms()函数可以计算全排列,并穷举出所有排列形式。

P=perms(1:5)      %%生成5个人的编号1-5,并进行排序
size(P)     

调用size看出,P是一个120*5的矩阵。所有不难得出,一共有120种排列方式。

同样,也可以将5个人用ABCDE表示,对字母进行排序。

P=perms('ABCDE')      %%这里一定要用单引号,表示里面是字符
size(P) 

注:一定不要漏了单引号。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值