Skip to main content

Python License

Mason Solver

Symbolic Mason Gain Formula Solver for Control Systems 基于符号计算的信号流图传递函数求解工具


📌 项目简介

本项目实现了 Mason 增益公式(Mason's Gain Formula) 的自动化求解,支持:

  • 单输入单输出(SISO)系统
  • 多输入多输出(MIMO)系统
  • 符号表达(基于 sympy
  • 信号流图建模
  • 自动路径、回路与系统行列式计算
  • 传递矩阵生成

适用于:

  • 自动控制原理课程
  • 控制系统建模与分析
  • 教学与验证工具
  • 符号推导与科研辅助

⚙️ 安装方式

克隆代码

git clone https://github.com/Meeta-factor/mason.git
cd mason

安装

虚拟环境安装

python -m venv .venv
source .venv/bin/activate
pip install -e .

本地安装

pip install .

🚀 快速开始

1️⃣ 构建系统

from mason.solver import MasonSolver,MIMOSFGSolver,ShannonHappSolver
solver = MIMOSFGSolver(MasonSolver)
data = {
    "edges": [
        ("R1", "C1", "G11"),
        ("R1", "C2", "G12"),
        ("R2", "C1", "G21"),
        ("R2", "C2", "G22"),
    ],
    "sources": ["R1", "R2"],
    "sinks": ["C1", "C2"],
}
solver.load_from_dict(data)

2️⃣ 计算传递矩阵

G,info = solver.transfer_matrix(
    sources=data["sources"],
    sinks=data["sinks"]
)

display(G)

输出:

Matrix([
[G11, G21],
[G12, G22]
])

3️⃣ 数学含义

该矩阵满足:

$$ \mathbf{y} = G(s)\mathbf{u} $$

其中:

  • 行 → 输出(sinks)
  • 列 → 输入(sources)
  • $G_{ij}$ 表示:第 j 个输入到第 i 个输出的传递函数

4️⃣ 查看详细推导过程

from mason.visualize import show_result
show_result(info,entry=("C1","R2"))

展示内容包括:

  • Forward Paths(前向通路)
  • Loops(回路)
  • $\Delta$(系统行列式)
  • $\Delta_k$(非接触回路修正项)

🎉 Examples

  • examples/solver.ipynb – basic usage
  • examples/control.ipynb – control interface
  • examples/load.ipynb – classic control example
  • examples/loop3.ipynb – multi-loops example
  • examples/shannon.ipynb – shannon example

📊 功能特性

  • ✅ 自动枚举前向路径
  • ✅ 自动检测回路与非接触回路
  • ✅ 符号计算支持(SymPy)
  • ✅ 支持复杂反馈结构
  • ✅ MIMO 传递矩阵

📁 项目结构

mason/
├── solver.py        # 核心算法
├── visualize.py     # 可视化与结果展示
├── typing_defs.py   # 类型定义
examples/
├── control.ipynb
├── load.ipynb
├── shannon.ipynb
├── solver.ipynb

🧠 理论基础

Mason 增益公式

$$T = \frac{\sum_{k} P_{k} \Delta_{k}}{\Delta}$$

其中:

  • $P_k $:第 k 条前向路径
  • $\Delta$:系统行列式
  • $\Delta_k$ :与路径不接触的回路组成的行列式

Shannon happ公式

本项目除了支持经典的 Mason 增益公式外,也支持使用 Shannon–Happ 公式 计算信号流图的传递函数。 Shannon–Happ 公式是求解信号流图传递函数的另一种经典方法。
它的基本思想是:在原始开环信号流图的基础上,从输出节点到输入节点人为添加一条增益为 C 的支路,其中 $G$ 为待求传递函数。这样,原来的开环图就被转化为一个闭合图。 在这个闭合图上,传递函数的求解可以转化为对系统中各类回路及其互不接触组合的分析,而不再需要像 Mason 公式那样显式列出前向通路及对应的余子式。

其特征方程通常可以写成:

$$\frac{1}{G}=1-\sum L_i+\sum L_iL_j-\sum L_iL_jL_k+\cdots=0$$

其中:

  • $L_i$ 表示单个回路的增益;
  • $L_iL_j$ 表示两个互不接触回路的增益乘积;
  • $L_iL_jL_k$ 表示三个两两互不接触回路的增益乘积;
  • 更高阶项以此类推。

通过求解上述关于 $\frac{1}{G}$ 的方程,即可得到系统的传递函数 $G$。


🎉TIKZ实现初步的信号流图

前提条件:texlive-extra安装

SISO系统

loop3

MIMO+自耦+互耦

ex data


📌 适用方向

  • 自动控制原理
  • 信号与系统
  • 控制系统建模
  • 最优控制(预处理工具)
  • 符号推导验证

🧩 未来计划

  • 状态空间转换
  • 自动生成报告(LaTeX)
  • 控制系统解耦分析
  • LQR / 最优控制接口

👤 作者

  • Meta(Meeta-factor)(Control Engineering Student)

📜 License

This project is licensed under the MIT License.


📖 数据格式与 API

信号流图使用字典描述,其中每条边均为 (起点, 终点, 增益)。增益可以是 SymPy 表达式,也可以是能够被 sympy.sympify 解析的字符串,例如 "G1""-H""1/(s+1)""G1*G2"

SISO 输入格式

data = {
    "edges": [
        ("R", "x", "G"),
        ("x", "C", "1/(s+1)"),
        ("C", "x", "-H"),
    ],
    "source": "R",
    "sink": "C",
}

使用 Mason 公式求解:

from mason.solver import MasonSolver

solver = MasonSolver()
solver.load_from_dict(data)
T, info = solver.solve()

print(T)  # G/(H + s + 1)

也可以不预先设置输入、输出节点,直接计算任意两节点之间的传递函数:

T, info = solver.transfer_function("R", "C", expand_result=True)

expand_result=True 会展开最终的符号表达式。对于包含扰动节点的图,可使用:

Td, info = solver.disturbance_transfer_function("D", "C")

MIMO 输入格式

MIMO 系统以输出为行、输入为列构成传递矩阵。info["entry_info"] 保存了 每个 (sink, source) 元素的完整 Mason 推导信息。

from mason.solver import MasonSolver, MIMOSFGSolver

solver = MIMOSFGSolver(MasonSolver)
solver.load_from_dict({
    "edges": [
        ("R1", "C1", "G11"),
        ("R1", "C2", "G12"),
        ("R2", "C1", "G21"),
        ("R2", "C2", "G22"),
    ],
    "sources": ["R1", "R2"],
    "sinks": ["C1", "C2"],
})

G, info = solver.solve()
G_c1_r2 = info["entry_info"][("C1", "R2")]["TransferFunction"]

Shannon-Happ 求解

ShannonHappSolver 会临时添加一条从输出回到输入、增益为 1/T 的支路, 构造特征方程后对 T 进行符号求解。其输入格式与 SISO Mason 相同。

from mason.solver import ShannonHappSolver

solver = ShannonHappSolver()
solver.load_from_dict(data)
T, info = solver.solve(T_symbol="T")

如需用 Shannon-Happ 方法逐元素计算 MIMO 矩阵,可将其作为 MIMO 包装器的后端:

solver = MIMOSFGSolver(ShannonHappSolver)

🔍 结果展示

求解方法均返回 (result, info)info 包含前向通路、回路、非接触回路组合、 系统行列式和最终传递函数,可在 Jupyter Notebook 中用 show_result 展示:

from mason.visualize import show_result

show_result(info)                 # SISO Mason 或 Shannon-Happ
show_result(info, entry=("C1", "R2"))  # MIMO 的指定矩阵元素

MIMO 的 entry 也支持从零开始的矩阵索引,例如 entry=(0, 1)


🔄 转换为 python-control 模型

mason.adapters.control 可将只含拉普拉斯变量 s 的数值化 SymPy 传递矩阵转换为 python-control 的传递函数或状态空间模型。符号参数必须通过 subs_dict 全部替换。

import sympy as sp
from mason.adapters.control import matrix_to_control_ss

s = sp.Symbol("s")
Gsym = sp.Matrix([[10 / (s + 2)]])
sys = matrix_to_control_ss(Gsym, s, minimal=True)

A, B, C, D = sys.A, sys.B, sys.C, sys.D

可使用 matrix_to_control_tf 获得 python-control 传递函数对象,或使用 matrix_to_ss_matrices 直接获得 (A, B, C, D) 矩阵。


🌐 Web 界面

项目内置 Streamlit 页面,支持手动输入图数据或上传边列表 CSV,运行:

streamlit run app.py

CSV 至少需要起点、终点与增益三列。列名可使用以下任一种组合:

start,end,gain
R,x1,G1
x1,C,G2

起点列也可命名为 fromu,终点列也可命名为 tov,增益列也可命名为 Gweight。SISO 模式需额外指定 sourcesink;MIMO 模式需指定 sourcessinks


🖼️ 从 CSV 生成 TikZ 图

mason/tikz/mason_build.py 能将 start,end,gain 格式的 CSV 转为独立的 TikZ/LaTeX 文档,并按常见的主通道、反馈、交叉耦合和双支路命名自动布局:

python mason/tikz/mason_build.py mason/tikz/loop3.csv
pdflatex mason/tikz/loop3.tex

可指定输出文件:

python mason/tikz/mason_build.py input.csv output.tex

生成 PDF 需要可用的 LaTeX 环境,以及包含 TikZ 的 texlive-extra


⚠️ 使用限制

  • 图内部使用 networkx.DiGraph 表示,同一对节点只能保留一条边;重复添加会覆盖原增益。
  • 若输入到输出之间不存在前向通路,求解器会抛出 ValueError
  • Shannon-Happ 方法要求原图中不存在 sink -> source 的边,否则临时闭环边会与其冲突。
  • 回路与互不接触回路组合通过枚举获得,节点和回路较多时计算量会快速增长,适合教学、验证和中小规模的符号分析。

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mason_solver-0.1.1.tar.gz (26.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mason_solver-0.1.1-py3-none-any.whl (24.9 kB view details)

Uploaded Python 3

File details

Details for the file mason_solver-0.1.1.tar.gz.

File metadata

  • Download URL: mason_solver-0.1.1.tar.gz
  • Upload date:
  • Size: 26.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.5

File hashes

Hashes for mason_solver-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6c70f71026f40fbe73596f09672258c998fb18cefcf3cf7f2e21760f616ef2cd
MD5 85b66db74642788dba66fd3c6d20b0de
BLAKE2b-256 f439b4feb1d6627243675045286d0b2fd7fea7b5ebf83099241d35b342cdef8f

See more details on using hashes here.

File details

Details for the file mason_solver-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: mason_solver-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 24.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.5

File hashes

Hashes for mason_solver-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f44dd42dab628abe774aa09920b86d92ecceb88aaa840aeff5f1c90d7928b753
MD5 e39ef768fd813bb3db07f44b3877aa1a
BLAKE2b-256 137284c985771c6a7b1a56b6e76f996447a9902d82b0c870666b5633747b00a8

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page