gpt4 book ai didi

max - modelica:随时间计算连续变量的最小值/最大值

转载 作者:行者123 更新时间:2023-12-04 23:44:56 25 4
gpt4 key购买 nike

如上所述:我希望随时间计算连续变量的最小值(和/或最大值)。这是一个演示的最小示例:

model MinMaxTest
Real u;
Real u_min(start = 10);
Real u_max(start = -10);
equation
u = sin(time / 180 * Modelica.Constants.pi);
u_min = min(u, u_min);
u_max = max(u, u_max);
annotation(experiment(StartTime = 0, StopTime = 360, Tolerance = 1e-06, Interval = 1));
end MinMaxTest;
u是任意连续变量(出于演示目的,一个简单的正弦波)。 u_min/ u_max是随时间变化的最小值/最大值。

显然预期的结果是 u_min=-1u_max=1 .不幸的是,模拟因“Matrix singular!”而崩溃。错误。谁能指导我如何避免这种情况?

编辑 1

我正在使用 OpenModelica 1.15(是 1.9.2)

编辑 2

由于我对 Modelica 还很陌生,因此我很难理解以下方法之间的差异:
  • u_min = if noEvent(u < u_min) then u else pre(u_min);
  • if noEvent(u < u_min) then
    u_min = u;
    else
    u_min = pre(u_min);
    end if;
  • u_min = if noEvent(u < u_min) then u else u_min;
  • u_min = if u < u_min then u else pre(u_min);
  • u_min = if u < u_min then u else u_min;
  • when u < u_min then
    u_min = u;
    end when;
  • u_min + T*der(u_min) = if u <= u_min then u else u_min;

  • 1 和 2 是等效的,并导致预期的行为。

    3 产生了想要的结果,但给出了一个关于“代数循环”的“翻译通知”,为什么?

    到目前为止,4 失败了,结果 u_min曲线与 u 相同?!为什么?

    5 结合了 3 和 4。

    6 编译失败 Sorry - Support for Discrete Equation Systems is not yet implemented
    7 我不清楚这背后的想法是什么,但如果 T 是有效的是建议的大小。

    如果我正确理解 Modelica 文档,那么 1-5 的共同点是始终只有一个方程处于事件状态。 noEvent在指定的过零处抑制事件生成。我的印象是这主要是一种效率改进。为什么忽略它会导致 4 失败? pre指的是变量的前一个值,所以我想如果我们想保持一个变量不变是有道理的,但是为什么 7 没有它就可以工作?我对 when的理解是,它的方程只在那个精确的事件中有效,否则保持以前的值,这就是我尝试在 6 中使用它的原因。如果我与常量值进行比较,它似乎有效(这对这个特定问题没有用)。

    编辑3
  • u_min = smooth(0, if u < u_min then u else pre(u_min));

  • 有趣的是,这也有效。

    最佳答案

    我使用 Dymola 2016 测试了您的模型并且它有效,但是您可以尝试使用替代方法。在 Modelica 中,您必须考虑方程而不是赋值。

    u_min = min(u, u_min);

    如果将代码作为指令序列执行,您会怎么做。在幕后,Modelica 工具转换了这个方程
    进入一个非线性系统,随着仿真的进行求解。

    这些是我在模拟模型时得到的统计数据
    Statistics

    Original Model
    Number of components: 1
    Variables: 3
    Unknowns: 3 (3 scalars)
    Equations: 3
    Nontrivial: 3

    Translated Model
    Time-varying variables: 3 scalars
    Number of mixed real/discrete systems of equations: 0
    Sizes of linear systems of equations: { }
    Sizes after manipulation of the linear systems: { }
    Sizes of nonlinear systems of equations: {1, 1}
    Sizes after manipulation of the nonlinear systems: {1, 1}
    Number of numerical Jacobians: 0

    如您所见,有两个非线性系统,一个用于 u_min一个用于 u_max .

    您问题的替代解决方案如下
    model Test
    Real x;
    Real y;
    Real u_min;
    Real u_max;
    parameter Real T = 1e-4;
    equation
    x = sin(time) + 0.1*time;
    y = sin(time) - 0.1*time;
    u_min + T*der(u_min) = if y <= u_min then y else u_min;
    u_max + T*der(u_max) = if x >= u_max then x else u_max;

    end Test;

    在这种情况下 u_minu_max是两个状态变量,它们遵循
    变量 x 和 y,取决于它们的值。例如,当 x低于 u_max然后 u_max被“卡住”到那个时间点之前达到的最大值。

    抱歉,我无法发布正在运行的模型的图片,因为这是我的第一个回复。

    关于max - modelica:随时间计算连续变量的最小值/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732774/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com