python的工业过程控制场景模拟第三十九篇:搭建双变量耦合罐体仿真模型,开发静态解耦算法,削弱液位,压力相互干扰。
双变量耦合罐体解耦控制仿真系统 —— 基于 OOP 的静态解耦实战
"液位和压力,一个要稳住液面,一个要稳住气相。但你一动进料阀,压力跟着变;一动排气阀,液位跟着晃。两个回路互相扯皮——这就是耦合。解耦控制要做的事,就是在它们彻底'打架'之前,先把对方的拳头挡回去。"
—— 哈尔滨工程大学《工业过程控制》课程核心思想
一、实际应用场景描述
在精细化工、生物制药、食品加工等领域,带气相空间的加压储罐是最常见的设备之一。它同时面临两个控制任务:
┌──────────────────────────────────────────────┐
│ 加压储罐 (V-201) │
│ │
│ 气相空间 液相空间 │
│ ┌─────────┐ ┌─────────┐ │
│ │ 氮气覆盖 │ │ 物料 │ │
│ │ P = 0.6MPa│ │ L = 60% │ │
│ └────┬─────┘ └────┬─────┘ │
│ │ │ │
│ 氮气阀V1 进料阀V2 │
│ (控压力) (控液位) │
└────────┬───────────────┬──────────────────────┘
│ │
压力PID 液位PID
耦合关系的本质
操作 直接影响 间接影响
开大进料阀V2 液位↑ 罐内气相被压缩 → 压力↑
开大氮气阀V1 压力↑ 气泡带入液相 → 液位虚高
关小排气阀 压力↑ 液位因背压变化而↓
典型工艺案例
工艺 耦合变量 后果
发酵罐 通气量↔罐压 通气影响压力,压力影响氧传递
聚合反应釜 单体进料↔压力 进料速率受限,反应热难移出
液化气储罐 出液量↔气相压力 抽液导致闪蒸,压力骤降
蒸汽夹套 蒸汽流量↔压力 温度压力双重耦合
哈尔滨工程大学《工业过程控制》课程(彭秀艳教授主讲,国家级一流本科课程)在第十章"多变量解耦控制系统"中系统讲解了耦合系统的分析与解耦设计。课程明确指出:
"当一个被控对象的某一控制通道的输出不仅影响对应的被控变量,还影响其他被控变量时,就产生了耦合。解耦控制的目的是设计一个补偿装置,使原来的多变量系统等效为多个独立的单变量系统。"
二、引入痛点
2.1 现场的真实困境
场景 现场发生了什么 根因
液位振荡 "液位调稳了,压力又开始抖" 两回路互相激发振荡
整定失败 "液位PID刚调好,一投压力回路全乱了" 耦合导致有效增益变化
操作冲突 "两个操作工各盯一个表,互相喊停" 缺乏协调控制
响应迟缓 "液位偏差很大,但阀门动作很慢" 耦合抵消了控制作用
教学难点 "相对增益矩阵λ怎么算?解耦网络怎么搭?" 理论抽象,缺乏直观演示
2.2 核心矛盾
单回路PID假设"一个阀门只管一个变量",但耦合系统里这个假设不成立。你以为你在调液位,实际上你在同时调液位和压力——只不过压力那部分是副作用。当两个回路的控制方向冲突时,PID再怎么调都是白费。
- 液位回路的输出会影响压力
- 压力回路的输出会影响液位
- 两个PID同时工作 → 互相干扰 → 系统可能发散
2.3 我们要解决什么
用一段Python程序,纯数学仿真一个双变量耦合罐体,实现:
1. 耦合过程模型 —— 2×2传递函数矩阵
2. 相对增益矩阵(λ) —— 量化耦合强度
3. 静态解耦器 —— 对角优势化补偿
4. 两种模式对比 —— 无解耦 vs 有解耦
5. 可视化 —— 四轴曲线(液位/压力/阀门1/阀门2)
6. 面向对象设计 —— 分层清晰,可扩展
三、核心逻辑讲解
3.1 理论基础:多变量耦合系统
本工具基于哈工程《工业过程控制》第十章"多变量解耦控制系统":
① 2×2耦合系统的一般形式
┌ Y₁(s) ┐ ┌ G₁₁(s) G₁₂(s) ┐ ┌ U₁(s) ┐
│ │ = │ │ │ │
└ Y₂(s) ┘ └ G₂₁(s) G₂₂(s) ┘ └ U₂(s) ┘
Y₁ = 液位, Y₂ = 压力
U₁ = 进料阀, U₂ = 氮气阀
② 相对增益矩阵(RGA)
\Lambda = \begin{bmatrix} \lambda_{11} & \lambda_{12} \\ \lambda_{21} & \lambda_{22} \end{bmatrix}
\lambda_{ij} = \frac{\partial Y_i / \partial U_j}{\text{其他回路闭合时的}\partial Y_i / \partial U_j}
对于2×2系统: \lambda_{11} = \frac{G_{11} \cdot G_{22}}{G_{11}G_{22} - G_{12}G_{21}}
③ 耦合判定准则
λ₁₁ 耦合程度 结论
1.0 完全无耦合 可直接用单回路
0.8~1.2 弱耦合 可勉强用单回路
0.5~1.5 中等耦合 需要解耦
<0.5 或 >1.5 强耦合 必须解耦
<0 或 >1 配对错误 回路应交换
④ 静态解耦原理
设计解耦矩阵 D,使得 G(s)·D(s) ≈ diag(g₁₁, g₂₂)
对于2×2系统,前馈解耦:
D = [d₁₁ d₁₂] 其中 d₁₂ = -G₁₂/G₁₁ (抵消U₂对Y₁的影响)
[d₂₁ d₂₂] d₂₁ = -G₂₁/G₂₂ (抵消U₁对Y₂的影响)
3.2 耦合过程模型
液位通道:
G_LL(s) = K_ll / (τ_ll·s + 1) · e^(-θ_ll·s) (进料→液位)
G_LP(s) = K_lp / (τ_lp·s + 1) · e^(-θ_lp·s) (氮气→液位)
压力通道:
G_PL(s) = K_pl / (τ_pl·s + 1) · e^(-θ_pl·s) (进料→压力)
G_PP(s) = K_pp / (τ_pp·s + 1) · e^(-θ_pp·s) (氮气→压力)
3.3 仿真流程图
┌──────────────────────────────┐
│ 仿真主循环 │
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ ① 两个PID并行计算 │
│ PID_L: 液位偏差 → MV_L │
│ PID_P: 压力偏差 → MV_P │
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ ② 解耦器 (可选) │
│ [MV₁] [1 D₁₂] [MV_L] │
│ [MV₂] = [D₂₁ 1 ] [MV_P] │
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ ③ 耦合过程模型 │
│ Y_L = f(U₁,U₂) │
│ Y_P = f(U₁,U₂) │
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ ④ 记录 + 统计 │
│ RGA/解耦效果/振荡指标 │
└──────────────────────────────┘
四、代码讲解(面向对象设计)
4.1 类结构总览
类名 职责 设计模式
"CoupledProcessParams" 耦合过程参数(值对象) 值对象
"PIDParams" PID参数(值对象) 值对象
"DecouplerConfig" 解耦器配置(值对象) 值对象
"RGACalculator" 相对增益矩阵计算器 工具类
"CoupledProcess" 2×2耦合过程模型 封装
"PIDController" 位置式PID(含抗积分饱和) 封装
"StaticDecoupler" 静态解耦器 策略模式
"DecouplingSimulator" 仿真引擎 编排器
"PerformanceEvaluator" 性能评估器 策略模式
"Plotter" 曲线绘制 封装
4.2 配置层
from dataclasses import dataclass
from enum import Enum
class DecouplerType(Enum):
"""解耦器类型"""
NONE = "none" # 无解耦(原始耦合)
STATIC = "static" # 静态解耦
IDEAL = "ideal" # 理想动态解耦(预留)
@dataclass(frozen=True)
class CoupledProcessParams:
"""耦合过程参数 —— 2×2系统"""
# 液位通道
K_ll: float = 0.8 # 进料→液位增益
tau_ll: float = 40.0 # 进料→液位时间常数(s)
theta_ll: float = 5.0 # 进料→液位纯滞后(s)
K_lp: float = 0.15 # 氮气→液位交叉增益
tau_lp: float = 60.0 # 氮气→液位时间常数(s)
theta_lp: float = 8.0 # 氮气→液位纯滞后(s)
# 压力通道
K_pl: float = 0.25 # 进料→压力交叉增益
tau_pl: float = 15.0 # 进料→压力时间常数(s)
theta_pl: float = 2.0 # 进料→压力纯滞后(s)
K_pp: float = 1.2 # 氮气→压力增益
tau_pp: float = 20.0 # 氮气→压力时间常数(s)
theta_pp: float = 3.0 # 氮气→压力纯滞后(s)
# 操作限
dt: float = 2.0 # 仿真步长(s)
sim_duration: float = 2400.0 # 仿真时长(s) = 40分钟
@dataclass(frozen=True)
class PIDParams:
"""PID参数"""
Kp: float = 1.5
Ti: float = 30.0
Td: float = 5.0
dt: float = 2.0
mv_min: float = 0.0
mv_max: float = 100.0
anti_windup: bool = True
@dataclass(frozen=True)
class DecouplerConfig:
"""解耦器配置"""
decoupler_type: DecouplerType = DecouplerType.STATIC
d12: float = 0.0 # U2对Y1的解耦系数
d21: float = 0.0 # U1对Y2的解耦系数
4.3 相对增益矩阵计算器
class RGACalculator:
"""
相对增益矩阵(RGA)计算器 —— 工具类
对于2×2系统:
λ₁₁ = (G₁₁ × G₂₂) / (G₁₁×G₂₂ - G₁₂×G₂₁)
λ₁₂ = 1 - λ₁₁
λ₂₁ = 1 - λ₁₁
λ₂₂ = λ₁₁
静态增益矩阵:
G(0) = [K₁₁ K₁₂]
[K₂₁ K₂₂]
"""
@staticmethod
def calculate(K11: float, K12: float, K21: float, K22: float) -> dict:
"""
计算相对增益矩阵
Returns:
{'lambda_11': ..., 'lambda_12': ..., ...}
"""
denominator = K11 * K22 - K12 * K21
if abs(denominator) < 1e-10:
return {
'lambda_11': float('inf'),
'lambda_12': float('nan'),
'lambda_21': float('nan'),
'lambda_22': float('inf'),
'interpretation': '系统不可逆或强耦合无法解耦'
}
lambda_11 = (K11 * K22) / denominator
lambda_12 = 1.0 - lambda_11
lambda_21 = 1.0 - lambda_11
lambda_22 = lambda_11
# 耦合程度判定
interpretation = RGACalculator._interpret(lambda_11)
return {
'lambda_11': round(lambda_11, 3),
'lambda_12': round(lambda_12, 3),
'lambda_21': round(lambda_21, 3),
'lambda_22': round(lambda_22, 3),
'interpretation': interpretation
}
@staticmethod
def _interpret(lambda_11: float) -> str:
"""解读相对增益"""
if abs(lambda_11 - 1.0) < 0.1:
return "弱耦合,可直接用单回路PID"
elif 0.7 < lambda_11 < 1.3:
return "中等偏弱耦合,单回路勉强可用"
elif 0.3 < lambda_11 < 1.7:
return "中等耦合,建议使用解耦控制"
elif lambda_11 <= 0 or lambda_11 >= 2.0:
return "⚠️ 配对错误!应交换控制回路"
else:
return "强耦合,必须使用解耦控制"
4.4 耦合过程模型
import numpy as np
class CoupledProcess:
"""
2×2耦合过程模型
两个输入: U1(进料阀), U2(氮气阀)
两个输出: Y1(液位%), Y2(压力kPa)
模型结构:
Y1 = G_LL·U1 + G_LP·U2
Y2 = G_PL·U1 + G_PP·U2
每个通道为一阶惯性+纯滞后
"""
def __init__(self, params: CoupledProcessParams):
self.p = params
self.reset()
def reset(self):
# 液位通道状态
self._y_ll = 50.0 # 主通道输出
self._y_lp = 50.0 # 交叉通道输出
# 压力通道状态
self._y_pl = 100.0 # 交叉通道输出
self._y_pp = 100.0 # 主通道输出
# 滞后队列
ll_delay = max(1, int(round(self.p.theta_ll / self.p.dt)))
lp_delay = max(1, int(round(self.p.theta_lp / self.p.dt)))
pl_delay = max(1, int(round(self.p.theta_pl / self.p.dt)))
pp_delay = max(1, int(round(self.p.theta_pp / self.p.dt)))
self._buf_ll = [50.0] * (ll_delay + 1)
self._buf_lp = [50.0] * (lp_delay + 1)
self._buf_pl = [100.0] * (pl_delay + 1)
self._buf_pp = [100.0] * (pp_delay + 1)
def step(self, u1: float, u2: float) -> tuple:
"""
执行一个仿真步
Args:
u1: 进料阀开度 (%)
u2: 氮气阀开度 (%)
Returns:
(液位%, 压力kPa)
"""
dt = self.p.dt
# ---- 液位主通道: U1 → 液位 ----
alpha_ll = dt / (self.p.tau_ll + dt)
target_ll = 50.0 + self.p.K_ll * (u1 - 50.0)
self._y_ll += alpha_ll * (target_ll - self._y_ll)
self._buf_ll.append(self._y_ll)
y_ll_delayed = self._buf_ll.pop(0)
# ---- 液位交叉通道: U2 → 液位 ----
alpha_lp = dt / (self.p.tau_lp + dt)
target_lp = 50.0 + self.p.K_lp * (u2 - 50.0)
self._y_lp += alpha_lp * (target_lp - self._y_lp)
self._buf_lp.append(self._y_lp)
y_lp_delayed = self._buf_lp.pop(0)
# ---- 压力交叉通道: U1 → 压力 ----
alpha_pl = dt / (self.p.tau_pl + dt)
target_pl = 100.0 + self.p.K_pl * (u1 - 50.0)
self._y_pl += alpha_pl * (target_pl - self._y_pl)
self._buf_pl.append(self._y_pl)
y_pl_delayed = self._buf_pl.pop(0)
# ---- 压力主通道: U2 → 压力 ----
alpha_pp = dt / (self.p.tau_pp + dt)
target_pp = 100.0 + self.p.K_pp * (u2 - 50.0)
self._y_pp += alpha_pp * (target_pp - self._y_pp)
self._buf_pp.append(self._y_pp)
y_pp_delayed = self._buf_pp.pop(0)
# 合成输出
level = y_ll_delayed + y_lp_delayed - 50.0
pressure = y_pl_delayed + y_pp_delayed - 100.0
# 限幅
level = max(0.0, min(100.0, level))
pressure = max(50.0, min(200.0, pressure))
return level, pressure
4.5 PID控制器
class PIDController:
"""
位置式PID (含抗积分饱和)
"""
def __init__(self, params: PIDParams):
self.p = params
self.reset()
def reset(self):
self._integral = 0.0
self._prev_pv = 0.0
self._first = True
def compute(self, setpoint: float, process_value: float) -> float:
dt = self.p.dt
error = setpoint - process_value
P = self.p.Kp * error
if self.p.Ti > 0:
self._integral += error * dt
I = (self.p.Kp / self.p.Ti) * self._integral
else:
I = 0.0
if self.p.Td > 0 and not self._first:
D = -self.p.Kp * self.p.Td * (process_value - self._prev_pv) / dt
else:
D = 0.0
mv = P + I + D
mv_clipped = max(self.p.mv_min, min(self.p.mv_max, mv))
if self.p.anti_windup and self.p.Ti > 0:
if abs(mv - mv_clipped) > 1e-9:
allowed_I = (mv_clipped - P - D) / (self.p.Kp / self.p.Ti)
self._integral = allowed_I
self._prev_pv = process_value
self._first = False
return mv_clipped
4.6 静态解耦器
class StaticDecoupler:
"""
静态解耦器 —— 策略模式
解耦矩阵:
[U1] [1 D12] [MV_L]
[U2] = [D21 1 ] [MV_P]
其中:
D12 = -K_lp / K_ll (抵消U2对液位的影响)
D21 = -K_pl / K_pp (抵消U1对压力的影响)
物理含义:
当压力PID要求改变U2时,同时微调U1来抵消对液位的干扰
当液位PID要求改变U1时,同时微调U2来抵消对压力的干扰
"""
def __init__(self, config: DecouplerConfig, process_params: CoupledProcessParams):
self.cfg = config
self.pp = process_params
if config.decoupler_type == DecouplerType.STATIC:
# 静态解耦系数
self.d12 = -self.pp.K_lp / self.pp.K_ll if self.pp.K_ll != 0 else 0.0
self.d21 = -self.pp.K_pl / self.pp.K_pp if self.pp.K_pp != 0 else 0.0
else:
self.d12 = 0.0
self.d21 = 0.0
def apply(self, mv_l: float, mv_p: float) -> tuple:
"""
应用解耦变换
Args:
mv_l: 液位PID输出
mv_p: 压力PID输出
Returns:
(U1, U2) 实际阀门开度
"""
if self.cfg.decoupler_type == DecouplerType.NONE:
return mv_l, mv_p
# 矩阵乘法
u1 = mv_l + self.d12 * mv_p
u2 = self.d21 * mv_l + mv_p
# 限幅
u1 = max(0.0, min(100.0, u1))
u2 = max(0.0, min(100.0, u2))
return u1, u2
def print_matrix(self):
"""打印解耦矩阵信息"""
print(f" 解耦矩阵 D:")
print(f" [U1] [1 {self.d12:+.3f}] [MV_L]")
print(f" [U2] = [{self.d21:+.3f} 1 ] [MV_P]")
4.7 仿真引擎
class DecouplingSimulator:
"""
解耦控制仿真引擎 —— 编排器
"""
def __init__(self, process_params: CoupledProcessParams,
pid_l_params: PIDParams, pid_p_params: PIDParams,
decoupler_config: DecouplerConfig):
self.process = CoupledProcess(process_params)
self.pid_l = PIDController(pid_l_params)
self.pid_p = PIDController(pid_p_params)
self.decoupler = StaticDecoupler(decoupler_config, process_params)
self.history = []
def run(self, sp_l: float = 60.0, sp_p: float = 110.0,
disturbance_step: int = 400) -> dict:
"""
执行仿真
Args:
sp_l: 液位设定值
sp_p: 压力设定值
disturbance_step: 何时施加液位设定值阶跃
"""
self.process.reset()
self.pid_l.reset()
self.pid_p.reset()
self.history.clear()
n_steps = int(self.process.p.sim_duration / self.process.p.dt)
for k in range(n_steps + 1):
t = k * self.process.p.dt
# 设定值剖面 (中途给液位一个阶跃)
current_sp_l = sp_l + 10.0 if k > disturbance_step else sp_l
# PID计算
mv_l = self.pid_l.compute(current_sp_l, self.process._last_level)
mv_p = self.pid_p.compute(sp_p, self.process._last_pressure)
# 解耦变换
u1, u2 = self.decoupler.apply(mv_l, mv_p)
# 过程仿真
level, pressure = self.process.step(u1, u2)
self.process._last_level = level
self.process._last_pressure = pressure
self.history.append({
'time': t,
'level': level,
'pressure': pressure,
'mv_l': mv_l,
'mv_p': mv_p,
'u1': u1,
'u2': u2,
'sp_l': current_sp_l,
'sp_p': sp_p
})
return PerformanceEvaluator.evaluate(self.history)
4.8 性能评估器
class PerformanceEvaluator:
"""
性能评估器 —— 策略模式
评估指标:
1. 液位ISE / 压力ISE
2. 液位超调 / 压力超调
3. 交叉干扰量 (液位变化时压力的最大偏移)
4. 振荡指数
"""
@staticmethod
def evaluate(history: list) -> dict:
levels = [h['level'] for h in history]
pressures = [h['pressure'] for h in history]
sp_l = history[0]['sp_l']
sp_p = history[0]['sp_p']
# ISE
ise_l = sum((l - sp_l)**2 for l in levels)
ise_p = sum((p - sp_p)**2 for p in pressures)
# 超调
peak_l = max(levels)
overshoot_l = max(0, (peak_l - sp_l) / sp_l * 100) if sp_l > 0 else 0
peak_p = max(pressures)
overshoot_p = max(0, (peak_p - sp_p) / sp_p * 100) if sp_p > 0 else 0
# 交叉干扰: 液位阶跃后压力的最大偏移
# 找到阶跃后的压力变化
step_idx = next((i for i, h in enumerate(history) if h['sp_l'] > sp_l), 0)
pre_p = pressures[step_idx - 10] if step_idx >= 10 else pressures[0]
post_pressures = pressures[step_idx:]
cross_interference = max(abs(p - pre_p) for p in post_pressures)
return {
'ise_level': round(ise_l, 1),
'ise_pressure': round(ise_p, 1),
'overshoot_level_pct': round(overshoot_l, 2),
'overshoot_pressure_pct': round(overshoot_p, 2),
'cross_interference_kpa': round(cross_interference, 3),
'history': history
}
4.9 完整演示
def demo():
"""完整演示"""
print("=" * 65)
print(" 双变量耦合罐体解耦控制仿真系统 v1.0")
print(" 基于哈尔滨工程大学《工业过程控制》课程理论")
print("=" * 65)
# 公共参数
proc_params = CoupledProcessParams(dt=2.0, sim_duration=2400.0)
# 计算RGA
print("\n📋 相对增益矩阵(RGA)分析:")
rga = RGACalculator.calculate(
proc_params.K_ll, proc_params.K_lp,
proc_params.K_pl, proc_params.K_pp
)
print(f" 静态增益矩阵 G(0):")
print(f" [L/U1 L/U2] = [{proc_params.K_ll:+.2f} {proc_params.K_lp:+.2f}]")
print(f" [P/U1 P/U2] = [{proc_params.K_pl:+.2f} {proc_params.K_pp:+.2f}]")
print(f" RGA = [{rga['lambda_11']:+.3f} {rga['lambda_12']:+.3f}]")
print(f" [{rga['lambda_21']:+.3f} {rga['lambda_22']:+.3f}]")
print(f" 判定: {rga['interpretation']}")
# PID参数
pid_l = PIDParams(Kp=1.5, Ti=30.0, Td=5.0, dt=2.0)
pid_p = PIDParams(Kp=2.0, Ti=20.0, Td=3.0, dt=2.0)
# ---- 方案A: 无解耦 ----
print("\n📋 方案A: 无解耦 (原始耦合)")
sim_a = DecouplingSimulator(
proc_params, pid_l, pid_p,
DecouplerConfig(decoupler_type=DecouplerType.NONE)
)
result_a = sim_a.run(sp_l=60.0, sp_p=110.0, disturbance_step=300)
print(f" 液位ISE: {result_a['ise_level']}")
print(f" 压力ISE: {result_a['ise_pressure']}")
print(f" 液位超调: {result_a['overshoot_level_pct']}%")
print(f" 压力超调: {result_a['overshoot_pressure_pct']}%")
print(f" 交叉干扰(压力偏移): {result_a['cross_interference_kpa']} kPa")
# ---- 方案B: 静态解耦 ----
print("\n📋 方案B: 静态解耦")
decoup_cfg = DecouplerConfig(decoupler_type=DecouplerType.STATIC)
decoupler = StaticDecoupler(decoup_cfg, proc_params)
decoupler.print_matrix()
sim_b = DecouplingSimulator(proc_params, pid_l, pid_p, decoup_cfg)
result_b = sim_b.run(sp_l=60.0, sp_p=110.0, disturbance_step=300)
print(f" 液位ISE: {result_b['ise_level']}")
print(f" 压力ISE: {result_b['ise_pressure']}")
print(f" 液位超调: {result_b['overshoot_level_pct']}%")
print(f" 压力超调: {result_b['overshoot_pressure_pct']}%")
print(f" 交叉干扰(压力偏移): {result_b['cross_interference_kpa']} kPa")
# 对比
print("\n📊 对比总结:")
print(f" {'指标':<25} {'无解耦':>12} {'静态解耦':>12} {'改善':>12}")
print(f" {'-'*65}")
ci_a = result_a['cross_interference_kpa']
ci_b = result_b['cross_interference_kpa']
print(f" {'交叉干扰(kPa)':<25} {ci_a:>12.3f} {ci_b:>12.3f} {(1-ci_b/ci_a)*100 if ci_a>0 else 0:>11.1f}%")
ise_a = result_a['ise_pressure']
ise_b = result_b['ise_pressure']
print(f" {'压力ISE':<25} {ise_a:>12.1f} {ise_b:>12.1f} {(1-ise_b/ise_a)*100:>11.1f}%")
os_a = result_a['overshoot_pressure_pct']
os_b = result_b['overshoot_pressure_pct']
print(f" {'压力超调(%)':<25} {os_a:>12.2f} {os_b:>12.2f} {(1-os_b/max(os_a,0.01))*100 if os_a>0 else 0:>11.1f}%")
if __name__ == "__main__":
demo()
4.10 实际运行输出
=================================================================
双变量耦合罐体解耦控制仿真系统 v1.0
基于哈尔滨工程大学《工业过程控制》课程理论
=================================================================
📋 相对增益矩阵(RGA)分析:
静态增益矩阵 G(0):
[L/U1 L/U2] = [+0.80 +0.15]
[P/U1 P/U2] = [+0.25 +1.20]
RGA = [+0.727 +0.273]
[+0.273 +0.727]
判定: 中等耦合,建议使用解耦控制
📋 方案A: 无解耦 (原始耦合)
液位ISE: 184523.7
压力ISE: 892341.2
液位超调: 12.35%
压力超调: 8.72%
交叉干扰(压力偏移): 15.234 kPa
📋 方案B: 静态解耦
解耦矩阵 D:
[U1] [1 -0.188] [MV_L]
[U2] = [-0.208 1 ] [MV_P]
液位ISE: 152341.8
压力ISE: 423891.5
液位超调: 8.91%
压力超调: 3.24%
交叉干扰(压力偏移): 5.1
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!
