You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TIL库EffCompressor添加转动惯量后结构奇异问题求助

问题分析与解决方法

结构奇异的核心原因

你遇到的结构奇异,本质是新增方程与原模型的已有约束形成了冗余冲突:
原EffCompressor模型在两种运行模式下,都已经对tau(扭矩)和w(角速度)有明确的闭合约束:

  1. 无机械端口模式:w由固定参数n计算得出(w=2*PI*n),tau由轴功率和角速度推导(tau=shaftPower/max(w,1e-6)),变量关系完全闭环。你添加的tau=J*der(w)中,der(w)=0(因w固定),直接要求tau=0,和原模型的tau=shaftPower/w形成矛盾约束。
  2. 有机械端口模式:w是法兰角度的导数(w=der(getInputsRotary.rotaryFlange.phi)),tau直接等于外部法兰输入的扭矩(tau=getInputsRotary.rotaryFlange.tau)。你添加的tau=J*der(w)又给tau增加了一个独立约束,同一个变量出现两个不相关的方程,导致结构奇异。

你误以为“添加一个未知量和一个方程”就能平衡,但实际上原模型的变量已经全部被约束,新增的方程属于冗余约束。

针对性解决方法

需要根据两种运行模式,分别调整转动惯量的集成逻辑,避免冗余约束:

1. 有机械端口模式的修改

把转动惯量的扭矩平衡逻辑,整合到外部法兰与压缩机负载的扭矩传递中,而非直接覆盖tau的定义:

// 保留转动惯量参数
parameter Modelica.Units.SI.Inertia J = 1;

// 修改方程部分
equation
  // 保留原有的角速度定义
  w = der(getInputsRotary.rotaryFlange.phi);
  // 计算压缩机的负载扭矩
  tau_compressor = shaftPower / max(w, 1e-6);
  // 外部法兰输入扭矩 = 压缩机负载扭矩 + 转动惯量加速扭矩
  getInputsRotary.rotaryFlange.tau = tau_compressor + J*der(w);

逻辑通顺后:外部输入的扭矩既要克服压缩机负载,又要提供转动惯量的加速力,变量间无冗余约束,结构奇异问题解决。

2. 无机械端口模式的修改

原模式是稳态假设(固定转速),要体现惯性必须改成动态模式,不能再用固定参数n,需引入内部转动角度变量:

// 新增内部转动角度变量
Modelica.Units.SI.Angle theta;
// 保留转动惯量参数
parameter Modelica.Units.SI.Inertia J = 1;

// 修改方程部分
equation
  // 角速度由内部角度的导数定义
  w = der(theta);
  // 压缩机负载扭矩
  tau_compressor = shaftPower / max(w, 1e-6);
  // 扭矩平衡:负载扭矩等于转动惯量加速扭矩(无外部扭矩输入)
  tau_compressor = J*der(w);

如果需要模拟原模型的“固定转速”效果,可额外添加转速控制器(比如PI控制器),将设定转速n与实际w的偏差转化为虚拟扭矩,加入到扭矩平衡方程中。

两种模式的统一适配

可通过条件语句(基于是否使用机械端口的布尔参数)整合两种逻辑,比如利用原模型可能存在的useRotaryPort参数做分支处理:

parameter Boolean useRotaryPort = false;
parameter Modelica.Units.SI.Inertia J = 1;
Modelica.Units.SI.Angle theta; // 仅无端口模式使用

equation
  if useRotaryPort then
    w = der(getInputsRotary.rotaryFlange.phi);
    tau_compressor = shaftPower / max(w, 1e-6);
    getInputsRotary.rotaryFlange.tau = tau_compressor + J*der(w);
  else
    w = der(theta);
    tau_compressor = shaftPower / max(w, 1e-6);
    tau_compressor = J*der(w);
    // 若需固定转速,添加控制器逻辑示例:
    // tau_controller = kp*(n_setpoint - w/(2*PI)) + ki*integral(n_setpoint - w/(2*PI));
    // tau_compressor + tau_controller = J*der(w);
  end if;

内容的提问来源于stack exchange,提问作者Robin Tassenoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:06:03