MATLAB R2012a 完全自学一本通

第3章 数组与矩阵

矩阵是特殊的数组

3.1 数组运算

3.1.1 数组的创建与操作

MATLAB面向对象,

  1. 创建空数组、行向量、列向量
1
2
3
4
5
6
clear all   % 清除工作区数据
A = [] % 创建空数组
B = [6 5 4 3 2 1] % 创建行向量,空格
C = [6,5,4,3,2,1] % 创建行向量,逗号和空格作用效果一致
D = [6;5;4;3;2;1] % 创建列向量,分号
E = B' % 向量转置,撇号
  1. 访问数组
1
2
3
4
5
6
7
clear all
A = [6 5 4 3 2 1]
a1 = A(1) % 访问数组A中第一个元素
a2 = A(1:3) % 访问数组A中第1,2,3个元素
a3 = A(3:end) % 访问数组A中第3个到最后一个元素
a4 = A(end:-1:1) % 反序访问数组A中的元素,注意反序访问必须加-1
a5 = A([1 6]) % 访问数组A中第1及第6个元素
  1. 子数组的赋值(Assign)
1
2
3
4
clear all
A = [6 5 4 3 2 1]
A(3) = 0
A([1 4]) = [1 1]
  1. 冒号创建一维数组
1
2
3
4
5
clear all
A = 2:6
B = 2.1:1.5:6
C = 2.1:-1.5:-6
D = 2.1:-1.5:6 % 无法生成数组
  1. logspace创建一维数组
1
2
3
4
clear all
format short; % 默认格式,小数点后保留4位。
A = logspace(1,2,20)
A = logspace(1,2,10)
  1. linspace创建一维数组
1
2
3
4
5
clear all
format short;
A = linspace(1,100)
A = linspace(1,36,12)
C = linspace(1,36,2) % 当元素个数不足2,返回后一个数

3.1.2 数组的常见运算

3.2 矩阵操作

3.2.1 创建矩阵

3.2.2 改变矩阵大小

3.2.3 重构矩阵

3.3 矩阵元素的运算

3.3.1 矩阵的加减运算

3.3.2 矩阵的乘法运算

3.3.3 矩阵的除法运算

3.3.4 矩阵的幂运算

3.3.5 矩阵的元素查找

3.3.6 矩阵的元素排序

3.3.7 矩阵元素的求和

3.3.8 矩阵元素的求积

3.3.9 矩阵元素的差分

3.4 矩阵运算

3.4.1 矩阵分析

3.4.2 矩阵分解

3.4.3 特征值和特征向量

3.5 稀疏矩阵

3.5.1 稀疏矩阵的存储方式

3.5.2 稀疏矩阵的生成

3.5.3 稀疏矩阵的运算

第14章 Simulink仿真基础

Simulink:动态系统建模、仿真和综合分析的集成环境。

一、基本概念 1、模块 标准模块 模块框图 定制模块——S函数,可由子系统封装得到,也可由M文件或C语言实现。

2、信号 模块的输出值:可自定义数据类型、数值类型(C or R)、维数。

3、求解器 微分方程数值解法

4、子系统 分层建模的思想。

5、零点穿越 系统状态突变:自动调整仿真步长,仿真时间增加;固定调整步长,无法真实反映系统特性;零点穿越检测方法。

二、Simulink的主要优点: 适应面广:线性/非线性;离散/连续/混合;单任务/多任务离散事件系统 结构和流程清晰:方块图形式,分层结构。 仿真更为精细: 模型内码更容易向DSP、FPGA等硬件移植。

simulink建立模型的特点: 仿真结果的可视化; 模型的层次性; 可封装子系统。

三、模块的组成 1、应用工具 Matlab的应用工具箱也可以在simulink中使用。 2、实时工作室real-time workshop 仿真框图→C语言代码。 3、状态流模块stateflow 可设计基于状态变化的离散事件系统。 4、扩展的模块集 mathwork公司提供的blockset→扩展simulink建模和仿真的能力。

