見出し画像

測定精度を上げる工夫/micro:bit応用講座

こんにちはロック204チャンネルです。
今回はマイクロビット応用講座 「測定精度を上げる工夫」を送りします。

動画の内容は
測定精度をあげるには異常値を取り除くことが大切です。
一般的には 標準偏差などを用いて異常値を取り除くことが行なわれていますが、
少数例の場合 測定値より最大値 最小値を取り除く手法が取られることがあります。
今回はこの最大値、最小値を削除する カスタムブロックを作成し 超音波 センサーでの測定に応用しましたので紹介します。

こちらが 測定した 値が入ったリストより 最大値と最小値を取り除く カスタムブロックのコードになります。
詳しくはnoteの方で 公開していますのでご覧ください。

// カスタムブロック: 配列から最小値と最大値を取り除く
// numbers: 数値のリスト
namespace ArrayUtil {
    /**
     * 配列から最小値と最大値を取り除く
     * @param numbers 数値のリスト
     * @returns 最小値と最大値を取り除いた新しい配列
     */
    //% block="配列から最小値と最大値を取り除く %numbers=variables_get(myList)"
    export function removeMinAndMax(numbers: number[]): number[] {
        if (numbers.length < 3) {
            // 配列に2つ以下の要素しかない場合、全ての要素を削除する
            return [];
        } else {
            let minIndex = 0;
            let maxIndex = 0;
            let minValue = numbers[0];
            let maxValue = numbers[0];
            // 最小値と最大値のインデックスを見つける
            for (let i = 1; i < numbers.length; i++) {
                if (numbers[i] < minValue) {
                    minIndex = i;
                    minValue = numbers[i];
                }
                if (numbers[i] > maxValue) {
                    maxIndex = i;
                    maxValue = numbers[i];
                }
            }

            // 最小値と最大値を取り除いた新しい配列を作成する
            let result: number[] = [];
            for (let i = 0; i < numbers.length; i++) {
                if (i !== minIndex && i !== maxIndex) {
                    result.push(numbers[i]);
                }
            }

            return result;
        }
    }
}

カスタムブロックは JavaScriptのエクスプローラー より 追加しています。
こちらのコードを追加すると右図のように、カテゴリーにArrayUniが表示されます。
カスタムブロックは配列から最小値と最大値を除いた結果を参照するブロックのみです。

こちらがカスタムブロックの使用例となります。
まず配列にデータをセットします。 そしてカスタムブロックに配列を渡し、最大値、最小値を除去し、再び配列に格納し 内容を表示するプログラムとなっています。
右は、 最小値1と最大値12が除去された結果を表しています。

このカスタムブロックを使用し、超音波センサーの測定に応用しました。
測定1cm刻みで30cmまで、各層で10回超音波センサーで所要時間(マイクロ秒)を測定し平均値を求めました。
左のグラフは カスタムブロックを 使用せずに測定した結果です。 決定係数は0.9832となりました。
右のグラフではカスタムブロックを使用し測定した結果です。  決定係数は0.9979と使用していない時より高くなっていることが わかります。
また視覚的にも 使用しない時よりも 滑らかな直線が得られたことがわかります。

このカスタムブロックを使用し、超音波センサーの測定に応用しました。
測定1cm刻みで30cmまで、各層で10回超音波センサーで所要時間(マイクロ秒)を測定し平均値を求めました。
左のグラフは カスタムブロックを 使用せずに測定した結果です。 決定係数は0.9832となりました。
右のグラフではカスタムブロックを使用し測定した結果です。  決定係数は0.9979と使用していない時より高くなっていることが わかります。
また視覚的にも 使用しない時よりも 滑らかな直線が得られたことがわかります。


この記事が気に入ったらサポートをしてみませんか?