11-21-2014 02:32 PM
解決済! 解決策の投稿を見る。
11-21-2014 09:51 PM - 編集済み 11-21-2014 09:52 PM
スプラインインターポラントは、インターポラントを求める関数を予め呼び出しておきます。
例示の3点の場合、以下のようになります。
versionが古いので、関数アイコンの見た目は違うかも知れませんが、先に呼び出されているのが
インターポラントを求めておく関数、ループ内にあるのが、知りたい x に対してスプライン補間値を
求めている関数です。
ただし、スプラインですので、制御ラインは滑らかですが、制御点のレンジから外れることが
往々にしてありますので、ご注意ください。今回の3点だと、最高温度は40.28℃まで達しますし、
初期の温度勾配は、0分と60分の目標値の傾きより大きいことにご留意ください。
また、スプラインの特徴として、一定温度に保ちたい区間があったとしても、その間は平らには
なりませんし、制御点の置き方がまずいと、途中がとんでもなく大きくなったり小さくなったりします。
(特に制御点が近すぎる組がある場合)
温度制御では、最高温度がいくつまでいってはいけない、という制約があることも多いと思います。
線形補間の方が無難な気はします。
11-22-2014 10:57 PM
KSSiS3939 さん、こんにちは。
M.Shiraishiさんのご回答で解決済かもしれませんね。 ちょっと違う書き方のサンプル(添付)を示しますので、ご参考に。
添付viファイルでは、3通りの計算方法を示しました。
1.「スプライン補間1D」関数の出力をそのままグラフ表示
2.「スプライン補間1D」関数の区分多項式出力を、「補間多項式を評価」関数に接続し、「補間多項式を評価」の出力をグラフ表示
3.「スプライン補間1D」関数の区分多項式出力を、多項式の係数として計算し、グラフ表示
です。
ここで、3番は、0分~60分の部分に対応する多項式なので、60分~120分の間のグラフ表示がずれていくのがおわかり頂けるでしょう。60分~120分に対応する多項式係数を使えば、ちゃんと合います。(viにはコメントいれてあります。)
温度制御は、熱源(熱交換器)・媒体の熱抵抗・熱容量次第で時間軸が変わります。
よって、一般によく言われる、「温度は急激には変わらない」ということは厳密には正しくないのでは?と思います。
熱容量の小さな物体に、熱抵抗の小さい状態で、十分な熱交換器を用いて、適切な制御を行えば、秒単位でも静定します。
ですので、ご希望の制御対象・制御方法によって、スプライン補間が適切なのか、直線補間が適切なのか、制御定数はどう設計すべきなのか、が異なるかと思います。
滑らかなカーブを描くということでスプラインをご紹介しましたが、十分に速い応答が得られるならば、直線補間が良いとも考えられます。適宜ご調整・ご判断されると思いますので、蛇足ながら補足いたしました。
では、
お力になれたかわかりませんが、ここらへんで。
11-22-2014 11:01 PM
すみません、補足です。
添付したサンプルファイルの、time配列、temperature配列に、値を入力してみてください。
いれる値は、添付画像 スプライン補間1D.png をご参考に。
time 0 , 60, 120
temp 37, 39, 20
データを初期値に指定しなかったので、ダウンロードすると配列が空っぽになってると思います。
では、よろしくお願いします。
11-29-2014 09:20 AM
11-30-2014 09:54 AM
スプライン補間後のデータですが、その補間されて増えたデータの個数を数える方法はありますでしょうか?
Excelから読み出し、補間することは出来ましたが個数の数え方がわかりませんでした。。。
ご教授お願いいたいします。
11-30-2014 09:55 AM
スプライン補間後のデータですが、その補間されて増えたデータの個数を数える方法はありますでしょうか?
Excelから読み出し、補間することは出来ましたが個数の数え方がわかりませんでした。。。
ご教授お願いいたいします。
11-30-2014 09:07 PM
KSSiS3939さん、こんにちは。
LabVIEWで、配列の大きさ(長さ)を知るには、関数パレット > 配列 > 配列サイズ です。
それとも
Excelのなかで数えてLabVIEWに渡す、という話ですか?
以上です。
11-30-2014 11:59 PM
12-01-2014 05:02 AM
S.A.M.さんのおっしゃるように、配列の長さ=データの数 ということです。
しかしながら、ここで理解して頂きたいのは、スプライン補間の間のデータの数は
LabVIEWが勝手に決めたのではなく、スプライン補間の「このXでの補間値はいくらか?」というのは
プログラマが与えているわけですので、出てきた配列を数える、というものではなく、
例えば私が投稿した例では、「0分から120分まで、1分おき」なので、初めからループカウンタに
121をつないで、1回1回、スプライン補間を呼び出しています。
このとき、最初に全部スプライン補間の配列を作って表示したので、かえって分かりにくかったのかも知れません。
なので、以下のようなviにしてみました。
①最初に、Excelファイルの制御点を全部読んでしまう。(viでは、初めからX,Yの配列ができているとする)
②その制御点で、スプラインインターポラントを作らせる。
③制御に入る前に、ループを回す回数を考える。ここでは、1分おきとして、Xの最大値まで、でいいので、
Xの最大値+1 が、ループを回る回数です。
④実際の制御では、1分ごとに(viでは、1分も待っているとかったるいので、時刻の単位は「秒」とみなして
1秒ごとです)、その時刻でのスプライン補間値を、「元の制御点と、予め求めたインターポラントから」
計算させて、目標値を得ます。
これを実行すると、④にて、時々刻々、目標値が更新されていくのが分かると思います。
さらに、履歴をプロットしましたので、多少はわかりやすいかと。
この方法は、
「先にExcelを全部読んでしまう」
「インターポラントが求まっているので、制御のループでは『Excelの次の行』とか気にする必要が無い」
といったところが、メリットになるかと思います。配列の個数とか、補間の個数とかも、気にしないで良いです。