首页 > 解决方案 > 给定某些条件,为数组元素赋值

问题描述

假设我有向量

Real x[5]={1,2,3,4,5};

Real y[5]={0,0,0,0,0};

y我想为给定某些条件的元素赋值x,例如,对于x大于或等于的每个元素3,对应的y应该设置为1,对于每个x<3: y=sin(x)

在matlab中,我会写如下:

  y(x>=3)=1;
  y(x<3)=sin(x(x<3));

所以

x=[1 2 3 4 5]

结果是

y=[sin(1) sin(2) 1 1 1]

在 Modelica 中可以做类似的事情吗?如果可以,怎么做?

标签: arraysvectorindexingmodelica

解决方案


不幸的是,Modelica 中没有数组过滤,所以x>=3它不起作用,也没有任何可用的东西可以与之相比。

但是仍然有一些方法可以得到结果向量,这取决于你想要一个方程还是一个算法。在使用方程式的模型中,您可以例如使用带有一个迭代器的数组构造函数

model DemoModel
  Real x[5]={1,2,3,4,5};
  Real y[:]= {if i >= 3 then 1 else sin(i) for i in x};
end DemoModel;

使用这种方法,所有元素都被一次分配。在模型中,它不可能只更新符合条件的值(或者至少我不知道该怎么做),因为:

  • 在翻译过程中必须知道矢量大小
  • 向量的每个元素都需要一个方程

使用过滤器,方程的数量会动态变化,具体取决于值x和条件。

在函数内部你有更多的可能性(你可以有灵活的数组大小),但是当你在模型中使用函数的输出时,你又面临着同样的限制。


推荐阅读