FAQ
FAMOS
FAMOS全般top
└OROS24ユーザーのための質問コーナー
ID.o007
Q. OROSで複数回測定したトラッキングデータの平均を求めたい
A.
高速で回転数を上昇させた場合など、ハードウェアの制約上の理由により設定した回転数のデータを取りこぼしたり、測定毎に回転数データが異なる場合があります。
このようなデータに対して平均を求めたい場合には少し問題があります。
問題とはサンプルした回転数情報が一致しないからです。
例えば、以下のようにデータが並んだ場合です。
RPM1 | DATA1 | RPM2 | DATA2 | |
1000 | 64 | 1000 | 56 | |
1020 | 50 | 1025 | 60 | |
1050 | 52 | 1055 | 58 |
このような場合、FAMOSでは2つの解決方法があります。
- 回転数の値を補間する方法
- 関数"Add"を利用する方法
以下で各方法の説明を行います。
回転数の値を補間する方法
指定した回転数の値を補間して算出して、同じ回転数情報を持たせます。このように処理すれば単純に足し合わせることができます。
関数”XYdt”を利用します。
回転数やデータとしてサンプルの値を使用します。このとき、補間する回転数間隔を 25[rpm] とします。
以下の式でデータを補間します。
NewDATA1 = XYdt( RPM1, DATA1)
NewDATA2 = XYdt( RPM2, DATA2)
RPM1 | DATA1 | RPM2 | DATA2 | |
1000 | 64 | 1000 | 56 | |
1025 | 50.3333 | 1025 | 60 | |
1050 | 52 | 1055 | 58.3333 |
このようにデータを補間すれば、簡単にデータを演算できます。
例えば。平均を求めるためには以下の式を実行させてください。
MeanData = (NewDATA1 + NewDATA2)/2
関数Addを利用する方法
先程、データを補間して指定した回転数間隔の値を算出しましたが、関数"Add" を利用すると測定したデータポイントを全て利用します。
NewDATA1 = XYof( RPM1, DATA1)
NewDATA2 = XYof( RPM1, DATA2)
MeanData = Add( NewDATA1, NewDATA2, 0) /2
RPM1 | DATA1 | RPM2 | DATA2 | RPM | MeanDATA | ||
1000 | 64 | 1000 | 56 | 1000 | 60 | ||
1020 | 50 | 1020 | 5406 | ||||
1025 | 60 | 1025 | 55.1667 | ||||
1050 | 52 | 1050 | 55.1667 | ||||
1055 | 58 | 1055 |
この方法の実用シーケンスを以下に紹介します。
下図は結果の例です。
オリジナルのデータ(data1 & data2)に対して、結果(ResultAve)は全てのデータポイントが含まれます。
注意:
データを加算する際に、関数"Add"は単調増加関数しか扱いことができません。
単調増加でない場合、並べ替えを行う必要があります。
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;_/ OROSトラッキングデータの平均を求めます。
;_/ -------------------------------------------------------------
;_/ 複数回のトラッキング解析を行い、これらの平均データを算出します。
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;変数リストで選択されているデータを処理します。
_k_Total = VarGetInit(1)
;*********************************************************
;
変数リストでどのチャンネルも選択されていない場合にはシーケンスを終了します
;*********************************************************
if _k_Total<=0
_k_ret = BoxMessage( "エラー", "変数リストで処理したい変数を
選択してください","!1")
Delete _k_*
ExitSequence
End
;*********************************************************
;最初のデータを作成します。
;*********************************************************
_k_VarName = VarGetName?(1)
;OROSデータは回転数とデータが別変数となっています。
;回転数の変数名を取得します。
;---------------------------------------------------------
_k_pos = TxWhere( _k_VarName, ":")
_k_GroupName = TPart( _k_VarName, 1, _k_pos)
_k_RPMName = TAdd( _k_GroupName, "回__数プロファイル_タコ1回__数")
;関数ADDの引数は単調増加である必要があるので
;回転数が減少する場合に備えて、ソートします。
;---------------------------------------------------------
Sequence kim_sort <_k_RPMName>, <_k_VarName>, _k_Res1, _k_Res2
ResultAve = XYof( _k_Res1, _k_Res2)
;*********************************************************
;2つ目以降のデータを作成します。
;*********************************************************
_k_Index = 2
While _k_Index <= _k_Total
_k_VarName = VarGetName?( _k_index)
;OROSデータは回転数とデータが別変数となっています。
;回転数の変数名を取得します。
;-----------------------------------------------------
_k_pos = TxWhere( _k_VarName, ":")
_k_GroupName = TPart( _k_VarName, 1, _k_pos)
_k_RPMName = TAdd( _k_GroupName, "回__数プロファイル_タコ1回__数")
;関数ADDの引数は単調増加である必要があるので
;回転数が減少する場合に備えて、ソートします。
;-----------------------------------------------------
Sequence kim_sort <_k_RPMName>, <_k_VarName>, _k_Res1, _k_Res2
_k_TempRes = XYof( _k_Res1, _k_Res2)
ResultAve = Add( ResultAve, _k_TempRes, 0)
_k_Index=_k_Index+1
End
ResultAve = ResultAve / _k_Total
Show ResultAve
delete _k_*
ExitSequence
シーケンスファイル kim_sort
;=======================================================
;
1つの変数を昇順に並べ替え、それに対応してもう1つの変数を並べ替えます。
;【使用方法】
; Sequence DATA1, DATA2, Result1, Result2
_ksort_RPM = PA1
_ksort_Data = PA2
;-------------------------------------------------------
_ksort_tempRPMX = Sort
( _ksort_RPM, 3)
_ksort_cnt=1
_ksort_Result = Leng(0,Leng?(_ksort_RPM))
While _ksort_cnt<=Leng?(_ksort_RPM)
_ksort_temp = Value
( _ksort_Data, _ksort_tempRPMX[_ksort_cnt])
_ksort_Result[_ksort_cnt] = _ksort_temp[1]
_ksort_cnt = _ksort_cnt+1
End
PA3 = Sort( _ksort_RPM, 1)
PA4 = _ksort_Result
Delete _ksort_*