概述
专栏目录
simucpp:C++搭建微分方程求解器框架(重写simulink)
simucpp系列教程(1)安装教程
simucpp系列教程(2)例程解析(第一部分)
simucpp系列教程(3)例程解析(第二部分)
simucpp系列教程(4)使用教程与程序说明
simucpp系列教程(5)各模块的简要介绍
simucpp系列教程(6)函数文档
文章目录
- 专栏目录
- 单元模块分类
- 单元模块介绍
- 矩阵模块介绍
- 组合模块介绍
模块的命名方式为,单元模块以大写字母
U
开头,矩阵模块以大写字母
M
开头,复用/解复用模块除外。
单元模块分类
下表是一些模块所具有的特殊特点,有很多模块具有下面的多个特点,下面按特点介绍。
端点模块 | INTEGRATOR | OUTPUT | UNITDELAY | |
包含离散状态的模块 | INPUT | NOISE | OUTPUT | ZOH |
包含自定义函数的模块 | FCN | FCNMISO | INPUT | |
多输入单输出模块 | FCNMISO | PRODUCT | SUM | |
包含输入增益的模块 | OUTPUT | PRODUCT | SUM | |
信号源模块 | CONSTANT | INPUT | NOISE |
端点模块
放在环路中不会引起代数环的模块。详见 模块次序表、代数环及其检测算法。
包含离散状态的模块
可以通过Set_SampleTime()
设置采样(更新)周期的模块,每个周期的结束更新一次输出值,在
t
∈
[
n
T
,
(
n
+
1
)
T
)
tin[nT,(n+1)T)
t∈[nT,(n+1)T)的时间段内输出值为
x
(
n
)
x(n)
x(n)保持不变。以仿真步长
h
=
0.01
h=0.01
h=0.01和采样周期
T
=
1
T=1
T=1为例,在
t
=
0
t=0
t=0到
t
=
0.99
t=0.99
t=0.99的100个采样点输出
x
(
0
)
x(0)
x(0),
t
=
1.00
t=1.00
t=1.00到
t
=
1.99
t=1.99
t=1.99的100个采样点输出
x
(
1
)
x(1)
x(1),以此类推。
包含自定义函数的模块
自定义的函数有两种,FCNMISO使用多输入单输出的函数,FCN和INPUT使用单输入单输出的函数。
有两种方法自定义函数,一种是使用lambda表达式(匿名函数),另一种是重写UserFunc
类。
多输入单输出模块
这些模块的不同之处在于,其它模块每次调用connect()
函数设置的输入模块(孩子模块)会覆盖之前的设置,而这些模块每次调用connect()
函数都会新添加一个输入模块。目前还没发现有需要覆盖设置的需求,因此多输入单输出模块暂时不能覆盖设置。
包含输入增益的模块
可以通过Set_InputGain()
函数设置输入增益的模块。PRODUCT和SUM模块的这个函数有两个参数,第一个是输入增益,第二个是该输入增益对应设置于哪个输入端口,默认或者"-1"表示设置最新添加的端口。
信号源模块
没有输入端口,connect()
函数为空。
单元模块介绍
单元模块的共性在上一节中已经介绍,这一节介绍每个单元模块独有的特点。
常数模块 CONSTANT
可用输入模块代替,为方便使用而引入。输出常数。默认输出1。
自定义单入单出模块 FCN
默认将输入值输出。
自定义多入单出模块 FCNMISO
默认将第一个输入值输出。
放大器 GAIN
默认增益为1。
输入模块 INPUT
有两种输入模式,连续信号输入和离散信号输入。连续信号输入就是通过Set_Function()
设置一个以时间自变量的自定义函数;离散信号输入就是从一个vector数组中读取数据,然后以给定的采样周期输出该数据。
连续模式下默认输出1,离散模式下如果没有提供数据默认输出0,如果仿真时间内提供的数据不够的话将持续输出最后一个值。
积分器 INTEGRATOR
噪声模块 NOISE
可用输入模块代替,为方便使用而引入。输出高斯白噪声。可指定采样周期。输出默认均值为0方差为1的标准正态分布。默认采样周期
−
1
-1
−1,即每个仿真步长都输出新的采样点。
输出模块 OUTPUT
乘法器 PRODUCT
加法器 SUM
传输延迟模块 TRANSPORTDELAY
默认缓存一个采样点,缓存值默认0,默认输出0。由于仿真的离散性质,通过Set_DelayTime()
函数设置的延迟时间会根据仿真步长计算出四舍五入应该缓存的采样点数。
单位延迟模块 UNITDELAY
用于构建离散传递函数。
零阶保持器 ZOH
图中模块int1的输入是一个离散的控制器,但从图中的情况可以看出,如果输入模块in1的输出连续,则int1的输入也连续,不符合要求,此时就应该在in1的输出串接ZOH模块。int1的输入前串接也可。
矩阵模块介绍
多路复用器 ZOH
用于将多个单线信号转换成一个总线信号,即输入为多个单元模块。输出为一个矩阵模块。
多路解复用器 ZOH
用于将一个总线信号分解成多个单线信号,即输入为一个矩阵模块。输出为多个单元模块。
组合模块介绍
下面的模块要大量用到std::vector<double>
数据类型,而且在变量定义的时候也有点长,因此出于方便的考虑而添加自定义数据类型vecdble
typedef std::vector<double> vecdble;
在此特别说明以防使用时出现困惑。
连续传递函数
原型
TransferFcn(Simulator *sim,
const std::vector<double> numerator,
const std::vector<double> denominator,
std::string name="tf");
以下示例表示
G
(
s
)
=
0.1
s
+
1.5
10
s
2
+
s
+
1
G(s)=frac{0.1s+1.5}{10s^2+s+1}
G(s)=10s2+s+10.1s+1.5
TransferFcn* mdGs = new TransferFcn(&sim1, vector<double>{0.1, 1.5}, vector<double>{10, 2, 0});
内部结构为可控标准型,结构图如下
模块的Set_InitialValue()
函数的输入和Get_OutValue()
的输出参数均为std::vector<double>
类型,分别设置上图中从左到右积分器组的初始值和获得积分器组的当前输出值。
离散传递函数
原型
DiscreteTransferFcn(Simulator *sim,
const std::vector<double> numerator,
const std::vector<double> denominator,
std::string name="dtf");
以下示例表示
D
(
z
)
=
6.64
−
6.008
z
−
1
1
−
0.3679
z
−
1
D(z)=frac{6.64-6.008z^{-1}}{1-0.3679z^{-1}}
D(z)=1−0.3679z−16.64−6.008z−1
DiscreteTransferFcn* mdDz = new DiscreteTransferFcn(&sim1, vector<double>{6.64, -6.008}, vector<double>{0.3679});
对于下面的一般形式
D
(
z
)
=
b
0
+
b
1
z
−
1
+
b
2
z
−
2
1
−
a
1
z
−
1
−
a
2
z
−
2
D(z)=frac{b_0+b_1z^{-1}+b_2z^{-2}}{1-a_1z^{-1}-a_2z^{-2}}
D(z)=1−a1z−1−a2z−2b0+b1z−1+b2z−2
对应simulink中的结构图如下
参数numerator
写作
vector<double>{b0, b1, b2};
参数denominator
写作
vector<double>{a1, a2};
由于离散传递函数的特殊结构,使用时要注意一下正负号,遵循奥本海姆《离散时间信号处理》第三版中的约定,对应直接Ⅱ型IIR结构。模块的Set_InitialValue()
函数的输入和Get_OutValue()
的输出参数均为std::vector<double>
类型,分别设置上图中从上到下延迟器组的初始值和获得延迟器组的当前输出值。
求和器
积分器的简单离散化。结构如图所示。
状态空间传递函数
使用状态空间建立模型。
原型
StateSpace(Simulator *sim, const zhnmat::Mat& A, const zhnmat::Mat& B,
const zhnmat::Mat& C, const zhnmat::Mat& D, bool isc=true, std::string name="sts");
最后
以上就是畅快奇迹为你收集整理的simucpp系列教程(5)各模块的简要介绍专栏目录单元模块分类单元模块介绍矩阵模块介绍组合模块介绍的全部内容,希望文章能够帮你解决simucpp系列教程(5)各模块的简要介绍专栏目录单元模块分类单元模块介绍矩阵模块介绍组合模块介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复