FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Java 測定点 スプライン曲線

離散データだと、データ数が限られてしまいますよね。
補間したからといって精度が上がるわけではないのですが、補間してデータ数を増やしてみました。

以下のサイトにソースコードがあったので、それを使わせて頂いています。

参考(ソース元)サイト:
http://codezine.jp/article/detail/163


public class Interpolation {
/**
* スプライン曲線で補間します。
* data.length * rateのデータ数にして返します。
* 参考サイト:http://codezine.jp/article/detail/163
* @param data 補間したいデータ
* @param rate 補間する率
* @return 補間されたデータ
*/
public static double[] calcSpline(double[] data, double rate){
// 変数の準備
double x, y, yy0, yy1, yy2, yy3;
int data_count = data.length;
double[] h = new double[data_count]; // 間隔
double[] dif1 = new double[data_count]; // 一次微分
double[] dif2 = new double[data_count]; // 二次微分


h[0] = 0.0;
dif2[0] = 0.0;
dif2[data_count - 1] = 0.0;

for (int i = 1; i < data_count; i++) {
h[i] = (i) - (i - 1); // 間隔を計算
dif1[i] = (data[i] - data[i - 1]) / h[i]; // 一次微分を計算
}

for (int i = 1; i < data_count-1; i++)
// 二次微分を計算
dif2[i] = (dif1[i + 1] - dif1[i]) / ((i + 1) - (i - 1));

// スプライン曲線を計算する
int i = 1;
int n = 0;
double[] spline_data = new double[(int)(data_count*rate)];
for (x = 0; n < spline_data.length && i < data_count; x += (1.0/rate)) {
yy0 = dif2[i - 1] / (6 * h[i]) * ((i) - x)
* ((i) - x) * ((i) - x); // 第1項
yy1 = dif2[i] / (6 * h[i]) * (x - (i - 1))
* (x - (i - 1)) * (x - (i - 1)); // 第2項
yy2 = (data[i - 1] / h[i] - h[i] * dif2[i - 1] / 6)
* ((i) - x); // 第3項
yy3 = (data[i] / h[i] - h[i] * dif2[i] / 6)
* (x - (i - 1)); // 第4項
y = yy0 + yy1 + yy2 + yy3;

spline_data[n++] = y;

if (x >= (i))i++;
}

return spline_data;
}
}

コメントの投稿

管理者にだけ表示を許可する

プロフィール

sin

ニックネーム:sin

趣味でプログラムの作成などをしています。

Google+1
最新記事
カテゴリ
検索フォーム
リンク
最新コメント
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。