• ベストアンサー

二次元スプライン補間のfortranソースプログラム

地形データの処理に、二次元スプライン補間を使いたいのですが、どなたかfortranのフリーのソースプログラム(Subroutine)をご存じないでしょうか。

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

  • ベストアンサー
noname#94461
noname#94461
回答No.2

No.1の回答で十分だと思いますが、google, kodersでもコードサーチが出来ます。 サブルーチン名或いは機能名等でサーチ出来ますし、使用言語、ライセンス形態での絞込みも可能です。 http://www.google.com/codesearch/advanced_code_search?hl=en http://www.koders.com/

pipiruru11
質問者

お礼

ご紹介のサイト、知りませんでしたが、非常に有益なサイトで他にも利用できそうです。ありがとうございます。

その他の回答 (1)

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

探すよりも自分でさっさと作った方が早いかもね。 ソースコードを使うつもりだということは、自分でそのコードを理解するつもりだということでしょ。 http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/numeanal1/node16.html

pipiruru11
質問者

お礼

ご回答、ありがとうございます。参考URLを元に自分で作りました。ただ、これは1次元スプラインですので、二次元については未だ調査中です。

関連するQ&A

  • fortranでスプライン補間をするには?

     初めまして, 私は九大大学院の大学院生です。  研究の関係でデータの補間をする必要があり, スプライン曲線を描いて補間をしたいと考えております。そこで, fortranでスプライン補間処理をしたいのですが, 自分でプログラミングするとなるととてつもなく時間がかかりそうなので, すでにスプライン補間用に作成されたプログラムを手に入れることはできないかと思いまして…。  お詳しい方いらしましたら, ぜひ何かアドバイスいただけないでしょうか。  よろしくお願い致します。

  • スプライン補間

    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

  • 2次元の補間

    matlabというソフトで、2次元補間法でcubic,spline,・・・etc.と何種類かあるのですが、具体的にどういう風に違うのか知りたいです。(数式についてなど)どなたかご存知の方、参考URLでも参考図書でも結構ですので、宜しくお願いします。

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

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

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

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

  • スプライン曲面についての参考文献。

    スプライン曲面というのはスプライン曲線を三次元にし たものだということとスプライン曲線ってなんなのかと 言うことはなんとなくわかるんですが、三次元になると いまいちその補間の過程がわかりません・・・。 なにかいい文献はありませんか?教えてください。 または簡単にでも説明してくださる方がいてもうれしい です。

  • Do文で副プログラムの増やす【Fortran】

    Fortranを使用してます。 DO文で副プログラムをループさせて増やしたいのですが、どうすればいいか分りません。 具体的には、副プログラムの「SUBROUTINE」文+サブルーチン名 であるサブルーチン名の後にループを使って番号を付けたいのですが・・・ 簡易なイメージとして以下のソースでtest0、test1、test2、・・・・・test10となるようなサブルーチン名にしたいのです。 do x=0,10 SUBROUTINE test+x y=x+10 retun end end do Fortran初心者ですが、解決したいので難しい解説でも大丈夫です。 分る方は宜しくお願いいたします。

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

  • fortranでプログラムを作りたいのですが

    今学校で、txtファイルの数値データを数式処理しているのですが、そのtxtファイル数が多く、一つ一つエクセルで開いてやるのがとても面倒くさくて(エクセルの中ではマクロで処理しているが)困ってます。  そこでfortranでプログラミングして処理しようかと思っているのですが、それに関してわからない事があります 1.fortranのopen文はどんなファイルでも開けるか? 2.またfortranで開いて、計算処理できるファイルはtxt datなどのファイルしかないのか? 3.ファイル名が1~100のように順番になっている時1~100まで順番で開いて、それぞれに計算処理出  来るようなプログラムは可能か?

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