1

Modelicaでは、Wolfram 言語と同様に機能する call を実装したいと考えてfunctionいます。clipClipつまり、関数は値のリストを取り、同じ長さxのベクトルを返します。ここで、各コンポーネントには区分関数があります。y

y_i := x_i for min ≤ x_i ≤ max, v_min for x_i < min, and v_max for x_i > max

したがって、次の結果が表示されるはずです。

clip( {-3,-2,-1,0,1,2,3} , {-2,2} )           // { -2, -2, -1, 0, 1, 2, 2 }
clip( {-3,-2,-1,0,1,2,3} , {-2,2}, {-10,10} ) // { -10, -2, -1, 0, 1, 2, 10 }
clip( {-3,-2,-1,0,1,2,3} )                    // { -1, -1, -1, 0, 1, 1, 1 }

私のアプローチは次のとおりです。

function clip "Clip values so they do not extend beyond a given interval"
    input Real x[:] "List of values to be clipped";
    input Real[2] x_range := {-1, 1} "Original range [min,max] given as a list (default = {-1,1})";
    input Real[2] extremes := x_range "Extreme values [v_min, v_max] given as a list (default {min,max})";
    output Real y[size(x, 1)] "Clipped values";
protected
    Integer n := size(x, 1) "Length of the input vector x";
algorithm
    for i in 1:n loop
        y[i] := if x[i] < x_range[1] then extremes[1] elseif x[i] > x_range[2] then extremes[2] else x[i];
    end for;
end clip;

ここで、デフォルトの式 forは、それ自体がデフォルトの式を持つextremes入力を参照することに注意してください。x_range{-1, 1}

残念ながら、Wolfram SystemModeler 12.0 とOpenModelica (OMEdit v.1.13.2)では間違った結果が得られ、コンパイルすらできません

私の質問は次のとおりです。

  1. 上記の関数は、仕様に従って正当な Modelica コードですか?
  2. (1.)に関係なく、これを行う別の方法はありますか?
4

2 に答える 2

2
  1. はい、合法です。入力のデフォルトが他の入力などに依存することは、Modelica 仕様で明示的に許可されています。

https://specification.modelica.org/master/Ch12.html#positional-or-named-input-arguments-of-functions

デフォルト値は他の入力に依存する場合があります (これらの依存関係は関数内で非循環的でなければなりません) – それらの他の入力の値はデフォルト値に代入されます (その入力のデフォルト値が別の入力に依存する場合、このプロセスを繰り返すことができます) )。入力のデフォルト値は、関数内の非入力変数に依存しない場合があります。

  1. 代替品はチェックしていません。
于 2019-12-06T11:30:26.613 に答える
1
  1. for ループの代わりに配列構築を使用できます。

    y := {if x[i] < x_range[1] then extremes[1] elseif x[i] > x_range[2] then extremes[2] else x[i] for i in 1:n};

于 2019-12-06T18:57:19.587 に答える