四、数据类型

决定数据表示的精度、动态范围、性能和存储资源。 默认double类型,双精度浮点类型。

输入/输出信号的数据类型 模块参数的数据类型 模块输出=f(模块输入,模块参数),simulink在仿真时自动将模块参数的数据类型转换为模块信号的数据类型,如不能转换则报错。 两个模块的数据类型不同,则需要采用DataTypeConversion模块解决类型冲突。

simulink默认实数,constant模块可设置成复数形式。

五、simulink模块和模块库 选择合适的模块进行求解。

六、常用工具 1、仿真加速器 Real-time workshop将模型方框图转化为C语言代码,然后编译器编译成可执行代码,替代了Matlab解释器,仿真速度提高2-6倍。 2、模型比较工具model differencing tool 比较两个相同模型之间的不同版本

3、仿真统计表Simulation profiler 可视化模型仿真速度

七、模型创建 模块、直线、信号标签

八、模型和模型文件 模型的含义:方框图;.mdl的ASCII文件;物理系统;

simulink:信源source→system→信宿sink

对.mdl模型文件的创建、编辑、修改、保存。

九、模型创建的基本步骤和技巧

草图→新建(保存)→搭建(封装)→参数设置→运行(是否报错)→调试(结果是否合理)

十、过零检测和代数环 过零检测使得simulink可以精确地仿真不连续点而不必通过减小仿真步长增加仿真点来实现,因此仿真速度不会受太大影响。

代数环: 2-x=x就是一个代数环,但是大多数情况下

输出中的一部分反馈到输入,或者说输入直接决定于输出,这是反馈回路的共同特点。代数环是一种特殊的反馈回路,它的特殊之处就在于除了输入直接决定于输出外,输出还直接决定于输入,在这里“直接”二字很重要,它体现了代数环的实质,仿真计算中的“死锁”就是由此产生的。

代数环是一种反馈回路,但并非所有的反馈回路都是代数环。代数环存在的充分必要条件是:存在一个闭合路径,该闭合路径中的每一个模块都是直通模块。所谓直通指的是模块输入中的一部分直接到达输出。SimuLink的模块库中提供的很多模块都是直通模块。

代数环对应于一定的数学模型的形式(即隐函数的形式),如果能够将原始的数学模型进行等价变换得到显函数形式,则按显函数实现仿真模型就可以消除代数环。

Simulink提供了一些专门手段来拆解代数环,例如代数约束模块(Algebraic Constraint),积分模块(以及离散积分模块)的状态输出端等。这些手段可以解决一些特定的代数环问题。

操作笔记:

第15章 simulink仿真应用

子系统 模型分析 运行仿真 模型调试 S函数

一、子系统的创建和封装 分层设计思想→封装,使整个模型结构清晰、显示简单,是面向对象设计思想的一种体现。

一般子系统 封装子系统 条件子系统:使能模块/触发模块,位能子系统/触发子系统/触发使能子系统。

创建子系统:通过模块创建;组合模块。 封装子系统:模块中的参数可通过一个参数对话框便可完成设置,有独立的封装工作空间。

创建模型库

二、仿真模型的分析 目的:提高系统模型的仿真质量(速度和精度) 分析点:模型状态、代数环、微分方程求解器、积分步长、容许误差。

1、模型状态的确定 [sys,x0,str,ts] = model([],[],[],'size');

2、线性化的数学描述 在非线性系统的工作点附近进行线性化近似。

3、平衡点的分析 动态系统的稳定状态点:满足用户自定义的输入/输出和状态条件的点。

4、微分方程的求解算法 simulink求解微分方程的方法:龙格-库塔法、阿达姆斯法、Gear法、Euler法、Linsim法等

