04-26-2013 07:38 AM
LabViewのLM非線形カーブフィットについて質問いたします。
私はこのVIを用いて、測定データにローレンツィアンフィットし、そのピークパラメータ(中心位置、ピーク高さ、半値幅)を抽出しようとしています。
このためLabView2011の環境でVIをコーディングしました。そのVIはこの投稿に添付しますので、ダウンロードして試しに実行してみて頂けたらと思います。
実行すれば判るとおり、LM非線形カーブフィットVIがうまく働かず、フィット結果は最適解から程遠いものとなってしまいます。
しかし、このVIのScale factorという制御器に1e6かそれより大きな値を入れて実行すると、非線形カーブフィットがうまく動き、入力データに最も近いピークパラメータ
が出てきます。
このVIでは、入力データにまずScale factorを掛け、次にLM非線形カーブフィットを行い、その結果をScale factorで割って元に戻しているだけです。つまり
LM非線形カーブフィットは、入力データのy値が大きいときにしかうまく動きません。
そこで質問ですが、
1)これはこのLM非線形カーブフィットの正常な動作なのですか?なぜ入力データのy値が小さいと動かないのでしょうか?
2)入力データがどういった条件を満たせば、LM非線形カーブフィットはうまく動くのでしょうか?
この質問に関し、皆様から何かお答え頂けたら幸いです。
どうぞよろしくお願い申し上げます。
05-01-2013 02:06 AM
フィッティングの結果は「非線形カーブフィット」停止条件の「許容範囲」にも関係あります。
今の入力値 Input PSD の Y がかなり小さい値なので、Scale factorが小さい場合は、「許容範囲」のデフォルト値「1E-8」だと足りませんので、更に小さい値を設定する必要があります。
こちらで試したところ、Scale factor =100に対し、「許容範囲」=1E-15だと、フィッティングの結果が良くなります。
ちなみに、Scale factor <= 10場合を試したところ、「許容範囲」をいくら設定してもうまくフィッティングができませんでした。
データ精度の限界らしいです。
05-07-2013 02:16 AM
hkaku様、
お返事ありがとうございます。
私の投稿に対し、viの動作検証及び質問への回答どうもありがとうございました。
hkaku様の返答に従って、私も許容範囲のパラメータいろいろ変更してみました。
たしかにこれを変えれば、scale factorがある程度小さくてもフィッティングに成功
するのですが、どういった条件を満たせば良いのかは結局わかりませんでした。
結局Labviewに付属のLM nonlinear curve fit viは、収束判定条件を入力データ
で規格化していないため、hkaku様の言われる通り、絶対値が小さいと数値計算に
おけるデータ精度が足りなくなって、うまく動かなくなってしまうようですね。私と
してはこういうカーブフィットの動作は入力データの絶対値には依存すべきでなく、
収束判定が規格化されていないのはバグではないかと思うのですが、このviがそれ
をしない以上仕方ありません。自分で規格化するしかないようです。
自分で入力データを規格化してローレンツィアンフィットするviを作ってみました。
これだと当然フィッティングはきちんと行われ、iterationの回数も、規格化しないとき
より小さくなるようです。
hkaku様にお礼申し上げると共に、この検証結果が、少しでも他の方々の参考になれ
ば幸いです。