• ベストアンサー

二変数関数の補間

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

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

  • ベストアンサー
  • paddler
  • ベストアンサー率53% (176/330)
回答No.1

> 因みに計算は倍精度並の正確さが必要です。 ひょっとして、真の関数形が分かっていたとして、補間結果と関数の 真値との誤差が、例えば2進で小数点以下48bitより小さいという 意味でしょうか? そんなの元の関数が4次以上(を含む高等関数)であれば、3次 スプラインに関わらず、その関数形そのものをフィッティングさせない 限り、どんな補間方法をとっても明らかに無理ですよね? (もはや補間ではない?) まぁ、そんな極端な要求ではないのであれば、私はBi-Cubic法を 使います。 アルゴリズムは、下記の資料などに分かりやすく載っています。 http://mikilab.doshisha.ac.jp/dia/monthly/monthly01/20011222/personal_kawasaki.pdf

参考URL:
http://mikilab.doshisha.ac.jp/dia/monthly/monthly01/20011222/personal_kawasaki.pdf
0123456789A
質問者

お礼

早速のご回答ありがとうございました。 倍精度並みの正確さが必要というのは言葉の誤用でした。 仰るような厳しい精度は必要としていません。 Bi-Cubic法というのは初めて聞きました。 URLも参考にさせていただきます。ありがとうございました。

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

関連するQ&A

  • 3次元曲面補間方法を探しています.

    3次元データの補間方法のアルゴリズムを探しています. 不均等にサンプリングした3次元データ(x,y,z)を基に曲面補間を行いたいと思っています. 最初に,zを一定の基で基準データ(x,y)を取得し,データを基に係数を算出します. システムは係数を用いて実際の取得データ(x,y)からzを補間したします. 現在のシステムは多項式で補間しています しかし,もっとメモリを食わず,精度のよい補間補法がないか探しています. 一応候補として考えたものはスプライン曲面と細分割による処理です. これらでは,問題点としてサンプリングした範囲を超えた(x,y)データでは補間ができないというものがあります.また,計算時間がかかるという問題点もあります. これらに限らず,よい方法はありませんでしょうか.

  • スプライン補間

    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

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

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

  • 線形補間について教えてください。

    今手元にx、y、zの座標が140個分あるのですが、それをエクセルの散布図を使いグラフにしました。しかし、明らかにおかしな場所に座標がプロットされていたりするため、スプライン補間などを使いきれいにしたいと考えています。 インターネットなどで、線形補間について調べたのですが、表現が難しくなかなか理解できませんでした。 スプライン補間やラグランジェ補間、ニュートン補間など色々あるようですが、これらの違いは何なのでしょうか。どなたか簡単に教えてください。お願い致します。 また、エクセルを使ったスプライン補間のやり方も教えてくだされば幸いです。 よろしくお願いします。

  • スプライン補間

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

  • 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=? ご存知の方いらっしゃいましたらご教授・アドバイスよろしくお願い致します。

  • 2変数の2次導関数の離散化(差分)

    関数f(x,y)の2次導関数である∂f(x,y)/∂x∂yを数値計算により, より高精度で計算したいと考えているのですが,∂f(x,y)/∂x∂x のように同じ変数に対する偏導関数の離散化方法しか見つけることが できませんでした. そこで,ご存じの方がいらっしゃいましたら,∂f(x,y)/∂x∂yのような2変数の導関数の高次計算法をご教示頂けないでしょうか. 宜しくお願い致します. またそれらについて詳細に記述された文献等もあれば,教えて頂ければ幸いです.

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

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

  • 内挿補間とPhongシェーディングについて

    javaのアプレットを使って、3次元3角形のそれぞれの頂点にx、y、zの座標値、およびr、g、bのカラー情報を定義し、3角形内部を、内挿補間法を用いて塗りつぶしを行い、3角形内部のカラーは内挿補間された色を用いて表示するにはどうすればいいですか? また、このプログラミングのr、g、bのカラー情報に代わって、3次元3角形のそれぞれの頂点にx、y、zの座標値、および法線Nと光源入射ベクトルLを定義し、3角形内部を、内挿補間法を用いて塗りつぶしを行い、3角形内部のカラーを内挿補間されたベクトルから Phongシェーディングによる輝度を求め表示するにはどうすればいいですか? どなたか教えてください。お願いします。

    • ベストアンサー
    • Java
  • 線形補間

    線形補間での求め方 問題文: 1.数値を読み込む 2.xを読み込む 3.x<x1 または x>xnならエラー 3.x1<x<i+1 となるiを見つける 4.補間公式でyを求める 5.結果をプリントする #include<stdio.h> float hokan(void); int xn[] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75}; double yn[] = {0.000,0.087,0.173,0.258,0.342,0.422,0.500,0.573, 0.624,0.707,0.766,0.819,0.866,0.906,0.939,0.965}; int x=5; void main() { printf("y = %lf\n", hokan()); } float hokan(void) { int i; double y; if(x <0|| 75<= x){ printf("エラーです\n"); } else{ for(i=0; xn[i] < x; i++) y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i]; return y; } } 数表を最初にxnとynで表記しています。 このプログラムで線形補間が行われてないそうなのですが・・ 何か誤りがある様でしたらどなたか教えてください。