公司动态

SimuPy离散时间系统指南:采样数据仿真与零阶保持变换全解析

📅 2026/8/24 11:08:10
SimuPy离散时间系统指南:采样数据仿真与零阶保持变换全解析
SimuPy离散时间系统指南采样数据仿真与零阶保持变换全解析【免费下载链接】simupyA framework for modeling and simulating dynamical systems项目地址: https://gitcode.com/gh_mirrors/si/simupySimuPy 是开源的动力学系统仿真框架本指南面向新手完整讲解如何用 SimuPy 建模离散时间系统、进行采样数据仿真并通过零阶保持Zero-Order Hold变换把连续时间模型精确离散化。全程只需一个采样参数dt和几行矩阵运算无需任何 Simulink 环境。为什么需要离散时间仿真真实世界的物理过程是连续的但数字控制器单片机、FPGA、软件 PLC只能在固定时刻采样输入、更新输出。因此控制系统设计有两条必须走通的路场景需要的模型物理对象 / 数学推导连续时间模型dx/dt Ax Bu数字控制器 / 嵌入式实现离散时间模型x[k1] Ad·x[k] Bd·u[k]SimuPy 的 DynamicalSystem 基类用同一个接口同时支持这两类系统状态方程函数对连续系统解释为导数对离散系统解释为状态更新方程x[k1]。关键区分点就是采样率参数dtdt 0默认→ 连续时间系统dt 0→ 离散时间系统每经过一个采样周期更新一次状态。第一步建立连续时间 LTI 系统以常见的二阶双积分器弹簧-阻尼-质量为例使用LTISystem传入 A、B、C 矩阵即可完整可运行版本见 examples/discrete_lti.pyimport numpy as np from scipy import signal, linalg from simupy.systems import LTISystem m, d, b, k 1.0, 1.0, 1.0, 1.0 Ac np.c_[[0, -k/m], [1, -b/m]] Bc np.r_[0, d/m].reshape(-1, 1) Cc np.eye(2) ct_sys LTISystem(Ac, Bc, Cc) ct_sys.initial_condition [1, 0]第二步零阶保持变换精确离散化零阶保持假设两个采样时刻之间输入u保持为常数。对这个假设下的线性时不变LTI系统scipy.signal.cont2discrete给出的离散等效矩阵Ad、Bd 是精确的——在每个采样时刻t kT离散系统与连续系统的状态完全一致不存在近似误差。变换只需一行示例代码 examples/discrete_lti.pydT 1 / (2 * np.max(np.abs(np.linalg.eigvals(Ac)))) # 采样周期 Ad, Bd, Cd, Dd, dT signal.cont2discrete((Ac, Bc, Cc, Dc), dT) dt_sys LTISystem(Ad, Bd, Cd, dtdT) # dt 参数声明这是离散系统 dt_sys.initial_condition [1, 0]采样周期怎么选上式的启发式规则是dT 1/(2·|最大特征值|)特征值越大系统动态越快所需采样频率越高。实际工程中还会结合奈奎斯特采样定理采样频率 ≥ 2 倍信号最高频率适当留裕量。dt 参数揭秘SimuPy 如何模拟采样很多人好奇SimuPy 的求解器是面向连续时间初值问题的默认dopri5它怎么跑离散系统答案在 simupy/systems/init.py 的dt属性中当dt 0时SimuPy 自动把系统转换为事件驱动形式——构造一个周期性事件方程sin(πt / dt)在每个采样时刻过零触发事件平时状态导数恒为 0状态冻结事件触发时由update_equation_function调用真实的状态更新方程一次性推进到下一采样时刻无状态的离散环节如离散控制器则采用保持上一次输出的零阶保持语义。也就是说离散时间仿真在 SimuPy 内部是通过不连续性事件机制精确复现采样行为的这正是它能与连续环节、反馈闭环无缝联仿的原因。闭环反馈离散控制器与离散系统联仿离散化后的系统可以直接和离散控制器组成闭环用BlockDiagram连接并调用simulate仿真见 examples/discrete_lti.pyfrom simupy.block_diagram import BlockDiagram Kd np.linalg.solve(Bd.T Sd Bd R, Bd.T Sd Ad) # 离散 LQR 增益 dt_ctr LTISystem(-Kd, dtdT) # 无状态离散控制器 dtdt_bd BlockDiagram(dt_sys, dt_ctr) dtdt_bd.connect(dt_sys, dt_ctr) # 状态反馈给控制器 dtdt_bd.connect(dt_ctr, dt_sys) # 控制量回到系统 res dtdt_bd.simulate(Tsim) # res.t / res.x / res.y 存放结果simulate返回的SimulationResult带有t、x、y数组属性第一维索引时刻第二维索引各信号分量可直接喂给 matplotlib 绘图。示例脚本还会把连续系统 离散控制器与全离散等效系统的仿真结果画在同一张图上直观验证零阶保持变换的精确性。核心概念速查表概念SimuPy 对应说明采样周期LTISystem(..., dtT)dt0为连续系统dt0为离散系统零阶保持变换scipy.signal.cont2discreteLTI 系统下精确离散化离散状态更新state_equation_function解释为x[k1] f(t, x, u)初始状态initial_condition默认全零闭环联仿BlockDiagram支持连续/离散环节混接快速上手pip install simupy要求 Python ≥ 3.6、NumPy ≥ 1.11、SciPy ≥ 0.18更多接口细节可参考 docs/api/systems.rst 与 docs/api/block_diagram.rst。 掌握本文三个关键点——dt参数声明离散系统、cont2discrete零阶保持变换、BlockDiagram 闭环联仿——你就已经具备了用 SimuPy 完成采样数据控制系统仿真的全部基础下一步可以打开 examples/discrete_lti.py 动手改参数、换模型感受离散等效的精确性。【免费下载链接】simupyA framework for modeling and simulating dynamical systems项目地址: https://gitcode.com/gh_mirrors/si/simupy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考