• ベストアンサー

3次スプライン補間?

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

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

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.1

> 3次関数で補間するので  ここを誤解なさってるようです。そうはなくて、「2階微分まで連続な区分的3次関数」で補間するんです。 「n-1階微分まで連続な区分的n次関数」f(x)というのは、あらかじめ点列 k[j] (j=0,1,…, N) (これらを"knot" (「つなぎ目」という意味)と言います)が決めてあるものとし、また、f[j](x)をn次関数の列 (j=1,2,…,N)として、 k[0] ≦ x ≦ k[N]で定義される関数 f(x) が (1) k[j-1] ≦ x ≦ k[j] のとき f(x) = f[j](x) であって、しかも (2) fのxによる0階微分f(x), 1階微分f'(x), 2階微分f''(x), …, n-1階微分(f^(n-1))(x)がどれもk[0] ≦ x ≦ k[N]の範囲で至る所連続 である、という意味。  もちろん(1)から、k[j-1] < x < k[j] ならf(x), f'(x), f''(x), …, (f^(n-1))(x)が連続なのは自明。だから、xが丁度knot k[1], …, k[N-1]に等しいときにf(x)が(2)を満たすことが、f(x)が(2)を満たすための必要十分条件。つまり、   (f[j]^(r))(k[j+1]) = (f[j+1]^(r))(k[j+1]) (r=0,1,2,…, n-1; j=1,…,N-1) …(★) ということです。  n次関数ならn+1個の係数がある。(ご質問には「3次関数で補間するので既知の3点」とありますが、勝手な3次関数なら既知の4点が必要。これはラグランジュ補間ですね。)  しかし(2)の制約条件が付くため、f[j](x)は勝手なn次関数では駄目です。関数がN個あるんだから全部で(n+1)N個の係数がある。けれども、k[1], …, k[N-1]のN-1個のknotそれぞれについてn個の拘束条件(★)があるために、自由度は(n+1)N - n(N-1) = N+n だけしかない。この自由度を使って補間するんだから、結局「既知のN+n点 <x[i], y[i]> (i=1,2,…,N+n)を通るようにする」という補間をする。すなわち、   f(x[i]) = y[i] (i=1,2,…,N+n) と上記の式★とを連立した連立方程式を解くことによってfが決まるんです。  なお問題によっては、一番端のknot k[0], k[N]におけるfのr階微分が予め指定されていたり(たとえば (f^(r))(k[0])=(f^(r))(k[N])=0 (r=2,3,…,n)とか)、あるいはfが周期的( (f^(r))(k[0])=(f^(r))(k[N]) (r=0,1,…,n) )であったり、といった条件が付く場合もあり、このときにはさらに自由度が減ることになります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • スプライン補間

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

  • スプライン補間

    x=[-1,0,1,2],y=[0,1,0,0]のデータで 区間x=0~1 をスプライン補間で計算させています。 MuPAD でcubicSplineを用いた場合と C言語によるアルゴリズム辞典から作ったソフトでは計算結果が 微妙に異なります。 どちらが3次スプライン補間として正しいのかお教え願えないでしょうか? あるいはどちらも正しいとして、スプラインの種別が違うのでしょうか? 非常に漠然としていますが、よろしくお願いします。 「自分のツールだとこういう結果だった」というようなアドバイスでも大歓迎です。 X      MuPAD        C言語によるアルゴ 0      1            1 0.125  0.922851563  0.9488281 0.25   0.8203125    0.853125 0.375  0.698242188  0.7246094 0.5    0.5625       0.575 0.625  0.418945313  0.4160156 0.75   0.2734375    0.259375 0.875  0.131835938  0.1167969

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

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

  • 3次スプライン補間法について

    x=3,7,4,7,5,8,3,2,3 (秒) Y=4,7,2,3,12,6,13,5,1,24 (cm) として、 速さa(cm/秒)はa=Y/xで出てくるのですが(a=1.7,1,0.5・・・)、 それぞれの点を結ぶと折れ線グラフになりますよね? 3次スプラインという補間関数を使うと、 それぞれの点を通過する滑らかな曲線を引けるらしいのですが、 この場合、x秒における速さaを求める計算式はどのようになるのでしょうか? a=? ご存知の方いらっしゃいましたらご教授・アドバイスよろしくお願い致します。

  • スプライン補間関数が実装されている数学ライブラリについて

    スプライン補間関数が実装されているC++のライブラリがあれば、教えていただけないでしょうか? Boostにありそうだったので見てみたのですが、探し方が悪かったせいか見つけることができなかったので、質問させていただきました。 ご存じの方がいらっしゃったら、ご教授いただければと存じます。 よろしくお願いいたします。

  • 単位円の方程式を3次スプライン補間で内挿するには

    三次スプライン補間でP(θ)と Q(θ)の内挿を求めたいです。 x(θ) = cosθ と y(θ) = sinθ 0≦θ≦2π N + 1 = 4、 8 、16 ここからどうやってPとQを求めればいいのでしょうか? 最終的にはPとQを求めて(P(θ)、Q(θ))の媒介変数を求めて 内挿で得られた値と実際の値との誤差をθの大きさでグラフ化したいのですが 単位円の方程式を内挿で求める事が出来ません。 単位円の方程式を3次スプライン補間で内挿するにはどうすればいいのでしょうか???

  • ダイアログベースの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を入れた時の結果です。

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

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

  • 二変数関数の補間

    いつもお世話になっております。 数値計算において、 f(x,y)という関数をx,yについて補間(3次スプライン)したいのですが、 高速に計算できる方法はありますでしょうか? 因みに計算は倍精度並の正確さが必要です。 numerical recipes in Cに載っているやり方を二次元に拡張しようと試みたのですが、途中で挫折しました・・・

  • 様々な補間法について。

    様々な補間法について。 補間に関する情報を色々読みましたが、きちんと理解出来ているか不安なので、質問させて下さい。 まず、ラグランジュの補間法というのはいくつかある点の中から、ある2点を取り、その2点間を直線で近似するという考えで合ってますでしょうか。 次にスプライン補完はいくつかの点を3次式で近似しているという考えでよいでしょうか。 最後に質問ですが、xy平面で、どちらかひとつの座標だけが変化してるような2点間を補完するのに最も適した手法は何でしょうか。 数学の知識が乏しいので、頭のいい方から見たらバカみたいな質問かもしれませんが、回答お願いします。