この記事で扱っていること
- フィッティングの結果をきれいに表示する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWでは点の集まりに対して特定の方法(例えば多項式)でフィッティングをかける関数があります。そしてこの式ではフィッティングの式を算出し出力してくれます。
ただし、その結果を表示させるには少し工夫が必要な場合があります。
例えば一般多項式フィット関数は多項式で与えられた点群のフィッティングをしてくれその際の結果を「変数の各次数の係数」の配列で返してくれます。
つまり、係数だけの結果をみることになります。
これではわかりにくいので文字列に変換してうまく表示させようとするのですが、文字列表示器で上付き文字(xの二乗、のような表記)はうまく表せません。
そこで、テキストをピクチャとして表して上付き文字なども自由に表すことで、「それっぽい」見た目で表現する方法を考えてみました。
どんな結果になるか
本記事のサンプルでは適当なデータを正弦パターン関数と一様ホワイトノイズ関数で作り、これを多項式でフィッティングさせています。
フィッティングの際の多項式の次数を指定し、結果を表示させ、その際のフィッティングの式を表示させるようにしています。
プログラムを実行すると、結果を表示してくれます。
式の表示フォントはいくらでも変更可能ですが、フォントによっては上付き文字のバランスがおかしくなるのでそこは適宜バランスを調整する必要があります。
プログラムの構造
プログラム全体は以下のような構成としてみました。
データ生成の部分は本記事の本質ではないですが、以下のようなサブVIとしています。
多項式フィットの関数を使用してフィッティングする場合には、データそのもの(Yの値)以外にこれに対応するXの値も必要となります。今回はランプパターン.viでXの値を用意しました。
メインとなる部分はフィッティングの関数からの結果配列をForループの自動指標付けで要素に分解し、その値を適宜変換してピクチャ化しています。
変換には以下のようなサブVIを使用しています。関数としてはポイントにテキスト描画の関数しか使っておらずあとはバンドル系の関数を配置しているだけですが、ほぼ似たような処理を繰りかえすのでメインのviにベタ書きで置くよりもこの方が多少はスッキリします。
なお、Forループの中身には左下に正負の符号をつける仕組みを設けています。この部分のうまい実装が他に思いつかなかったため、
- 数値と数値の間に+をつける必要がある場合、テキストの先頭に「+」をつける
- 式の先頭に「+」をつけない
というルールの下ケースストラクチャを入れ子にしています。
入れ子になっているものの大したことはしておらず、数値を文字列に変換する関数の出力結果である文字列に+をつけるか否かを指定しているだけです。
また、Forループ後半でも、変数xの次数が0の場合には「x^0」のような形にならないようにケースストラクチャを入れ子にしています。
なおフォントの設定は、Forループに入る前の、シフトレジスタの初期化の時点で行っています。もちろん何でもいいのですが、游明朝にするとそれっぽく見えたのでこれに固定しています。
次数の高いものから並べるには
フィッティングの結果の配列は、次数の低い値の係数が配列の0から並びます。
一方で、式を表わす際には、次数の高いものから表すこともあると思います、というかその方が多いかもしれません。
そのような表示にするためには、配列を並び替える必要があり、またプログラムも少し修正する必要があります。
このような修正を加えることで、表示を並び替えることができます。
今回の記事ではフィッティングの式をそれっぽく表示させるということで紹介しましたが、何も一般多項式フィットの結果のみでしか使用できないわけではありません。
他の場面でも数式を表示させる場合に文字列表示器ではなくピクチャを使用して表示させることでフォントやサイズ、色などなど好みの表示にできるので参考になれば嬉しいです。
ここまで読んでいただきありがとうございました。
コメント