
如何用SimuPy自建动力系统DynamicalSystem数值API完全手册【免费下载链接】simupyA framework for modeling and simulating dynamical systems项目地址: https://gitcode.com/gh_mirrors/si/simupySimuPy 是一个用于建模和仿真动态系统dynamical systems的 Python 开源框架。本手册带你快速上手其核心数值类DynamicalSystem只需提供几个 Python 函数就能定义连续/离散动力系统、处理不连续事件并一键调用simulate完成数值积分。无需任何控制理论背景新手也能 10 分钟跑通第一个系统仿真。为什么选择 SimuPy 的数值 API很多仿真工具要求你写 Simulink 式图块或复杂脚本而 SimuPy 的思路是用函数定义数学模型状态方程xdot(t, x, u)描述状态如何随时间演化输出方程y(t, x)描述系统对外输出事件函数处理碰撞、饱和、切换等不连续现象核心类DynamicalSystem定义在 simupy/systems/init.py它同时支持连续时间和离散时间系统——只要把xdot理解为x[k1]即可。DynamicalSystem 参数速查表构造系统时所有参数都是可选的框架会自动推断参数说明默认值state_equation_function状态导数函数有状态时必填Noneoutput_equation_function输出函数未提供时默认输出全部状态全状态输出event_equation_function事件函数零点处触发不连续Noneupdate_equation_function事件触发时的状态更新函数Nonedim_state状态维度0dim_input/dim_output输入/输出维度0num_events事件函数维度0dt采样周期0 表示离散时间系统0连续时间initial_condition初始条件向量零向量几个容易踩坑的点dim_state 0时必须提供state_equation_function否则validate()会抛错dim_output为 0 会被自动取为dim_state但完全无输出的系统会被拒绝初始条件维度必须与dim_state一致三步上手定义、仿真、读结果第一步定义系统。以二阶弹簧-阻尼系统为例状态方程是普通的 numpy 函数import numpy as np from simupy.systems import DynamicalSystem def state_eq(t, x, u0): return np.r_[x[1], u - x[1] - x[0]] # 加速度 输入 - 阻尼 - 弹簧力 sys DynamicalSystem( state_equation_functionstate_eq, dim_state2, initial_conditionnp.r_[1.0, 0.0], )第二步调用 simulate。simulate方法继承自 simupy/block_diagram.py 中的SimulationMixin默认使用scipy.integrate.ode积分器res sys.simulate(10) # 从 t0 积分到 t10tspan支持三种写法单个数字终点、两个数字起点终点变步长积分器每个步都存储、多个数字只在这些时刻存储结果。第三步读取 SimulationResult。仿真返回结果对象包含四个数组res.t时间向量res.x状态轨迹形状为(点数, dim_state)res.y输出轨迹形状为(点数, dim_output)res.e事件函数值如有事件结果还能通过res.to_file(data.npz)保存、SimulationResult.from_file(...)加载方便复用大数据量仿真结果。进阶玩法LTISystem 与离散时间用矩阵快速构建 LTI 系统如果你的系统形如dx/dt Ax Bu直接用LTISystem传矩阵即可省去写函数见 examples/discrete_lti.pyfrom simupy.systems import LTISystem A np.array([[0, 1], [-1, -1]]) B np.array([[0], [1]]) sys LTISystem(A, B) # y x 全状态输出 sys.initial_condition np.r_[1, 0] res sys.simulate(8)离散时间系统只需设置dt 0状态方程即被解释为更新方程x[k1] f(t, x, u)。例如 examples/discrete_lti.py 中用scipy.signal.cont2discrete把连续系统离散化后构建dt_sys LTISystem(Ad, Bd, Cd, dtdT) # 零阶保持离散化注意离散系统会自动挂上一个拍钟事件因此不能再与num_events 0的手动事件混用。事件驱动的不连续系统对碰撞、切换类系统DynamicalSystem提供了完整的事件 APIevent_equation_function输出过零的那一刻update_equation_function被调用并可重置状态。框架还内置了更友好的封装SwitchedSystemsimupy/systems/symbolic.py按事件变量的取值区间自动切换不同的状态/输出方程组SystemFromCallable一行代码把普通函数变成无状态系统签名(t, u)即可完整可运行的弹跳球案例见 examples/bouncing_ball.py它展示了如何用精确事件检测定位撞击时刻并更新速度状态。常见问题清单仿真结果出现 NaN说明某步积分发散调小max_step或收紧integrator_options中的rtol/atol如何指定积分器参数传integrator_options{rtol: 1e-12, atol: 1e-15}给simulate多系统如何互连用BlockDiagram(sys1, sys2)加connect()拼接成块图再整体仿真见 examples/simple_saturation.py想要符号化建模同一套 API 也有符号版本 simupy/systems/symbolic.py用 sympy 表达式定义方程总结SimuPy 的DynamicalSystem用函数即模型的极简设计覆盖了连续、离散、切换、LTI 四类动力系统配合SimulationResult的 numpy 风格结果对象几行代码就能完成从建模到仿真的全流程。建议从examples/目录下的七个示例读起再对照 docs/api/systems.rst 的 API 文档深入每个参数。【免费下载链接】simupyA framework for modeling and simulating dynamical systems项目地址: https://gitcode.com/gh_mirrors/si/simupy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考