シミュレーションに測定ノイズを追加しようとしています。これは、例えばSimulinkでは可能ですが、ModelicaとSystemModelerではより難しいようです。Modelica(SystemModeler)でホワイトノイズを生成
これを行う方法に関するアイデアはありますか?
シミュレーションに測定ノイズを追加しようとしています。これは、例えばSimulinkでは可能ですが、ModelicaとSystemModelerではより難しいようです。Modelica(SystemModeler)でホワイトノイズを生成
これを行う方法に関するアイデアはありますか?
代わりにModelica.Blocks.Noise
を使用して、自分自身で外部コードを書くことを避けることができます(Modelica Standard Library 3.2.2、2016年4月3日リリース、すなわち、元の質問が尋ねられたときに助けにならなかった)。
Modelica.Blocks.Noise
のメリットの1つは、サンプリング、複数のシードなどの難しい問題が解決されていることです。
Wolfram SystemModelerで外部Cコードを使用してホワイトノイズを追加することができます。
Modelicaコードは(読みやすくなるかもしれないので、私は、コードからダイアグラムの注釈を削除しました):
package WhiteNoise "Package for generating white noise"
extends Modelica.Icons.Library;
block NoiseNormal "Normally distributed random noise"
parameter Real mean=0 "Mean value of random noise";
parameter Real stdev=1 "Standard deviation of random noise";
parameter Real tSample=0.01 "Noise sample time";
Modelica.Blocks.Interfaces.RealOutput y;
equation
when initial() then
WhiteNoise.initRandomNormal();
end when;
when sample(0, tSample) then
y=mean + stdev*WhiteNoise.RandomNormal(time);
end when;
end NoiseNormal;
function initRandomNormal
external "C" ext_initRandomNormal() annotation(Include="#include \"ext_initRandNormal.c\"");
end initRandomNormal;
function RandomNormal
output Real y;
input Real u;
external "C" y=ext_RandomNormal(u) annotation(Include="#include \"ext_RandNormal.c\"");
end RandomNormal;
end WhiteNoise;
外部コード:
ext_intRandNormal.c
#include <math.h>
#include <limits.h>
void ext_initRandomNormal()
{
srand(time(NULL));
}
ext_RandNormal.c
#include <math.h>
#include <limits.h>
double ext_RandomNormal(double timein)
{
unsigned int seed = 0;
double v1, v2, r;
timein /= 100;
seed = (timein - floor(timein)) * UINT_MAX;
do
{
v1 = 2 * ((double) rand()) /((double) RAND_MAX) - 1;
v2 = 2 * ((double) rand()) /((double) RAND_MAX) - 1;
r = v1 * v1 + v2 * v2;
} while((r >= 1.0) || (r == 0.0));
return v1 * sqrt(- 2.0 * log(r)/r);
}
私は別の 'ext_initRandomNormaWithSeed'関数を追加して、ユーザがシード値を渡すことができるようにします。この方法で、ノイズ信号を再現することができます。 'ext_RandomNormal'の' seed'変数のポイントは何ですか?何か不足していますか?それは計算されているようだが使用されていない。 –
さらに厳格にするには、状態を保存する 'ExternalObject'を使いたいかもしれません。あなたが上記のコードを使って異なる 'WhiteNoise'ソースを持っていなければならない場合、それらはお互いに"相互作用 "します(一方は他方に影響します)。 –