2014-12-09 6 views
0

다음 코드로 'gsl : interp.c : 150 : ERROR : interpolation error'가 표시됩니다. 일부 인터넷 검색 기능은 interp 함수를 사용하여 추정 할 때이 오류가 발생하지만 여기에서 어떻게 발생하는지 보지 못합니다. 도움말 크게 감사하겠습니다. 감사.gsl akima 스플라인 보간 오류

함수 randomground()은 난수 (double)를 반환합니다.

#define NSTEPS 100 

int main() 
{ 
      int j, q, space = 1, refine = 100; 
      double xi = 0.0, tx[2*NSTEPS] = {0}, theight[2*NSTEPS] = {0}; 

      double terrain[(int) (2*NSTEPS*100)] = {0}; 
      double terrainsl[(int) (2*NSTEPS*100)] = {0}; 

      for (j = 0; j < 2*NSTEPS; j++) 
      { 
       tx[j] = (double) j*space; 
       theight[j] = randomground(); 
      } 

      gsl_interp_accel *acc = gsl_interp_accel_alloc(); 
      gsl_spline *spline = gsl_spline_alloc(gsl_interp_akima, 2*NSTEPS); 
      gsl_spline_init(spline, tx, theight, 2*NSTEPS); 

      for (q = 0; q< 2*NSTEPS*100; q++) 
      { 
       terrain[q] = gsl_spline_eval(spline,xi,acc); 
       terrainsl[q] = gsl_spline_eval_deriv(spline,xi,acc); 
       xi = xi+(double) space/refine; 
      } 
return 0; 
} 
+0

내가 그것을 실행할 때 나는 내 Windows 시스템에서이 프로그램을 실행할 때 오류가 없다는 것을 추가해야하지만 랩 서버의 Linux 서버에서 interp 오류가 발생합니다. – NKD

+1

플로트 정밀도 오류가 문제 일 수 있습니다. 범위를 늘리려면 tx의 첫 번째 요소와 마지막 요소에 작은 시프트를 추가합니다. 계산에 필요한 정밀도가 배정도보다 훨씬 낮기 때문에 최종 결과에 영향을 미치지 않습니다. –

+0

@ViniciusMiranda, 죄송합니다. 'tx의 첫 번째 요소와 마지막 요소에 작은 시프트를 추가하십시오.' – NKD

답변

1

tx와 theight에 추가 요소를 추가하여 문제를 해결했습니다. 나는 이것이 내가 네가 부탁 한 일이라고 추측한다. @ViniciusMiranda. 코드는 이제 읽습니다.

   double tx[2*NSTEPS+1] = {0}, theight[2*NSTEPS+1] = {0}; 
       double terrain[(int) (2*NSTEPS*100)] = {0}; 
       double terrainsl[(int) (2*NSTEPS*100)] = {0}; 

      for (j = 0; j < 2*NSTEPS+1; j++) 
      { 
       tx[j] = (double) j*space; 
       theight[j] = randomground(); 
      } 

      gsl_interp_accel *acc = gsl_interp_accel_alloc(); 
      gsl_spline *spline = gsl_spline_alloc(gsl_interp_akima, 2*NSTEPS+1); 
      gsl_spline_init(spline, tx, theight, 2*NSTEPS+1); 

      for (q = 0; q< 2*NSTEPS*100; q++) 
      { 
       terrain[q] = gsl_spline_eval(spline,xi,acc); 
       terrainsl[q] = gsl_spline_eval_deriv(spline,xi,acc); 
       xi = xi+(double) space/refine; 
      } 

이 수정 프로그램이 필요한 이유는 여전히 이해가되지 않습니다.

+1

문제의 원인은 경계에서 높이를 제공하지만 보간 수 오류를 제공하도록 보간을 요청한 것입니다 (0.0 == 0.0은 일반적으로 double 형의 16 번째 자릿수 때문에 잘립니다!) 외삽 오류를 줄 수 있습니다. 그래서 범위를 넓히라고 제안한 이유입니다. array의 첫 번째 원소는 0이고 여러분은 0에서 보간법을 요구하기 시작합니다. 이 오류의 존재를 테스트하기위한 한 가지 빠른 해킹은 경계 tx [0] = 0-1e-14 및 tx [size-1] = last_element * (1 + 1e-14)에서 작은 시프트를 추가하는 것입니다. –

0

아키마 스플라인은 로컬, 서브 스플라인 보간입니다. 당신이 x_i <= x <= x_i+1에 대한 x의 값을 얻기 위해 시도하는 경우 함수 f(x)를 들어, 아키 마 스플라인은의 쌍을 (x_j, f_j) 필요 j = i-2, i-1, i, i+1, i+2, i+3.