NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

スプライン補間について。(スプラインインターポラントの使い方)

解決済み
解決策を見る
スプライン補間のサンプル確認をし、プログラムを組もうとした際に、

スプラインインターポラント、のインターポラントの導出方法がわかりませんでした。

具体的に、
・60分間隔の温度データをスプライン補間をし、1分間隔の横軸(x)で補間したいと考えています。しかし、1分間隔の横軸のインターポラントの導出方がわかりませんでした。。。

・0-60ー120で37-39ー20℃とした時、スプライン補間はどのようになりますでしょうか。

よろしくお願いいたします。
0 件の賞賛
メッセージ1/10
6,743件の閲覧回数

スプラインインターポラントは、インターポラントを求める関数を予め呼び出しておきます。

 

例示の3点の場合、以下のようになります。

 

141122-sample1.png

 

versionが古いので、関数アイコンの見た目は違うかも知れませんが、先に呼び出されているのが

インターポラントを求めておく関数、ループ内にあるのが、知りたい x に対してスプライン補間値を

求めている関数です。

 

ただし、スプラインですので、制御ラインは滑らかですが、制御点のレンジから外れることが

往々にしてありますので、ご注意ください。今回の3点だと、最高温度は40.28℃まで達しますし、

初期の温度勾配は、0分と60分の目標値の傾きより大きいことにご留意ください。

 

また、スプラインの特徴として、一定温度に保ちたい区間があったとしても、その間は平らには

なりませんし、制御点の置き方がまずいと、途中がとんでもなく大きくなったり小さくなったりします。

(特に制御点が近すぎる組がある場合)

 

温度制御では、最高温度がいくつまでいってはいけない、という制約があることも多いと思います。

線形補間の方が無難な気はします。

メッセージ2/10
6,733件の閲覧回数
解決策
受理者 KSSiS3939

KSSiS3939 さん、こんにちは。

 

M.Shiraishiさんのご回答で解決済かもしれませんね。 ちょっと違う書き方のサンプル(添付)を示しますので、ご参考に。

 

添付viファイルでは、3通りの計算方法を示しました。

 1.「スプライン補間1D」関数の出力をそのままグラフ表示

 2.「スプライン補間1D」関数の区分多項式出力を、「補間多項式を評価」関数に接続し、「補間多項式を評価」の出力をグラフ表示

 3.「スプライン補間1D」関数の区分多項式出力を、多項式の係数として計算し、グラフ表示

です。

 

ここで、3番は、0分~60分の部分に対応する多項式なので、60分~120分の間のグラフ表示がずれていくのがおわかり頂けるでしょう。60分~120分に対応する多項式係数を使えば、ちゃんと合います。(viにはコメントいれてあります。)

 

温度制御は、熱源(熱交換器)・媒体の熱抵抗・熱容量次第で時間軸が変わります。

よって、一般によく言われる、「温度は急激には変わらない」ということは厳密には正しくないのでは?と思います。

熱容量の小さな物体に、熱抵抗の小さい状態で、十分な熱交換器を用いて、適切な制御を行えば、秒単位でも静定します。

ですので、ご希望の制御対象・制御方法によって、スプライン補間が適切なのか、直線補間が適切なのか、制御定数はどう設計すべきなのか、が異なるかと思います。

滑らかなカーブを描くということでスプラインをご紹介しましたが、十分に速い応答が得られるならば、直線補間が良いとも考えられます。適宜ご調整・ご判断されると思いますので、蛇足ながら補足いたしました。

では、

お力になれたかわかりませんが、ここらへんで。

すべてをダウンロード
メッセージ3/10
6,720件の閲覧回数

すみません、補足です。

 

添付したサンプルファイルの、time配列、temperature配列に、値を入力してみてください。

いれる値は、添付画像 スプライン補間1D.png をご参考に。

 time 0 , 60, 120

 temp 37, 39, 20

データを初期値に指定しなかったので、ダウンロードすると配列が空っぽになってると思います。

 

では、よろしくお願いします。

メッセージ4/10
6,718件の閲覧回数
返信皆様ありがとうございます。

Excelのシートと見合わせて試行錯誤しています。

ありがとうございます!!
0 件の賞賛
メッセージ5/10
6,619件の閲覧回数

スプライン補間後のデータですが、その補間されて増えたデータの個数を数える方法はありますでしょうか?

 

Excelから読み出し、補間することは出来ましたが個数の数え方がわかりませんでした。。。

 

ご教授お願いいたいします。

 

0 件の賞賛
メッセージ6/10
6,601件の閲覧回数

スプライン補間後のデータですが、その補間されて増えたデータの個数を数える方法はありますでしょうか?

 

Excelから読み出し、補間することは出来ましたが個数の数え方がわかりませんでした。。。

 

ご教授お願いいたいします。

 

0 件の賞賛
メッセージ7/10
6,599件の閲覧回数

KSSiS3939さん、こんにちは。

 

LabVIEWで、配列の大きさ(長さ)を知るには、関数パレット > 配列 > 配列サイズ です。

それとも

Excelのなかで数えてLabVIEWに渡す、という話ですか?

 

以上です。

メッセージ8/10
6,582件の閲覧回数
こんにちは。
返信ありがとうございます。

補間したデータをLABVIEW内で数えたいです。

配列の長さ=データの数、と言うことでよろしいでしょうか?

よろしくお願いします。
0 件の賞賛
メッセージ9/10
6,573件の閲覧回数
解決策
受理者 KSSiS3939

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の次の行』とか気にする必要が無い」

といったところが、メリットになるかと思います。配列の個数とか、補間の個数とかも、気にしないで良いです。

 

メッセージ10/10
6,555件の閲覧回数