⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY without ev
💻 C
📖 第 1 页 / 共 2 页
字号:
/* interpolation/test.c *  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman *  * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *//* Author:  G. Jungman */#include <config.h>#include <stddef.h>#include <stdlib.h>#include <stdio.h>#include <math.h>#include <gsl/gsl_test.h>#include <gsl/gsl_errno.h>#include <gsl/gsl_interp.h>#include <gsl/gsl_ieee_utils.h>inttest_bsearch(void){  double x_array[5] = { 0.0, 1.0, 2.0, 3.0, 4.0 };  size_t index_result;  int status = 0;  int s;  /* check an interior point */  index_result = gsl_interp_bsearch(x_array, 1.5, 0, 4);  s = (index_result != 1);  status += s;  gsl_test (s, "simple bsearch");  /* check that we get the last interval if x == last value */  index_result = gsl_interp_bsearch(x_array, 4.0, 0, 4);  s = (index_result != 3);  status += s;  gsl_test (s, "upper endpoint bsearch");  /* check that we get the first interval if x == first value */  index_result = gsl_interp_bsearch(x_array, 0.0, 0, 4);  s = (index_result != 0);  status += s;  gsl_test (s, "lower endpoint bsearch");  /* check that we get correct interior boundary behaviour */  index_result = gsl_interp_bsearch(x_array, 2.0, 0, 4);  s = (index_result != 2);  status += s;  gsl_test (s, "degenerate bsearch");  /* check out of bounds above */  index_result = gsl_interp_bsearch(x_array, 10.0, 0, 4);  s = (index_result != 3);  status += s;  gsl_test (s, "out of bounds bsearch +");  /* check out of bounds below */  index_result = gsl_interp_bsearch(x_array, -10.0, 0, 4);  s = (index_result != 0);  status += s;  gsl_test (s, "out of bounds bsearch -");  return status;}typedef double TEST_FUNC (double);typedef struct _xy_table xy_table;struct _xy_table  {    double * x;    double * y;    size_t n;  };xy_table make_xy_table (double x[], double y[], size_t n);xy_tablemake_xy_table (double x[], double y[], size_t n){  xy_table t;  t.x = x;  t.y = y;  t.n = n;  return t;}static inttest_interp (  const xy_table * data_table,  const gsl_interp_type * T,  xy_table * test_table,  xy_table * test_d_table,  xy_table * test_i_table  ){  int status = 0, s1, s2, s3;  size_t i;  gsl_interp_accel *a = gsl_interp_accel_alloc ();  gsl_interp *interp = gsl_interp_alloc (T, data_table->n);  gsl_interp_init (interp, data_table->x, data_table->y, data_table->n);  for (i = 0; i < test_table->n; i++)    {      double x = test_table->x[i];      double y;      double deriv;      double integ;      double diff_y, diff_deriv, diff_integ;      s1 = gsl_interp_eval_e (interp, data_table->x, data_table->y, x, a, &y);      s2 = gsl_interp_eval_deriv_e (interp, data_table->x, data_table->y, x, a, &deriv);      s3 = gsl_interp_eval_integ_e (interp, data_table->x, data_table->y, test_table->x[0], x, a, &integ);      gsl_test (s1, "gsl_interp_eval_e %s", gsl_interp_name(interp));      gsl_test (s2, "gsl_interp_eval_deriv_e %s", gsl_interp_name(interp));      gsl_test (s3, "gsl_interp_eval_integ_e %s", gsl_interp_name(interp));      gsl_test_abs (y, test_table->y[i], 1e-10, "%s %d", gsl_interp_name(interp), i);      gsl_test_abs (deriv, test_d_table->y[i], 1e-10, "%s deriv %d", gsl_interp_name(interp), i);      gsl_test_abs (integ, test_i_table->y[i], 1e-10, "%s integ %d", gsl_interp_name(interp), i);      diff_y = y - test_table->y[i];      diff_deriv = deriv - test_d_table->y[i];      diff_integ = integ - test_i_table->y[i];      if (fabs (diff_y) > 1.e-10 || fabs(diff_deriv) > 1.0e-10 || fabs(diff_integ) > 1.0e-10) {        status++;      }    }  gsl_interp_accel_free (a);  gsl_interp_free (interp);  return status;}static inttest_linear (void){  int s;  double data_x[4] = { 0.0, 1.0, 2.0, 3.0 };  double data_y[4] = { 0.0, 1.0, 2.0, 3.0 };  double test_x[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };  double test_y[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };  double test_dy[6] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };  double test_iy[6] = { 0.0, 0.125, 0.5, 9.0/8.0, 25.0/8.0, 9.0/2.0 };  xy_table data_table = make_xy_table(data_x, data_y, 4);  xy_table test_table = make_xy_table(test_x, test_y, 6);  xy_table test_d_table = make_xy_table(test_x, test_dy, 6);  xy_table test_i_table = make_xy_table(test_x, test_iy, 6);  s = test_interp (&data_table, gsl_interp_linear, &test_table, &test_d_table, &test_i_table);  gsl_test (s, "linear interpolation");  return s;}static inttest_polynomial (void){  int s;  double data_x[4] = { 0.0, 1.0, 2.0, 3.0 };  double data_y[4] = { 0.0, 1.0, 2.0, 3.0 };  double test_x[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };  double test_y[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };  double test_dy[6] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };  double test_iy[6] = { 0.0, 0.125, 0.5, 9.0/8.0, 25.0/8.0, 9.0/2.0 };  xy_table data_table = make_xy_table(data_x, data_y, 4);  xy_table test_table = make_xy_table(test_x, test_y, 6);  xy_table test_d_table = make_xy_table(test_x, test_dy, 6);  xy_table test_i_table = make_xy_table(test_x, test_iy, 6);  s = test_interp (&data_table, gsl_interp_polynomial, &test_table, &test_d_table, &test_i_table);  gsl_test (s, "polynomial interpolation");  return s;}static inttest_cspline (void){  int s;  double data_x[3] = { 0.0, 1.0, 2.0 };  double data_y[3] = { 0.0, 1.0, 2.0 };  double test_x[4] = { 0.0, 0.5, 1.0, 2.0 };  double test_y[4] = { 0.0, 0.5, 1.0, 2.0 };  double test_dy[4] = { 1.0, 1.0, 1.0, 1.0 };  double test_iy[4] = { 0.0, 0.125, 0.5, 2.0 };  xy_table data_table = make_xy_table(data_x, data_y, 3);  xy_table test_table = make_xy_table(test_x, test_y, 4);  xy_table test_d_table = make_xy_table(test_x, test_dy, 4);  xy_table test_i_table = make_xy_table(test_x, test_iy, 4);  s = test_interp (&data_table, gsl_interp_cspline, &test_table, &test_d_table, &test_i_table);  gsl_test (s, "cspline interpolation");  return s;}static inttest_cspline2 (void){  /* Test taken from Young & Gregory, A Survey of Numerical     Mathematics, Vol 1 Chapter 6.8 */    int s;  double data_x[6] = { 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 };  double data_y[6] = { 1.0,                        0.961538461538461, 0.862068965517241,                        0.735294117647059, 0.609756097560976,                        0.500000000000000 } ;  double test_x[50] = {      0.00, 0.02, 0.04, 0.06, 0.08, 0.10, 0.12, 0.14, 0.16, 0.18,     0.20, 0.22, 0.24, 0.26, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38,     0.40, 0.42, 0.44, 0.46, 0.48, 0.50, 0.52, 0.54, 0.56, 0.58,     0.60, 0.62, 0.64, 0.66, 0.68, 0.70, 0.72, 0.74, 0.76, 0.78,    0.80, 0.82, 0.84, 0.86, 0.88, 0.90, 0.92, 0.94, 0.96, 0.98 };  double test_y[50] = {     1.000000000000000, 0.997583282975581, 0.995079933416512,     0.992403318788142, 0.989466806555819, 0.986183764184894,     0.982467559140716, 0.978231558888635, 0.973389130893999,     0.967853642622158, 0.961538461538461, 0.954382579685350,     0.946427487413627, 0.937740299651188, 0.928388131325928,     0.918438097365742, 0.907957312698524, 0.897012892252170,     0.885671950954575, 0.874001603733634, 0.862068965517241,     0.849933363488199, 0.837622973848936, 0.825158185056786,     0.812559385569085, 0.799846963843167, 0.787041308336369,     0.774162807506023, 0.761231849809467, 0.748268823704033,     0.735294117647059, 0.722328486073082, 0.709394147325463,     0.696513685724764, 0.683709685591549, 0.671004731246381,     0.658421407009825, 0.645982297202442, 0.633709986144797,     0.621627058157454, 0.609756097560976, 0.598112015427308,     0.586679029833925, 0.575433685609685, 0.564352527583445,     0.553412100584061, 0.542588949440392, 0.531859618981294,     0.521200654035625, 0.510588599432241};  double test_dy[50] = {     -0.120113913432180, -0.122279726798445, -0.128777166897241,    -0.139606233728568, -0.154766927292426, -0.174259247588814,    -0.198083194617734, -0.226238768379184, -0.258725968873165,    -0.295544796099676, -0.336695250058719, -0.378333644186652,    -0.416616291919835, -0.451543193258270, -0.483114348201955,    -0.511329756750890, -0.536189418905076, -0.557693334664512,    -0.575841504029200, -0.590633926999137, -0.602070603574326,    -0.611319695518765, -0.619549364596455, -0.626759610807396,    -0.632950434151589, -0.638121834629033, -0.642273812239728,    -0.645406366983674, -0.647519498860871, -0.648613207871319,    -0.648687494015019, -0.647687460711257, -0.645558211379322,    -0.642299746019212, -0.637912064630930, -0.632395167214473,    -0.625749053769843, -0.617973724297039, -0.609069178796061,    -0.599035417266910, -0.587872439709585, -0.576731233416743,    -0.566762785681043, -0.557967096502484, -0.550344165881066,    -0.543893993816790, -0.538616580309654, -0.534511925359660,    -0.531580028966807, -0.529820891131095};  double test_iy[50] = {    0.000000000000000, 0.019975905023535, 0.039902753768792,     0.059777947259733, 0.079597153869625, 0.099354309321042,     0.119041616685866, 0.138649546385285, 0.158166836189794,     0.177580491219196, 0.196875783942601, 0.216036382301310,    0.235045759060558, 0.253888601161251, 0.272550937842853,    0.291020140643388, 0.309284923399436, 0.327335342246135,    0.345162795617181, 0.362760024244829, 0.380121111159890,    0.397241442753010, 0.414117280448683, 0.430745332379281,    0.447122714446318, 0.463246950320456, 0.479115971441505,    0.494728117018421, 0.510082134029305, 0.525177177221407,    0.540012809111123, 0.554589001813881, 0.568906157172889,    0.582965126887879, 0.596767214344995, 0.610314174616794,    0.623608214462242, 0.636651992326715, 0.649448618342004,    0.662001654326309, 0.674315113784241, 0.686393423540581,    0.698241001711602, 0.709861835676399, 0.721259443710643,    0.732436874986582, 0.743396709573044, 0.754141058435429,    0.764671563435718, 0.774989397332469 };  xy_table data_table = make_xy_table(data_x, data_y, 6);  xy_table test_table = make_xy_table(test_x, test_y, 50);  xy_table test_d_table = make_xy_table(test_x, test_dy, 50);  xy_table test_i_table = make_xy_table(test_x, test_iy, 50);  s = test_interp (&data_table, gsl_interp_cspline, &test_table, &test_d_table, &test_i_table);  gsl_test (s, "cspline 1/(1+x^2) interpolation");  return s;}static inttest_cspline3 (void){  /* This data has been chosen to be random (uneven spacing in x and y)     and the exact cubic spine solution computed using Octave */    int s;    double data_x[7] = {       -1.2139767065644265,    -0.792590494453907,    -0.250954683125019,    0.665867809951305,    0.735655088722706,    0.827622053027153,    1.426592227816582    };  double data_y[7] = {       -0.00453877449035645,    0.49763182550668716,    0.17805472016334534,    0.40514493733644485,    -0.21595209836959839,    0.47405586764216423,    0.46561462432146072  } ;  double test_x[19] = {    -1.2139767065644265,    -1.0735146358609200,    -0.9330525651574135,    -0.7925904944539071,    -0.6120452240109444,    -0.4314999535679818,    -0.2509546831250191,    0.0546528145670890,    0.3602603122591972,    0.6658678099513053,    0.6891302362084388,    0.7123926624655723,    0.7356550887227058,    0.7663107434908548,    0.7969663982590039,    0.8276220530271530,    1.0272787779569625,    1.2269355028867721,    1.4265922278165817,  };  double test_y[19] = {     -0.00453877449035645,    0.25816917628390590,    0.44938881397673230,    0.49763182550668716,    0.31389980410075147,    0.09948951681196887,    0.17805472016334534,    1.27633142487980233,    2.04936553432792001,    0.40514493733644485,    0.13322324792901385,    -0.09656315924697809,    -0.21595209836959839,    -0.13551147728045118,    0.13466779030061801,    0.47405586764216423,    1.68064089899304370,    1.43594739539458649,    0.46561462432146072  };  double test_dy[19] = {     1.955137555965937,    1.700662049790549,    0.937235531264386,    -0.335141999612553,    -1.401385073563169,    -0.674982149482761,    1.844066772628670,    4.202528085784793,    -0.284432022227558,    -11.616813551408383,    -11.272731243226174,    -7.994209291156876,    -1.781247695200491,    6.373970868827501,    10.597456848997197,    10.889210245308570,    1.803124267866902,    -3.648527318598099,    -5.465744514086432,  };  double test_iy[19] = {    0.000000000000000,    0.018231117234914,    0.069178822023139,    0.137781019634897,    0.213936442847744,    0.249280997744777,    0.267492946016120,    0.471372708120518,    1.014473660088477,    1.477731933018837,    1.483978291717981,    1.484256847945450,    1.480341742628893,    1.474315901028282,    1.473972210647307,    1.483279773396950,    1.728562698140330,    2.057796448999396,    2.253662886537457,  };  xy_table data_table = make_xy_table(data_x, data_y, 7);  xy_table test_table = make_xy_table(test_x, test_y, 19);  xy_table test_d_table = make_xy_table(test_x, test_dy, 19);  xy_table test_i_table = make_xy_table(test_x, test_iy, 19);  s = test_interp (&data_table, gsl_interp_cspline, &test_table, &test_d_table, &test_i_table);  gsl_test (s, "cspline arbitrary data interpolation");  return s;}static inttest_csplinep (void){  /* This data has been chosen to be random (uneven spacing in x and y)     and the exact cubic spine solution computed using Octave */    int s;    double data_x[11] = {       0.000000000000000,    0.130153674349869,    0.164545962312740,    0.227375461261537,    0.256465324353657,    0.372545206874658,    0.520820016781720,    0.647654717733075,    0.753429306654340,    0.900873984827658,    1.000000000000000,  };  double data_y[11] = {       0.000000000000000,    0.729629261832041,    0.859286331568207,    0.989913099419008,    0.999175006262120,    0.717928599519215,    -0.130443237213363,    -0.800267961158980,    -0.999767873040527,    -0.583333769240853,    -0.000000000000000,  } ;  double test_x[31] = {    0.000000000000000,    0.043384558116623,    0.086769116233246,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -