2016-03-28 26 views
1

私はModelica(Dymola-environment)には比較的新しいので、私はModelicaの乱数生成のような単純な問題を解決することができないという非常に必死になっています。あなたは私を助けることができます。Modelicaの単純な乱数発生に関する割り当ての問題

単純な関数randomは、入力シードseedIn[3]を使用して0と1の間の乱数を生成し、次のタイムステップまたはイベントの出力シードseedOut[3]を生成します。 (z,seedOut) = random(seedIn); は完全に正常に機能します。

問題は、を次のseedIn[3]として使用して、この割り当てを時間の経過とともに計算する方法をModelicaで見つけることができないことです。これは非常にイライラです。

私の簡単なプログラムは以下のようになります。私は、アルゴリズムの割り当て、初期条件と方程式とほぼすべての可能性を試してみましたが、それらのどれも働かない

*model Randomgenerator 
Real z; 
Integer seedIn[3](start={1,23,131},fixed=true), seedOut[3]; 
equation 
    (z,seedOut) = random(seedIn); 
algorithm 
    seedIn := seedOut; 

end Randomgenerator;* 

。次のタイムステップで単にseedOutを使用したいだけです。 1つの問題は、アルゴリズムセクションに入るとき、初期条件も式セクションからの値も使用されないことであると思われる。

+0

おそらくwhen式や文をreinit(seedIn、seedOut)とする必要があります。 –

+0

[DLR Noise](https://github.com/DLR-SR/Noise)と[DLR Advanced Noise](https://github.com/DLR-SR/AdvancedNoise)ライブラリにも興味があります。または、http://impact.github.io/のNoiseを検索してください。 – matth

+0

この[質問](http://stackoverflow.com/questions/14943950/generate-white-noise-in)のModelicaでの乱数生成の詳細-modelica-systemmodeler) – jrhodin

答えて

1

'sample'と 'reinit'関数を使用すると、以下のコードは 'sample'で指定された頻度で新しい乱数を計算します。 seedInの「開始値」を定義する方法に注意してください。

model Randomgenerator 

    Real seedIn[3] = {1,23,131}; 

    Real z; 
    Real[3] seedOut; 

equation 
    (z,seedOut) = random(seedIn); 
    when sample(1,1) then 
    reinit(seedIn,pre(seedOut)); 
    end when; 

end Randomgenerator; 

'pre'関数は、変数の前の値を使用することができます。これを使用しなかった場合、出力 'z'は一定の値を返してしまいます。 'reinint'関数に関する2つの事柄は、 'when'の使用を必要とし、 'Real'変数/式を必要とするため、seedInとseedOutは現在 'Real'として定義されています。

私が使用したシンプルな「ランダム」ジェネレータは:

function random 

    input Real[3] seedIn; 

    output Real z; 
    output Real[3] seedOut; 

algorithm 
    seedOut[1] :=seedIn[1] + 1; 
    seedOut[2] :=seedIn[2] + 5; 
    seedOut[3] :=seedIn[3] + 10; 

    z :=(0.1*seedIn[1] + 0.2*seedIn[2] + 0.3*seedIn[3])/(0.5*sum(seedIn)); 

end random; 

は確かにこの操作を実行するアプリケーションに応じて、他の方法があります。少なくともこれはあなたに何かを始めるでしょう。それが役に立てば幸い。

関連する問題