Alglibライブラリ、補間演算のテスト


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/