From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.
We appreciate your patience as we improve our online experience.
From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.
We appreciate your patience as we improve our online experience.
10-29-2015 02:36 AM
現在、2次関数(a2*x^2+a1*x*+a0)でフィッティングするプログラムを作成しているのですが、
フィッティングパラメータに、a2>0や、10<a1<20など、範囲を指定してフィッティングする方法があれば、
教えていただけますでしょうか?
宜しくお願い致します。
10-30-2015 02:36 AM
nari 様
一般多項式フィットVIには、Coefficient Constraint(係数制約)という入力があり、
特定の次数に対して係数を指定することができます。
このパラメータで特定の範囲になるように指定しては如何でしょうか?
上野
10-30-2015 04:25 AM
上野様
コメントありがとうございます。
係数制約では係数の値が固定されてしまいます。
ここで範囲指定する方法があれば、詳細に教えていただけると幸いです。
10-30-2015 04:53 AM
途中から失礼します。
LabVIEW では、“パラメーター境界”の入力があるフィッティング VI を使うと、係数の範囲を制約してフィッティングすることができます。
確認したのは LabVIEW 2014 だけですが、2次関数の場合、「制約付き非線形フィット」が対応することになると思います。
他に“パラメーター境界”の入力があるフィッティング VI の「線形フィット」、「指数フィット」、「累乗フィット」、「ガウスピークフィット」、「対数フィット」ですが、いずれも2次関数には対応していないので、面倒な「制約付き非線形フィット」を使うことになると思います。
昔、自分用に作ったサンプルを添付しました。
添付ファイルの LabVIEW バージョンは 2014 です。
DefFunc_2nd.vi は、2次関数の式を設定した VI です。
NonlinearCurveFit_bound.vi がサンプルプログラムです。
NonlinearCurveFit_bound.vi のフロントパネルを開いてください。
Path of User Define Function VI 文字列制御器で、2次関数の式を設定する DefFunc_2nd.vi ファイルを保存した場所を設定します。
この設定をするだけで、NonlinearCurveFit_bound.vi を実行すると、係数の範囲を制約したフィッティングの模擬が確認できます。
NonlinearCurveFit_bound.vi を実行すると、計算が実行され、計算結果が右側の Fitting Result 配列およびグラフに表示されます。
ここで、DefFunc_2nd.vi ファイルを保存した場所は、フォルダーではなく、DefFunc_2nd.vi ファイルまでを指定する必要があります。
応用として、フィッティング関数の式を設定する VI を複数、作成することで、ファイルを保存した場所の指定を変更すれば、簡単に別の関数でフィッティングできます。
他の設定としては、NonlinearCurveFit_bound.vi フロントパネルの Parameter Limits クラスターで制約する係数の範囲を設定します。
Min 配列が最小範囲、Max 配列が最大範囲を設定します。
配列番号0が0次、配列番号1が1次、配列番号2が2次の係数の範囲を設定します。
範囲を制約したくない時、例えば a2 > 0 という条件は、最小値は 0 に設定して制約したいが、最大値は制約したくないような時は、配列番号2の Min に 0 を入力し、Max に Inf を入力してください。
Min 側の範囲を制約させない時は、-Inf を入力してください。
どちらも制約させない時は、Min に -Inf を、Max に Inf を入力してください。
空欄ですと、他に範囲を制約したい係数の設定値が別の係数にずれて設定されてしまいます。
Parameter Limits クラスターの値を変えて、VI を実行すると、係数の範囲が制約されていることがわかると思います。
NonlinearCurveFit_bound.vi フロントパネル真ん中の Make Simulate Data は、サンプルの模擬データを作成するための数値を設定します。
noise level に 0 より大きい値を入力すると、設定が同じでも VI を実行する度に毎回、計算結果が変わってしまうので、係数の範囲を変更した時の効果がわかりにくくなります。
そこで、係数の範囲を制約した効果を見たい時は noise level に 0 を入力してください。
その代わり、noise level に 0 を入力すると、グラフ上では模擬データがフィッティング計算結果に隠れてしまいます。
10-30-2015 05:16 AM
確かに自分の提案はよくないです。その点、KoutenY 様の提案は素晴らしいと思います。
11-01-2015 11:50 PM
KoutenY 様
分かりやすい解説とサンプルプログラムで大変参考になります。
これでやりたかったことができそうです。
まことにありがとうございました。