基于Python的开源动态系统仿真软件DiaBloS

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

基于Python的开源动态系统仿真软件DiaBloS

来源:《动态系统框图模型处理算法与开源可视化仿真工具》: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:链路的集合(边,单向传递数据,无延迟/缓冲);
  • 关键约束(确保可计算):
    1. 无未连接的输入端口(A1);
    2. 单个输入端口仅连接一个输出端口(A2);
    3. 所有n阶块需定义初始条件(A3);
    4. 循环图中必须含至少一个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生成的执行层级,重复计算块,直到仿真结束(如达到时间上限)。

核心步骤

  1. 初始化:n阶块用前一次的输出更新初始条件,传递数据;
  2. 按层级H₀→Hₕₘₐₓ遍历块,用κ验证可计算性(若不可计算则报错);
  3. 计算块并传递数据:
    • Source/Z_Process:直接传递输出;
    • N_Process:更新初始条件(供下一次迭代);
    • Terminal:存储/可视化数据;
  4. 重复上述步骤,直到仿真终止。

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)。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值