■ 標準偏差/分散(統計学) (KV File: Stand_deviationx_xxx 

⇒ TO Home Page
内容

◆ 分散(標準偏差)を、メモリ上に「標本値」を記憶させることなく求めます。

装置の生産データなどから、リアルタイムで「標準偏差」の算出を求められる事が有ります。
標準偏差」は「分散」の平方根をとる事なので、まず「分散」を求めてみます。

標本数が少量の場合は問題がないのですが、データ量が増えてくるとメモリー容量の問題や処理時間の問題がでてきます。

分散」は、抽出したデータから「平均値」を引いたものの自乗 の総和を標本数で割ったものです。
上記の事を考えると…データが1つ増える度に「平均値」が変動します。メモリ上に有るたくさんあるデータの先頭から最後まで標本数分、
各々のデータからいちいち「平均値」を減算する作業をし、自乗し、それの総和を求めなければなりません。
データがやってくる度に…  そんな無駄なことにMPUパワーを使いたくないのと、メモリ上に標本データを置いておきたくないので
インクリメンタルに計算できるルーチンを書いてみました。

比較として、標本値をメモリに置いて計算するルーチンも記述しています。


こ のサンプルは他と 独 立したプロジェクト に しました。
下の「●コードをダウンロード」からダウンロードしてください。検証用のモニタデバイスは「●登録モニタをダウンロード」からダウンロードしてください。

●PDFを表示  ●コードをダウンロード   ●登録モニタをダウンロード
◆ 初期ルーチン
このサンプルの実験用の値を定義します。


・乱数の発生範囲は1〜20。それに50を加算します。
・初期起動時は[Element]が"0"なので、標本数は10個発生します。

◆ 乱数発生ルーチン
このサンプルの実験用の乱数を発生させます。

・「基本編」ソートで使用したルーチンをそのまま使っているので、"0"は生成されません。
・発生した数値に[OFSET]("50"を定義)を加算して[FM0]から[Element]分(10個)作ります。
◆ テスト操作


・PLC起動時に初期乱数をセットしますが、[乱数生成]をTrueにする(デバイスをダブルクリック)すると、違った乱数をセットします。


・[Start]をTrueにする(デバイスをダブルクリック)するとテストを開始します。



・標準偏差は10倍されて整数化しています。必要に応じて小数部の桁を調整してください。

・「サブルーチン10」は、インクリメンタルに「分散」と「標準偏差」を演算するルーチンです。
・1個目〜の結果はEM0から「分散」。EM500〜「標準偏差」が順次代入されます。

・「サブルーチン11」はメモリ上にある標本の値から、いちいち計算します。
・1個目〜の結果はDM0から「分散」。DM500〜「標準偏差」が順次代入されます。

・割算やべき乗計算を行うので「浮動小数点」または「倍精度浮動小数点」で演算してください。

● インクリメンタルの計算(サブルーチン10)



● 蓄積した標本からの計算(サブルーチン11)






上 の画面にある登録モニタウィンドウを用意しています。 ●登録モニタをダウンロード からダウンロードしてください。
・ シミュレートモードで実行してください。
・確認用に「サブルーチン11」で、( 標本値 - 平均値 )の自乗の値を、@FM0から代入しています。


◆ なぜインクリメンタルに計算できるのか


・上記の様な理由で標本データを全て保持していなくても、各標本データの総和と、自乗の総和、標本数を把握していれば、分散が導きだせます。


・如何でしたか。これで、メモリの節約とMPUパワーを無駄に使わなくて済みます。

●PDFを表示  ●コードをダウンロード   ●登録モニタをダウンロード