Rigid System: 在用微分方程描述的一个变化过程中,若往往又包含着多个相互作用但变化速度相差十分悬殊的子过程,这样一类过程就认为具有“刚性”。描述这类过程的微分方程初值问题称为“刚性问题”。例如,宇航飞行器自动控制系统一般包含两个相互作用但效应速度相差十分悬殊的子系统,一个是控制飞行器质心运动的系统,质心运动惯性较大,因而相对来说变化缓慢;另一个是控制飞行器运动姿态的系统,由于惯性小,相对来说变化很快,因而整个系统就是一个刚性系统。

三、运行仿真 启动仿真:1、菜单方式,模型窗口中启动;2、命令行方式。

四、模型调试

五、S函数的编写

花时间学习一下scope的相关设置

了解simulink中sample time的含义

正态分布X~(期望,方差)

.m .mlx

.mdl .slx slx文件是二进制格式文件,mdl文件是文本格式文件,早期Simulink的模型文件为mdl格式,slx格式在Matlab/Simulink R2012a版本中引入,旨在取代以前的.mdl格式,由于slx被压缩,通常文件大小会比相同的mdl文件小。

注意模型文件(*.mdl)的bai名字和M文件的名字不要相同

否则你的Matlab Fcn模块其实调用的是mdl文件(mdl比m的优先级高) 

from workspace调用数据的用法。

Matlab写程序的文件。 MATLAB是解释型语言,就是说MATLAB命令行中敲入的命令在当前MATLAB进程 中被解释运行。但是,每次执行一个任务时敲入长长的命令序列是很烦人的。有两种方法可以使MATLAB的力量得到扩展——脚本和函数。这两种方法都用像emacs一样的文本编辑器中编写的m文件(因为扩展名是.m所以这样命名,m文件还称点m文件)。m文件的好处在于它可以保存命令,还可以轻易地修改命令而无需重新敲入整个命令行。 mat数据格式是matlab的数据存储的标准格式。 你可以调用matlab的子程序库,用c或fortan调用mat格式的数据。 函数名: matopen 打开mat文件 matclose 关闭mat文件 magetfp 取得mat文件的c语言句柄 matGetArray 取得一个数组

MATLAB2018 从入门到精通——林炳强

第5章 数据可视化

数学公式和数据→图表

5.1.1 离散数据及离散函数 MATLAB是无法实现对无限区间上的数据的可视化的。

