はじめての親子ハイキングに挑戦!! >>

今手元にx、y、zの座標が140個分あるのですが、それをエクセルの散布図を使いグラフにしました。しかし、明らかにおかしな場所に座標がプロットされていたりするため、スプライン補間などを使いきれいにしたいと考えています。

インターネットなどで、線形補間について調べたのですが、表現が難しくなかなか理解できませんでした。
スプライン補間やラグランジェ補間、ニュートン補間など色々あるようですが、これらの違いは何なのでしょうか。どなたか簡単に教えてください。お願い致します。

また、エクセルを使ったスプライン補間のやり方も教えてくだされば幸いです。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

用語についての補足です。



補間は、全てのデータ点を通るあてはめを指します。最小2乗法などによる必ずしもデータ点を通らないあてはめは、普通は補間とは言いません。
http://ja.wikipedia.org/wiki/%E5%86%85%E6%8C%BF
質問が「補間」になっているので、#6 では敢て慣習には合わない言葉の使い方をしたのだと思います。

歴史的に言うと補間は、数表で表した関数から値を読み取るのに使いました。たとえば f(x) の数表で x が 0.1 刻みのなのに、f(0.13) の値が欲しいようなときです。f(0.1) や f(0.2) はじゅうぶんな精度でわかっているけれど、刻みが粗すぎて途中の f(0.13) が直接は読み取れません。つまり f(0.1) や f(0.2) の値には誤差が含まれないという点が重要です。

更に質問の表題の「線形補間」というと、f(0.1) と f(0.2) を直線で結んで途中の f(0.13) を読み取ります。つまり折れ線グラフによる近似です。もっと凝った補間では f(0.13) を読み取るのに、f(0.1) と f(0.2) の値だけでなく、f(0.0) とか f(0.3) とかの値も援用します。
    • good
    • 0

#3です。



補足すると
スプライン補間してできる曲線は全ての点の座標を通るような曲線で補間しますので、データのばらつきが多いと全体として滑らかな曲線になりません。

一方、最小2乗法による関数フィティングでは、データのばらつき(誤差)が含まれていても全体として平均的な滑らかな曲線となってデータのバラツキや誤差を排除でき、かつデータを補間できることんいなります。
    • good
    • 0

#4 の補足です。



異常値が何か外的な基準、たとえばデータ取得の状況から判断できて、データから統計的に判断する必要はないのでしょうか? もしもそうなら、単にその基準に従って異常値を除去してからスプライン関数をあてはめれば、滑らかなグラフが描けます。

spline は gnuplot にも R にもあります。
    • good
    • 0

補足で意味がわかりました。

#1, #3 の回答で適切と思います。

ソフトは gnuplot 以外にもいろいろあります。私なら R
http://ja.wikipedia.org/wiki/R%E8%A8%80%E8%AA%9E
を使います。その方が試行錯誤が楽なことが多いので。グラフは gnuplot の方が細かい調整が効き、意図のとおりに描きやすいです。

異常値を捨てる話
http://okwave.jp/qa5355198.html
も参考になるかもしれません。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。
とても助かりました。
こちらも参考にさせていただきます!

お礼日時:2009/11/24 11:24

質問者さんの意図する課題を解決するには


スプライン補間は不適です。
するなら、最小2乗法による関数フィッティングが適当でしょう。
最小2乗法の関数フィッティングはエクセルでも出来るようです。

他に関数フィッティングの得意なフリーソフトに「gnuplot」
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manua …
があります。Windows版をDownloadしてインストールして使って見て下さい。

フィッティング
http://windom.phys.hirosaki-u.ac.jp/member/kasai …

参考URL:http://t16web.lanl.gov/Kawano/gnuplot/
    • good
    • 0
この回答へのお礼

ご丁寧に、リンク先まで載せてくださりありがとうございます。
フルーソフトをダウンロードして、使ってみようと思います!

お礼日時:2009/11/24 04:16

ごめんなさい、「明らかにおかしな場所に座標がプロットされていたりする」の意味を誤解したかもしれません。

要するに、問題がわかりません。

この回答への補足

回答くださりありがとうございます。
質問文が言葉足らずで申し訳ありません。

