/* Filters the Function through interpolation. _params_ holds a hash with the following values: * ?? It returns a hash. */ static VALUE function_spline_approximation(VALUE self, VALUE params) { long len = function_sanity_check(self); const double *x = Dvector_Data_for_Read(get_x_vector(self),NULL); const double *y = Dvector_Data_for_Read(get_y_vector(self),NULL); VALUE xiret, yiret, y2iret, yintret,ret; double * xi, *yi, *y2i, *yint; long nbavg = 9; long nbmax = 20; if(RTEST(rb_hash_aref(params, rb_str_new2("number")))) nbmax = NUM2LONG(rb_hash_aref(params, rb_str_new2("number"))); if(RTEST(rb_hash_aref(params, rb_str_new2("average")))) nbavg = NUM2LONG(rb_hash_aref(params, rb_str_new2("average"))); /* TODO: add checks that monotonic and growing. */ xiret = rb_funcall(cDvector, idNew, 1, INT2NUM(nbmax)); xi = Dvector_Data_for_Write(xiret, NULL); yiret = rb_funcall(cDvector, idNew, 1, INT2NUM(nbmax)); yi = Dvector_Data_for_Write(yiret, NULL); y2iret = rb_funcall(cDvector, idNew, 1, INT2NUM(nbmax)); y2i = Dvector_Data_for_Write(y2iret, NULL); yintret = rb_funcall(cDvector, idNew, 1, INT2NUM(len)); yint = Dvector_Data_for_Write(yintret, NULL); internal_spline_approximation(x, y, len, xi, yi, y2i, nbmax, nbavg, yint); ret = rb_hash_new(); rb_hash_aset(ret, rb_str_new2("xi"), xiret); rb_hash_aset(ret, rb_str_new2("yi"), yiret); rb_hash_aset(ret, rb_str_new2("y2i"), y2iret); rb_hash_aset(ret, rb_str_new2("y"), yintret); return ret; }