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

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奇异!”崩溃了。 错误。 任何人都可以指导我如何避免这种情况?


编辑1

我正在使用OpenModelica 1.15(原为1.9.2)

编辑2

由于我对Modelica很陌生,我很难理解以下方法之间的差异:

  1. u_min = if noEvent(u < u_min) then u else pre(u_min);
  2. if noEvent(u < u_min) then u_min = u; else u_min = pre(u_min); end if;
  3. u_min = if noEvent(u < u_min) then u else u_min;
  4. u_min = if u < u_min then u else pre(u_min);
  5. u_min = if u < u_min then u else u_min;
  6. when u < u_min then u_min = u; end when;
  7. 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进行编译Sorry - Support for Discrete Equation Systems is not yet implemented

7我不清楚这背后的想法是什么,但如果T是建议的大小,它就有效。

如果我正确地理解了Modelica文档,那么1-5就有一个共同点,即一个方程在任何时候都是活动的。 noEvent禁止在指定的过零点处生成事件。 我的印象是这主要是提高效率。 为什么要将它排除导致4失败? pre指的是变量的前一个值,所以我想如果我们想保持一个变量不变就有意义,但为什么7没有呢? 我对when理解是,它的方程仅在那个精确的事件中有效,否则保持先前的值 ,这就是我在6中尝试使用它的原因。如果我与常量值进行比较(这是没用的)似乎有效。对于这个特殊的问题)。

EDIT3

  1. u_min = smooth(0, if u < u_min then u else pre(u_min));

有趣的是,这也有效。

#1楼 票数:3

我用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将“卡住”到达该时间点达到的最大值。

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

#2楼 票数:2

对于您的初始问题,OpenModelica中似乎正常工作的是:

u_min = min(u, pre(u_min));
u_max = max(u, pre(u_max));

对我来说,编译,模拟,并给出预期的结果,但也说“矩阵奇异!”。 另一方面,如果我将u_max的初始声明更改为:

Real u_max(start = 0);

然后,“矩阵奇异!” 消失了。
我不知道为什么,但这确实可以完成这项工作,我建议比你列出的其他选项更直接。

#3楼 票数:2

这里的主要问题是你得到一个单数的方程,因为你试图求解方程 u_min = min(u,u_min) 凡u_min取决于u和u_min和每个值 u_min是小于u将符合该公式中,也是一个工具,可以尝试使用非线性求解了点。 另一个解决方案可能是延迟运算符:

  u_min = min(u, delay(u_min,0));
  u_max = max(u, delay(u_max,0));

关于不同方法的一些注释:

  1. u_min = if noEvent(u < u_min) then u else pre(u_min);
  2. if noEvent(u < u_min) then u_min = u; else u_min = pre(u_min); end if;

这两者在语义上是相同的,因此结果应该是相同的。 此外,pre运算符的使用解决了这个问题,因为这里u_min取决于upre(u_min) ,因此不需要非线性求解器。

  1. u_min = if noEvent(u < u_min) then u else u_min;

如上所述,在这里使用min()u_min的解决方案取决于uu_min ,这导致非线性解决方案。

  1. u_min =如果你<u_min那么你也预先(u_min);

noEvent()运算符的语义在字面上使用了if-expression,在这种情况下,这里触发了一个事件u < u_min ,并且u_min = u使用表达式u_min = u

  1. u_min = if u < u_min then u else u_min;

是的,它结合了3和4的问题。

  1. when u < u_min the u_min = u; end when;

这里u_min的解决方案再次依赖于u_minu

  1. u_min + T*der(u_min) = if u <= u_min then u else u_min;

这里u_min是一个状态,所以u_min的计算由积分器完成,这个等式现在求解为der(u_min),然后影响u_min。

  ask by PeterE translate from so

未解决问题?本站智能推荐:

2回复

根据连续变量的起始/初始值设置参数

任务 : 我有一个变量y1其衍生物是由某些定律驱动的 例如y1 = sin(time) 我为此设定了起始值 例如, y1 = 3.0 我有第二个变量y2 由y2 = y1 + offset定义 现在,我希望这个偏移是一个Parameter (因此在模拟过
1回复

从值范围中查找最小值和最大值

我在以下数据方面表现出色- 我需要按值列汇总我的数据,每个值的最小和最大日期和时间。 以上数据的输出应如下所示- 请帮忙
2回复

在序言中查找列表的最大值和最小值

有人可以告诉我如何解决此错误吗? 我确实找到了正确的代码,但仍然显示错误? 我还必须编写代码以找到列表的最小数量!!
2回复

在最大值之后找到最小值的地址

我在Excel工作表的A列中有以下一组值。 整个列的最小值为0,最大值为271。 第二个最小值150出现在最大值271之后。我如何找到第一个在excel中显示150的单元格的地址?
2回复

三重态的最大值和最小值

我有一个Java计算问题,其中得到一个整数数组: 例如: 3 -2 -10 0 1 我应该计算出可以由这些整数形成的最小整数和最大三元组。 (在这种情况下,最小= -30,最大= 60) 最初,我认为最大值始终为正,最小值始终为负。 因此, 我最初的算法是:
7回复

获取数组列中的最小值和最大值

我有一个这种格式的数组: 有没有一种好方法来检索“计数”列的最小值和最大值(分别为16和48 )? 我可以使用几个循环来做到这一点,但我想知道是否有更好的方法。
2回复

C指针,最小值和最大值

我需要编写一个将num1,num2和num3作为参数的函数。 一旦函数运行完毕,发送到主函数的参数(num1,num2和num3)应该更改,以使num1包含最小值,num2包含第二大值,num3包含最大值。 我还需要编写交换功能并使用它。 这是我的代码: 这些是我得到的错误:
1回复

Gnuplot:如何绘制最大值和/或最小值[关闭]

我怎样才能显示最大值 和/或分钟。 图中图表在适当位置的值是自动的吗?