A(x1,y1,z1) B(x'1,y'1,z'1)が140個分あります。
エクセルで散布図を作ると、何点かが他とはかなりかけ離れた場所にプロットされます。元のデータがそうなのですが、その間を補間してなめらかな曲線にしたいと考えています。
よろしくお願いします。

補足日時:2009/11/24 00:41
    • good
    • 0

> 明らかにおかしな場所に座標がプロットされていたりするため、スプライン補間などを使いきれいにしたい



補間は与えられた点を全て通るので、おかしな点は補正されず、きれいにはなりません。きれいにしたいなら、こういう形の関数になるはず、という情報が必要です。たとえば「多項式になるはず」とか。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q直線補間出来る関数

直線補間できる関数はエクセルに有るのでしょうか?
直線補間とはxy座標において、点A(x1,y1),点B(x2,y2)が有ったときに、x1≦x≦x2における任意のxに対するyの値を点AB間が直線だと仮定して求めるすることです。

今は、VLOOKUP,match,Index関数を使ってやってますが、関数がある非常に楽です。

Aベストアンサー

 2点だけでしたら使うまでも無い様な気がしますが、FORECAST関数というものがあります。

【参考URL】
 FORECAST 関数 - Excel - Office.com
  http://office.microsoft.com/ja-jp/excel-help/HP010342532.aspx

 初心者のエクセル(Excel)学習・入門 > エクセル関数の使い方 > 統計関数 > FORECAST関数とは
  http://excel.onushi.com/function/forecast.htm

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

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

Aベストアンサー

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

http://www.google.com/codesearch/advanced_code_search?hl=en

http://www.koders.com/

Qエクセルの関数による近似式の求め方

(1)1,2,3,4 (2)5,6,7,8
(1)と(2)の二つの数字があります。
(1)をx軸、(2)をy軸としてエクセルの関数の式のみでy=a*x^2+b*x+cを求める事は可能ですか?
現状は(1)(x軸)と(2)(y軸)からグラフを書き近似曲線を描かせ、2次の多項式を表示させているんですが、大量にデータがあり、この作業に大変時間を要しています。調べに調べた結果、y=a*x+bの形は関数で表示可能なことは確認取れているんですが、2次の式は未だ発見できません。
非常に困っています。回答の方よろしくお願いします。また何か不明な点があったら何でも言って下さい。

Aベストアンサー

y の範囲 A2:A10
x の範囲 B2:B10
として、
C2=B2^2
C10までコピー。

と、しておけば
係数 a =INDEX(LINEST(A2:A10,B2:C10),1)
係数 b =INDEX(LINEST(A2:A10,B2:C10),2)
定数 c =INDEX(LINEST(A2:A10,B2:C10),3)

Qfortranでのcsvファイルを出力する方法

fortranでコンマ切りテキストファイル(CSVファイル)を
出力する方法をご存知の方、いらっしゃいませんでしょうか?


私が使用した処理系(intel fortran 8.0 for Windows)で

write(600,*)1.4,',',2.33,',',30.11

というコードを実行させると
fort.600 というファイル名のテキストファイルが生成されて
中身は

___1.400000_____,___2.330000_____,___30.11000____

となります。( _ は半角空白を意味します。)
私が欲しいのは余計な空白の入っていない

1.4,2.33,3.11

または

1.400000,2.330000,30.11000

という出力なのですが、どのような書式指定をすれば
これが可能なのでしょうか?

全くのfortran初心者です。よろしくご教示ください。

Aベストアンサー

汎用的な方法は、#2さんのように文字列として書き出して、adjustlやtrimを使って空白を取るのでしょうが、Intel Fortran8.0ならば以下のようなformatでできます。
write(600,10) 1.4,',',2.33,',',30.11
10 format(f0.6,a1,f0.6,a1,f0.6)
マイナス記号があっても問題ないです。書式幅が0の指定はIとFに使えます。なかなか便利ですよ。ちなみにConpaq Visual Fortranでも使えます。

Qエクセルにて、3次スプラインのマクロを組みました。

エクセルにて、3次スプラインのマクロを組みました。
結果がところどころしか表示されません。
何度見直しても自分では間違いがわかりません。
どなたか、間違い箇所がわかりませんでしょうか。


A列には5行目から、0-720までの721個の少数値
0
1.005586592
2.011173184

B列には5行目から、721個の少数値
5.83
5.69
5.66

D列には5行目から、0-720まで、1ずつ増加の整数値
0
1
2

E列には補間値をマクロから代入
以下マクロです。
お手数をおかけしますが、目を通して指摘していただけませんでしょうか。

Sub 補間_3次スプライン()

Dim i As Long
Dim h(1000) As Double
Dim dif1(1000) As Double
Dim dif2(1000) As Double
Dim data_count As Long
Dim lngDataEnd As Long
Dim dataX(1000) As Double
Dim dataY(1000) As Double
Dim x, y, yy0, yy1, yy2, yy3 As Double
lngDataEnd = ThisWorkbook.Sheets("3次スプライン").Range("A65536").End(xlUp).Row
data_count = lngDataEnd - 5

For i = 1 To data_count
dataX(i) = ThisWorkbook.Sheets("3次スプライン").Cells(i + 4, 1)
dataY(i) = ThisWorkbook.Sheets("3次スプライン").Cells(i + 4, 2)
Next i

h(0) = 0
dif2(0) = 0

On Error Resume Next
For i = 1 To data_count
h(i) = dataX(i) - dataX(i - 1) '//間隔を計算
dif1(i) = (dataY(i) - dataY(i - 1)) / h(i) '//一次微分を計算
Next i

For i = 1 To data_count
'二次微分を計算
dif2(i) = (dif1(i + 1) - dif1(i)) / (dataX(i + 1) - dataX(i - 1))
Next i

i = 1
For x = 0 To 720
If x < dataX(i) Then
yy0 = dif2(i - 1) / (6 * h(i)) * (dataX(i) - x) * (dataX(i) - x) * (dataX(i) - x) '第1項
yy1 = dif2(i) / (6 * h(i)) * (x - dataX(i - 1)) * (x - dataX(i - 1)) * (x - dataX(i - 1)) '第2項
yy2 = (dataY(i - 1) / h(i) - h(i) * dif2(i - 1) / 6) * (dataX(i) - x) '第3項
yy3 = (dataY(i) / h(i) - h(i) * dif2(i) / 6) * (x - dataX(i - 1)) '第4項
y = yy0 + yy1 + yy2 + yy3
ThisWorkbook.Sheets("3次スプライン").Cells(x + 4, 5) = y
Else: i = i + 1
End If
Next x
End Sub

エクセルにて、3次スプラインのマクロを組みました。
結果がところどころしか表示されません。
何度見直しても自分では間違いがわかりません。
どなたか、間違い箇所がわかりませんでしょうか。


A列には5行目から、0-720までの721個の少数値
0
1.005586592
2.011173184

B列には5行目から、721個の少数値
5.83
5.69
5.66

D列には5行目から、0-720まで、1ずつ増加の整数値
0
1
2

E列には補間値をマクロから代入
以下マクロです。
お手数をおかけしますが、目を通して指摘していただけま...続きを読む

Aベストアンサー

3次スプラインの計算式は確認していないので、それは置いておくとして、
結果がところどころしか表示されない原因は、最後のほうの
If x < dataX(i) Then
の部分ではないでしょうか。
この方法では、「If x < dataX(i) Then」を満たさなければ、そのxの行は表示されません。

次のようにしてはどうですか。

i = 1
For x = 0 To 720
Do Until x < dataX(i)
i = i + 1
If i > data_count Then Exit Do
Loop
If i > data_count Then Exit For
yy1 = ・・・・・
・・・・・・・
ThisWorkbook.Sheets("3次スプライン").Cells(x + 4, 5) = y
Next x

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

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

Aベストアンサー

2変数関数フィッティング(2変数関数最小二乗法)などはだめですか?

スプライン曲面では個々のサンプリング点を必ず通りますが、誤差の大きいサンプリング点が入るとその近辺での補間誤差も大きく出ます。同じ系統に2次元パデ近似補間法が有ります(有限項数の2次元テーラー展開を多項式分数関数近似した補間法。展開範囲で平均的に補間誤差が少ないのが特徴)。

2変数関数フィッティング法は個々のサンプリング点を必ずしも通らず全体として誤差が少なくなるように補間しますので多少の領域外のデータの補間も可能です。フィッティング関数はデータの分布形に合った2変数関数を選ぶ必要があります。フィッテングにより2変数関数の中の係数パラメータが決定されます。(フリーソフトのgnuplotなど)

いずれも、自身のシステムに合わせて多少の作り込みや試行を行なってよりよい補間関数を求める必要があるかと思います。


人気Q&Aランキング