当前位置: 首页 > news >正文

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解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

http://www.cnnetsun.cn/news/3800078.html

相关文章:

  • 使用VMware Workstation与GDB调试Linux虚拟机启动过程实战指南
  • 踩坑实录|Ollama+ChromaDB 本地知识库,检索不准、答案错乱解决方案
  • 如何构建企业级高效WMS仓库管理系统:从技术架构到业务价值实现
  • HUB75接口RGB LED点阵屏驱动全解析:从硬件连接到Python/STM32编程实战
  • 5步快速掌握IDM激活脚本:永久锁定试用期的完整指南
  • 如何高效清理重复视频文件:Czkawka视频查重工具完整教程
  • Kali Linux渗透测试实战指南:从零搭建环境到核心工具入门
  • 5步掌握WLAN安全测试工具:从安装到多开并发的完整指南
  • DDrawCompat完整指南:免费解决Windows 11老游戏兼容性问题的终极方案
  • FF14 ACT辍学插件:三步告别副本动画等待的终极方案
  • OBS Studio专业色彩校正:3种LUT技术方案实现电影级直播画面
  • pi-subagents 生产级部署完整方案:企业级异步代理系统实战指南
  • SPC假报警治理:从每天200条降到20条的过程
  • Handy终极指南:完全离线的语音转文本解决方案,让隐私与效率并存
  • UE4 UMG Grid Panel按钮布局避坑指南:从点击失效到性能优化
  • 微软「Generative AI for Beginners」21课全解:渐进优化而非范式突破,但它是目前最好的免费入门通道
  • 微信文章转存API接入要点:从请求构造到正文与图片的工程化处理
  • USB-CAN-A设备全解析:从硬件构成到实战应用
  • 基于AST的JavaScript静态分析:从代码解析到自动化安全扫描实践
  • ATH8809-P:32位DSP高端语音处理芯片,重新定义顶级通话体验
  • 高性价比数码相机与手机拍照的五个维度差异:以科美锐(Komery)W3为例
  • Kimi 豆包写的论文 AI 率 90%?这样去 AI 味一次降到 7% 检测合格
  • Meshtastic固件源码编译与深度定制实战指南
  • LCD1602 I2C模块:从硬件连接到代码驱动的完整指南
  • 5分钟搞定Switch和3DS游戏安装:终极免费网络传输工具完全指南
  • 终极5分钟AI视频生成指南:JoyAI-Echo如何重新定义长视频创作
  • Unity到Godot的无缝资源迁移:企业级跨引擎解决方案
  • 移远SIM8230G-M2 Cat.1 bis模组硬件设计与低功耗物联网开发实战
  • HP / Agilent 83752A Synthesized Sweeper 合成扫频信号源
  • AI时代C++工程师培养计划:2026年高薪就业路线图