基于Python的开源动态系统仿真软件DiaBloS
Outline
来源:《动态系统框图模型处理算法与开源可视化仿真工具》:Torres-Torriti, M., & Rojas-Sepulveda, M. (2025). An algorithm for processing block diagram models of dynamical systems and an open-source visual-programming simulation tool. Simulation Modelling Practice and Theory, 138, 103030.
这是2025年的一篇文章,以下内容部分参考该文献形成。


一、简介
DiaBloS(Diagrams of Blocks Simulation)是基于 Python 开发的开源可视化框图建模与动态系统仿真工具,由 Miguel Torres-Torriti 与 Matias Rojas-Sepulveda 团队设计实现,核心目标是填补现有技术空白——即 Python 生态中缺乏“可视化框图交互+多图(含循环图)处理能力”的开源仿真工具,可以通过Github获取,该软件采用MIT开源协议,较JMCAD更宽松。
| 项目 | 内容 |
|---|---|
| 开发基础 | Python语言,依赖NumPy(数值计算)、PyGame(图形界面),无其他复杂依赖 |
| 授权协议 | MIT协议(开源免费,可修改、商用) |
| 核心功能 | 1. 拖拽式可视化框图编辑; 2. 支持4类块与自定义函数;3. 集成RK45/Euler等积分方法;4. 仿真结果实时绘图(QtGraphics) |
| 易用性 | 内置多种模块,界面含块库(左侧)、画布(右侧)、参数编辑(右键) |

1.1 开发背景
现有动态系统仿真工具存在两大局限:
- 商业工具封闭性:工业标准工具(如 MathWorks® Simulink®、National Instruments® LabView®)采用专有算法,未公开框图处理的数学逻辑与实现细节,且成本较高;
- Python 工具缺口:Python 生态中,现有框图相关库(如 BDSim、SimuPy)需手动将手绘框图转化为文本代码,而 OMPython、PySimulator 等依赖外部 Modelica 工具(如 OMEdit)实现可视化,无法直接在 Python 中完成框图开发与自定义块设计。
DiaBloS 正是为解决上述问题而生,既提供可视化交互界面,又通过论文提出的算法支持复杂多图(含向循环图)的高效处理。
1.2 核心定位
- 双重角色:既是独立的“动态系统仿真工具”(支持拖拽式框图创建与仿真),也是可嵌入其他项目的“开源库”(提供框图处理算法接口,支持二次开发);
- 目标场景:覆盖控制系统、电气工程、计算机科学等领域的动态系统建模,尤其适合教学(直观演示复杂系统逻辑)与科研(透明化算法流程、可复现仿真结果)。
二、核心算法解析
要理解算法与工具,需先明确“块”和“框图”的严格定义,这是后续处理的基础。
2.1 块(Block)的分类与特征
块是框图的基本单元,按功能分为4类,核心差异在于是否有输入/输出端口、是否含内部状态(记忆)。
| 块类型 | 核心特征 | 典型示例 | 关键作用 |
|---|---|---|---|
| 源块(Source) | 无输入端口,生成数据;无内部状态依赖(或默认初始时间) | 正弦信号发生器、阶跃信号 | 提供系统输入信号 |
| 零阶处理块(Z_Process) | 有输入/输出端口,无内部状态;仅做代数运算(无积分/延迟) | 加法器、增益块、平方根运算 | 实时处理输入数据,无记忆性 |
| n阶处理块(N_Process) | 有输入/输出端口,含内部状态;需初始条件,支持积分/延迟(处理动态过程) | 积分器、微分器 | 建模系统动态特性(如状态变化) |
| 终端块(Terminal) | 无输出端口,接收数据;无内部状态(或仅存储数据) | 示波器、数据文件记录 | 输出结果可视化或存储 |
2.2 框图(Block Diagram)的定义
框图是多图结构(D=(B,L)),其中:
- B:块的集合(节点);
- L:链路的集合(边,单向传递数据,无延迟/缓冲);
- 关键约束(确保可计算):
- 无未连接的输入端口(A1);
- 单个输入端口仅连接一个输出端口(A2);
- 所有n阶块需定义初始条件(A3);
- 循环图中必须含至少一个n阶块(避免代数环,A4)。
2.3 初始框图处理算法(Algorithm 1):生成执行层级
目的:将无序的块按“数据可用性”排序,生成可计算的执行层级(H₀,H₁,…,Hₕₘₐₓ),即使含循环图也能处理。
算法流程(可视化示意):

flowchart TD
A[初始化:h=0,H₀=∅,B=所有块] --> B[处理源块与n阶块]
B --> C1[遍历块:若为Source,计算输出→传递数据→加入H₀→从B移除]
B --> C2[遍历块:若为N_Process,用初始条件生成输出→传递数据→保留在B]
C1 & C2 --> D[将H0加入H]
D --> E[循环:直到B为空]
E --> F[h=h+1,Hₕ=∅] --> G1[遍历B中剩余块]
G1 -- B未遍历完 --> G[用κ判断块是否可计算?]
G1 -- B已遍历完 --> K[H=H∪Hₕ]
G -- 是 --> H[计算块→加入Hₕ→从B移除]
H --> I[若为Z_Process:传递输出数据;若为N_Process:更新初始条件] --> G1
G -- 否 --> J[跳过,检查下一个块] -->G1
K --> E
E -- B为空 --> L["返回执行层级H={H₀,H₁,...,Hₕₘₐₓ}"]
以上图中k指判断块是否可计算的方法,一个块B可计算当且仅当B的所有输入端口都有有效数据值,且内部状态满足计算条件(如积分器的初始值)。注意:须知此处算法与JMCAD其实有异曲同工之妙,但是由于分级计算所以不用每次都递归
以上算法是序贯法求解的关键,理解之后后面两个算法水到渠成。
2.4 排序后框图处理循环算法(Algorithm 2):迭代仿真
目的:基于Algorithm 1生成的执行层级,重复计算块,直到仿真结束(如达到时间上限)。
核心步骤:
- 初始化:n阶块用前一次的输出更新初始条件,传递数据;
- 按层级H₀→Hₕₘₐₓ遍历块,用κ验证可计算性(若不可计算则报错);
- 计算块并传递数据:
- Source/Z_Process:直接传递输出;
- N_Process:更新初始条件(供下一次迭代);
- Terminal:存储/可视化数据;
- 重复上述步骤,直到仿真终止。
2.5 RK45积分算法(Algorithm 3):处理动态系统
目的:为含积分器(n阶块)的框图提供高精度数值积分,支持常微分方程(ODE)求解。
核心逻辑:通过4次中间函数评估(k₁~k₄)计算积分步长T内的输出,公式如下:
y
n
+
1
=
y
n
+
1
6
(
k
1
+
2
k
2
+
2
k
3
+
k
4
)
T
y_{n+1} = y_n + \frac{1}{6}(k_1 + 2k_2 + 2k_3 + k_4)T
yn+1=yn+61(k1+2k2+2k3+k4)T
其中k₁~k₄分别对应T、T/2、T/2、T时刻的函数值(需调用Algorithm 2评估框图)。
优势:固定步长,数值误差为O(T⁵),与Matlab的ode45精度一致(论文图12显示:谐波振荡器仿真误差<1e-9)。
199

被折叠的 条评论
为什么被折叠?



