Alglibライブラリ、補間演算のテスト
2500 ワード
1、線形補間
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "interpolation.h"
using namespace alglib;
int main(int argc, char **argv)
{
//
// We use piecewise linear spline to interpolate f(x)=x^2 sampled
// at 5 equidistant nodes on [1.0,5.0].
//
real_1d_array xx;
real_1d_array yy;
double _x[] = {1.0, 2.0, 3.0, 4.0, 5.0};
double _y[] = {1, 4.0, 9.0, 16.0, 25.0};
int nPoints=5;
xx.setcontent(5,_x);
yy.setcontent(5,_y);
double t = 2.5;
double v;
spline1dinterpolant s;
// build spline
spline1dbuildlinear(xx, yy, s);
// calculate S(2.5) - it is quite different from 2.5^2=6.25
v = spline1dcalc(s, t);
printf("%.4f
", double(v)); // EXPECTED: 6.5
system("pause");
return 0;
}
2,spline補間
(正確な境界条件と自然境界条件でそれぞれ実現される)
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "interpolation.h"
using namespace alglib;
int main(int argc, char **argv)
{
//
// We use cubic spline to interpolate f(x)=x^2 sampled
// at 5 equidistant nodes on [1.0,5.0].
//
// First, we use default boundary conditions ("parabolically terminated
// spline") because cubic spline built with such boundary conditions
// will exactly reproduce any quadratic f(x).
//
// Then we try to use natural boundary conditions
// d2S(-1)/dx^2 = 0.0
// d2S(+1)/dx^2 = 0.0
// and see that such spline interpolated f(x) with small error.
//
real_1d_array xx;
real_1d_array yy;
double _x[] = {1.0, 2.0, 3.0, 4.0, 5.0};
double _y[] = {1, 4.0, 9.0, 16.0, 25.0};
int nPoints=5;
xx.setcontent(5,_x);
yy.setcontent(5,_y);
double t = 2.5;
double v;
spline1dinterpolant s;
ae_int_t natural_bound_type = 2;
//
// Test exact boundary conditions: build S(x), calculare S(2.5)
// (almost same as original function)
//
spline1dbuildcubic(xx, yy, s);
v = spline1dcalc(s, t);
printf("%.4f
", double(v)); // EXPECTED: 6.25
//
// Test natural boundary conditions: build S(x), calculare S(2.5)
// (small interpolation error)
//
spline1dbuildcubic(xx, yy, 5, natural_bound_type, 0.0, natural_bound_type, 0.0, s);
v = spline1dcalc(s, t);
printf("%.3f
", double(v)); // EXPECTED: 6.232
system("pause");
return 0;
}
リファレンスリソース:
http://www.alglib.net/interpolation/