1
2
3
4
5
6
7
8
X1 =[1 2 4 6 7 8 10 11 12 14 16 17 18 201;
Y1 =[1 2 46 7 8 10 10 8 7 6 421]; %生成两个一维实数数组
figure(1)
plot(X1,Y1,'o','MarkerSize',15)
X2 = 1:20;
Y2 = 1og(X2); %根据1og函数生成两个一维实数数组
figure(2)
plot(X2,Y2,'o','MarkerSize',15)
5.1.2 连续函数

在MATLAB中是无法画出真正的连续函数的,将连续函数用在一组离散自变量上计算函数结 果,然后将自变量数组和结果数组在图形中表示出来。

第8章

simulink交互仿真集成环境

simulink运行方法及窗口 simulink常用模块库 continous discontinuous discrete math operations sinks sources

simulink功能模块处理 simulink模块参数设置 simulink模块间连线处理 simulink模块基本操作 复制:右键拖动 移动 删除 旋转:Ctrl+R 重命名 模块插入

simulink建模仿真实例

设置仿真参数:
solver
    起始时间和终止时间,simulation time:start time,stop time
    solver selection:变步长解法,指定relative tolerance或absolute tolerance,使得当误差超过误差限时自动修正仿真步长,max step size默认auto,max step size=(stop time-start time)/50
解算器:
    离散模型:对变步长和定步长解法均采用discrete(no continuous state)
    连续模型:可采用变步长和定步长解法。
    
    变步长解法有:ode45、ode23、odel13、ode15s、ode23s、ode23t、ode23st
    ode45:四阶/五阶龙格-库塔算法,属单步解法。
    ode23:二阶/三阶龙格-库塔算法,属单步解法。
    ode113:可变阶次的Adams-Bashforth-Moulton PECE算法,属于多步解法。
    ode15s:可变阶次的数值微分公式算法,属于多步解法。
    ode23s:基于修正的Rosenbrock公式,属单步解法。
    
    定步长解法有:ode4、ode5、ode3、ode2、odel
    ode5:定步长的ode45解法。
    ode4:四阶龙格一库塔算法。
    ode3:定步长ode23算法。
    ode2:Henu方法,即改进的欧拉法。
    ode1:欧拉法。

备注:可改变仿真时间,若报错可修改最大步长;同时若曲线比较粗糙,可修改refine factor参数。

子系统模块封装技术 子系统设计方法(建立子系统):自下而上、自上而下。 封装模块:封装子系统模块与simulink模块库中的模块地位相等。拥有自己独立的工作空间。一般先构建子系统,然后再进行封装。

条件执行子系统
    触发子系统
    使能子系统
    使能触发子系统
    

S函数:创建一个通用的定制模块 system function

C语言编写文件→Mex工具编译→Mex文件 C++语言编写文件 MATLAB语言编写文件→M文件

User-Define Functions

simulink仿真调用s函数: 初始化(初始化结构体、设置输入输出端口数、设置采样时间、分配存储空间等)→数值积分→更新离散状态→计算输出→计算下一个采样时间点→仿真结束。

M文件S函数 [sys,x0,str,ts]=f[t,x,u,flag,p1,p2,…];

仿真阶段 S函数 flag值 初始化 mdlInitializeSizes 0 计算下一个采样时间点 mdlGetTimeOfNextVarHit 4 更新离散状态 mdlUpdate 2 计算输出 mdlOutputs 3 计算微分 mdlDerivatives 1 仿真结束 mdlTerminate 9

s函数一下是s函数的介绍

函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windowsAPI等的。

先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。

在matlab的workspace里打开edit sfuntmp1(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。它的第一行是这样的:function→ [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)

先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。

下面结合sfuntmp1.m中的代码来讲具体的结构: switch flag,%判断flag,看当前处于哪个状态 case 0, [sys,x0,str,ts]=mdlInitializeSizes; flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmp1.m的149行,我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下: size=simsizes;%用于设置模块参数的结构体用simsizes来生成 sizes.NumContStates=0;%模块连续状态变量的个数 sizes.NumDiscStates=0;%模块离散状态变量的个数 sizes.NumOutputs=0;%模块输出变量的个数 sizes.NumInputs=0;%模块输入变量的个数 sizes.DirFeedthrough=1;%模块是否存在直接贯通(直接贯通我的理解是输入能%直接控制输出) sizes.NumSampleTimes=1;%模块的采样时间个数,至少是一个 sys=simsizes(sizes);%设置完后赋给sys输出

举个例子,考虑如下模型: dx/dt=fc(t, x, u)也可以用连续状态方程描述:dx/dt=Ax+Bu x(k+1)=fd(t, x, ,u)也可以用离散状态方程描述:x(k+1)=Hx(k)+Gu(k) y=fo(t, x, u)也可以用输出状态方程描述:y=Cx+Du 设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为: (一般连续状态与离散状态不会一块用,我这儿是为了方便说明) sizes.NumContStates=1; sizes.NumDiscStates=1; sizes.NumOutputs=1; sizes.NumInputs=1; 其他的可以不变。

继续在mdlImitializeSizes函数中往下看: x0=[]; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为x0=[0, 0](离散和连续的状态变量我们都设它初值为0)

str=[]:%这个就不用说了,保留参数嘛,置[]就可以了,反正没什么用,可能7.0会给它一些意义

ts=[0 0]:%采样周期设为0表示是连续系统,如果是离散系统在下面的mdlGetTimeOfNextVarHit 函数中具体介绍嘻嘻,总算讲完了初始化,后面的应该快了

在sfutmpl的106行继续往下看: case 1, sys=ndlDerivatives(t, x, u); flag=1表示此时要计算连续状态的微分,即上面提到的dx/dt=fc(t, x, u)中的dx/dt,找到mdlDerivatives函数(在193行),如果设置连续状态变量个数为0,此处只需sys=[]:就可以了(如sfuntmp1中一样),按我们上述讨论的那个模型,此处改成sys=fc(t, x(1), u)或sys=Ax(1)+Bu,我们这儿x(1)是连续状态变量,而x(2)是离散的,这儿只用到连续的,此时的输出sys就是微分继续,

在sfuntmp1的112行: case 2 sys=mdlUpdate(t, x, u); flag-2表示此时要计算下一个离散状态,即上面提到的x(k+1)=fd(t, x, u),找到mdlUpdate函数(在206行)它这儿sys=[]; 表示没有离散状态,我们这而可以改成sys=fd(t, x(2), u)或sys=Hx(2)+Gu; %sys即为x(k+1)看来后面几个一两句话就可了,呵呵,

在sfurntnp1的118行 case3, sys=ndlOutputs(t, x, u) flag-3表示此时要计算输出,即y=fo(t, x, u),找到mdlOutputs函数(在218行),如上,如果sys=[]表示没有输出,我们改成sys=fo(t, x, u)或sys=Cx+Du %sys此时为输出y好像快完了,嘻嘻,

在sfuntnp1的124行 case4, sys=mdlGetTimeOfNextVarHit(t, x, u) flag-4表示此时要计算下一次采样的时间,只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts 设置ts(1)不为0)连续系统中只需在mdlGetTimeOfNlextVarHit函数中写上sys=[];这个函数主要用于变步长的设置,具体实现大家可以在命令窗口输入edit vsfunc看vsfunc.m这个例子最后一个,

在sfurtnpl的130行 case 9, sys=ndlTerminate(t, x, u) flag-9表示此时系统要结束,一般来说写上在mdlTerminate 函数中写上sys=[]就可,如果你在结束时还要设置什么,就在此函数中写关于sfumtmpl这个s函数的模板讲完了。

s函数还可以带用户参数,下面给个例子,和simulink下的gain模块功能一样,大伙自己看吧,我睡觉去了,累了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)
switch flag,
case 0,
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0=[];
str=[];
ts=[0,0];
case 3,
sys=gain*u;
case {1,2,4,9},
sys = [];
end

