• ベストアンサー

MATLABでの3次spline補間に関して

MATLABでの3次spline補間、その端点仮定条件として使用されている「節点なしの拘束条件」について教えてください。 通常、3次スプライン補間は端点において二次導関数を0と仮定すると思います。 しかし、MATLABの3次スプライン補間の結果をみると、この部分のスプライン関数の係数が0になっていません。 サイトの説明を読むと、「節点なしの端点条件(not-a-knot end conditions)」を使用していると書かれています。これがどのような仮定かということを知りたいです。 ご存じの方がいらっしゃいましたら、ご教授宜しくお願い致します。

  • OZ-EK
  • お礼率100% (2/2)

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8010/17118)
回答No.1

自然スプラインでは端点で2次導関数m0=0としますが,節点なしの端点条件を使うときは m0=(x2-x0)/(x2-x1)*m1+(x0-x1)/(x2-x1)*m2 とします。2次導関数を外挿していることになります。

OZ-EK
質問者

お礼

f272様 ご回答ありがとうございます。 m1,m2からm0を推定するということと理解しました。自身でプログラムを組んで確認したいと思います。 何の手がかりもない状況だったので、大変助かりました。 ありがとうございます。

関連するQ&A

  • スプライン補間

    スプライン補間 なぜ、スプライン補間の両端点の2次微分はゼロなんでしょうか? 境界条件というものがあるようですが、意味が分りません。 詳しく教えてください。

  • スプライン補間

    スプライン補間 空間座標において,各点の座標( x(t),y(t),z(t) ) ( t:時間 )と速度ベクトル( u(t),v(t),w(t) )( u,v,w,はそれぞれx,y,z軸方向の速さ )がわかっている時,スプライン補間して各点の間の座標を知りたいのですが,スプライン補間には複数のスプライン関数があるようでどれを用いるのがベストなのかがわかりません.各関数の特徴,使用条件などを教えていただきたいです,

  • スプライン関数(spline)について

    スプライン関数(spline)について matlab初心者です。 データ数が異なる2つのデータ群があり、その個数を揃えるために matlabのスプライン関数を使って揃えてみては、とアドバイスをいただいたのですが どのように行えばよいか分かりません。 個数を揃えたい理由は、その後の検定をスムーズに行いたいためです。 (SPSSを使うのでデータ数が揃っている必要があるようです。) 例えば、A,Bという2つの条件で5秒ごとの心拍を測定するとして、 A[80,82,84,86,82,84,93,94,84,87](データ数が10個) B[76,83,86,90,94,95,93,87,86,89,93,79,90](データ数が13個) となり、Bの13個のデータを10個に揃えるにはどのような プログラムを組めばよいのでしょうか。 ご存知の方がいらっしゃいましたら、ご教授宜しくお願い致します。

  • ダイアログベースの3次Spline補間のプログラム

    現在、Visual C++ 2008 Express Editionを使用して下に示すようなダイアログベースの3次Spline補間のプログラムを作成しています。 各節点間を等分割するほうはできたのですが、各区間を同一刻み幅で算出するほうが、なかなかできません。 どこをどうしたらいいかがさっぱりです。 以下にプログラムの一部(各区間を同一刻み幅で計算する部分)を示しますので、教えてください。 わからない点は、dnの配列に入ってくる分割数が合っているときと少ないときがあることです。プログラムの後に使用した入力データと、dnの中身を参考までに掲載します。 ============▼プログラムの一部=========== /* n:全点数(int), num:全節点数(int),xn,yn:節点(double型のarray),dX:全区間(xn[0]~xn[num-1])の刻み幅(double) * dn[]:各区間の分割数(int),xx,yy:Spline補間による点(節点を含む,double),x計算された補間点のx座標(double) Cub(double):3乗する関数,Sqr(double):2乗する関数,a[],b[],c[],d[]:3次Spline補間に用いる3次関数の各係数*/ //nの初期化 n =0; //テキストボックスから刻み幅を取得 dX = double::Parse(DX->Text::get()); //各区間の分割数を計算し、全点数を求める for(i=0;i<num-1;i++){ dn[i]=(int)((xn[i+1]-xn[i])/dX); n +=dn[i]; } //xx,yyを全点数+1(最後の節点を含むために+1をしている)で領域確保 xx=gcnew array<double>(n+1); yy=gcnew array<double>(n+1); //ループインデックスを初期化 i=0,j=0; //補間点のx座標を求めながらy座標を算出 for(x=xn[0];x<=xn[num-1];x+=dX){ if(!((xn[j]<=x)&&(x<xn[j+1]))){ j++; } if(i>n+1){ break; } xx[i]=x; yy[i]=a[j]*Cub(xx[i]-xn[j])+b[j]*Sqr(xx[i]-xn[j])+c[j]*(xx[i]-xn[j])+d[j]; i++; } =======▼入力データ(csvファイル)=========== xn yn 0.904 7.54 1.002 13.86 1.104 23.42 1.207 36.61 1.305 52.91 1.403 73.4 1.505 97 1.603 123 1.706 151.3 1.808 182.6 1.906 215.3 2.009 249.2 2.107 284.6 2.209 321.6 2.312 359 2.41 398.1 2.571 438.7 2.669 504.9 2.772 548.3 2.869 593 2.972 639 3.075 687 3.172 736 3.275 787 3.378 840 3.476 895 3.578 951 3.676 1011 3.779 1073 3.876 1136 3.979 1204 4.077 1276 4.18 1353 4.277 1440 4.38 1543 4.483 1762 4.585 2082 4.683 3445 4.786 5598 4.888 7120 4.991 8080 =======▼dnの中身=========== Excelでの計算値 プログラムでの計算値 --------------------------------------- 98 97 102 102 103 102 98 97 98 98 102 101 98 98 103 102 102 102 98 97 103 102 98 98 102 101 103 102 98 98 161 161 98 97 103 102 97 97 103 102 103 103 97 96 103 102 103 103 98 97 102 101 98 98 103 102 97 96 103 103 98 97 103 102 97 97 103 102 103 102 102 102 98 97 103 102 102 102 103 102 上の表の右側はダイアログ上で、「区間間隔」をクリック(各ラジオボタンをクリックすると右横のテキストボックスが入力できるようになります。)してテキストボックスに0.001を入れた時の結果です。

  • matlabのメモリ制限  と interp3 'spline'

    マトラブには使用するメモリに制限が掛けられていて 物理メモリを大量に積んでいても有効に使われない。 という話を聞いたのですが、本当でしょうか。 もしそうであれば、制限を外し方法を教えて頂きたいです。 ちなみに 3次元の補間関数interp3をmetodを'spline'にして実行するとout of memoryで止まりまる為、メモリ制限があれば外そうと考えています。 ただ methodを'cubic'にすると動くのですが、 ヘルプによれば、cubicの方がメモリ使用量が多そうなので エラーメッセージに関係なく、別の原因で止まっていることも考えられます。 別の原因について、何か思い当たる事がありました そちらの方もお願いします。

  • 補間曲線を関数で求める

    いくつかの離散的なデータに対する補間曲線を求めたいです。 また、その補間曲線を関数を用いて求めることを行いたいのですが、 分かるかたが居ましたら、具体的な方法について教えて頂けないでしょうか? 使用するデータは二次元のデータになり、総数としましては約10点程です。 具体的なデータは以下のようになります。 x y 22.5 672 27.5 491 32.5 331 37.5 269 ・ ・ ・ この様に続いているデータに対して 次数が2以上の曲線を関数で求めたいのです。 (例:3x^2+4x+3)。 スプライン曲線や重回帰法などを見ておりますが、 よく理解できません。 どうぞよろしくお願いします。

  • MATLABによるFFT

    MATLABのfft関数を使用して,フーリエ変換してPSDを算出すると,スペクトルの周波数領域での積分値が元データの二乗平均値と一致しないのですが,原因は何が考えられるでしょうか?FFTの出力がフーリエ係数であれば一致するはずなのですが.

  • MATLABでのwhile文の条件について

    MATLABでのwhile文の条件について いつもお世話になっております。 MATLABでwhile文を用いる際、その条件として行列中の特定の次元の値が存在するかどうかという条件を用いたいと考えています。 例えばsize(a)=(10 10 50)のaという画像データを読む際に、a(:,:,1)から順番に読み込んでいって a(:,:,50)で自動に止まるようなwhile文を作りたいと考えています。 つまりこの場合は順番に読み込んでいって、a(:,:,51)が存在しないならばwhile文が終了するようなプログラムを行いたいと考えております。 for文を用いればすぐだとは思いますが、どのようなデータにも入力引数なしで応用が出来ないかと思いましてご質問させていただきました。 もし以上の条件を満たす適当な関数などございましたら、ご一報いただけたらと存じます。

  • 三次元形状曲面の導出法

    数学板でも質問したことなのですが、アドバイスもあってこちらに流れてきました。 質問番号3464667 に関連した質問なのですが 格子点上に並んでいない(x,y)と(dz/dx,dz/dy つまり各方向の傾き)がわかっている条件で三次元曲面形状を導出するアルゴリズムを作成しました。最小二乗法を基本としたアルゴリズムをフォートランで作成したのですが、なぜスプライン関数を使わないのかという指摘を受けました。 スプライン関数は曲線では非常に有力な補間法であることは理解しているのですが、格子点上に並んでいないデータでスプライン曲面を作るのは境界のつなぎ合わせや、パラメトリック曲線をどう作ればいいのかよくわからなくて敬遠したのですが、実際スプライン関数を用いて三次元形状を導出することは可能なのでしょうか? また近似曲面としてβスプライン関数やナーブス曲面は近似関数として適当なのでしょうか?(コンピュータグラフィックスの世界でしか使わない??) よろしくお願いします。

  • 3次スプライン補間?

    3次スプライン補間ですが、3次関数で補間するので既知の3点より、 補間したい値を求めると思っていたのですが、 下記の資料を見ると、既知の2点から値を求めています。 接線を使って、計算しているみたいですが、イマイチ分かりません。 分かりやすく教えていただけないでしょうか? http://www.caero.mech.tohoku.ac.jp/publicData/Daiguji/Chapter4.pdf