做好了s函数后,simulink--user-defined function下拖一个S-Function到你的模型,就可以用了在simulink---user-defined function还有个s-Fumction Builder,他可以生成用c语言写的s函数在mat1ab的workspace下打sfundemos,可以看到很多演示s函数的程序.

function的函数名与保存文件名一致;但与simulink文件应设置不同。

就自己使用而言,推荐使用mdl格式。举个简单的例子。你的matlab是高版本的,将simulink模型保存成slx,低版本的matlab打不开。但是若保存成mdl格式,低版本的matlab也可以打开的。如有异议,可以亲测。至于mdl和slx的区别,一个是文本文件,一个是二进制文件,从理论上而言,二进制文件更好一些。因为计算机在运行的时候还是把文本文件转化成二进制文件的。运算速度会更高效,但文本文件的可读性更强,具体差别可百度。

.m .mlx

.mdl .slx

S-function name:填入S-function的函数名称(与其文件名一致),这样就建立了S-function模块与M文件形式的S-function之间的对应关系,单机后面的Edit可以打开S-function的M文件的编辑窗口。 S-function parameters:填入S-function需要输入的外部参数的名称,如果有多个变量的话,中间用逗号隔开,如a,b,c.(一般为flag后面的变量,如增益模块)。 S-function modules:只有S-function是用C语言编写并用MEX工具编译的C MEX文件时,才需要填写该参数。