2016-06-28 16 views
3

みなさんこんにちは皆私はプログラムをGSLルート検索で動作させるために問題があります。私は私の方程式の解を見つけようとしています。私は64行のデータのソリューションを探していますが、いくつかの特定の行では、良い解決策が存在しないためにプログラムを続行できません。しかし、私は、彼が解決策を見いださなかったときに、プログラムをちょうどスキップすることを望んでいます。しかし、私のプログラムはちょうど停止し、このメッセージが表示されます。 gsl:brent.c:74:エラー:エンドポイントはy = 0をまたいでいません。 passou1passou2passou3Default GSLエラーハンドラが呼び出されました。 中止トラップ:6GSL - ルート検索でエラーが発生しました

だから、私は正確に私のプログラムの停止を確認するために、いくつかのプリントを行なったし、私はそれが(、x_lo、S、& F x_hi)gsl_root_fsolver_setにで見つかったが、私は見つけることができませんでしたかこの値を印刷するか、この関数が私に与えるものを印刷します。

私のプログラムは、ここにありがとうございます!

#include <stdio.h> 
#include <math.h> 
#include <gsl/gsl_errno.h> 
#include <gsl/gsl_math.h> 
#include <gsl/gsl_complex_math.h> 
#include <gsl/gsl_roots.h> 
#include "demo_fn.h" 
#include "demo_fn.c" 

int 
main (void) 
{ 

double NT, c; 
c = 64.0/2.0; 

char url[]="charm.txt"; 
double corr, core, a[64][3]; 
int nt, i = 0; 
FILE *arq; 
arq = fopen(url, "r"); 
if(arq == NULL) 
    printf("Erro, nao foi possivel abrir o arquivo\n"); 
else 
    while((fscanf(arq,"%lf %lf %i\n", &corr, &core, &nt))!=EOF) { 
     a[i][0]=corr; 
     a[i][1]=core; 
     a[i][2]=nt; 
     i++; 
     //printf("%lf, %lf, %i\n",corr, core, nt); 
    } 

fclose(arq); 




for (i= 0; i < 64; i++) 
{ 
    int status; 
    int iter = 0, max_iter = 200; 
    const gsl_root_fsolver_type *T; 
    gsl_root_fsolver *s; 
    double r = 0, r_expected = 4.0; 
    double x_lo = 0.0001, x_hi = 4.0; 
    double ratio1, ratio2; 

    ratio1 = a[i][0]/a[i+1][0]; 
    ratio2 = a[i+1][0]/a[i+2][0]; 
    printf ("ratio1: %lf, ratio2: %lf", ratio1, ratio2); 
    printf ("\n"); 

// if (ratio1*ratio2 > 0) 
//  { 

    printf("C(n_t) : %.15lf -- loop index : %i ----- ratio: %lf \n", a[i][0],i, ratio1); 

    gsl_function F; 
    struct quadratic_params params = {a[i][0], i, c, i+1, a[i+1][0]}; 
    F.function = &quadratic; 
      printf ("passou1"); 
    F.params = &params; 
    T = gsl_root_fsolver_brent; 
      printf ("passou2"); 
    //T = gsl_root_fsolver_bisection; 
    s = gsl_root_fsolver_alloc (T); 
     printf ("passou3"); 
    gsl_root_fsolver_set (s, &F, x_lo, x_hi); 
     printf ("passou4"); 
    printf ("using %s method\n", gsl_root_fsolver_name (s)); 
    printf ("%5s [%9s, %9s] %9s %10s %9s\n", "iter", "lower", "upper", "root", "err", "err(est)"); 


    do 
    { 
     iter++; 
     status = gsl_root_fsolver_iterate (s); 
     r = gsl_root_fsolver_root (s); 
     x_lo = gsl_root_fsolver_x_lower (s); 
     x_hi = gsl_root_fsolver_x_upper (s); 
     status = gsl_root_test_interval (x_lo, x_hi,0, 0.001); 
     if (status == GSL_SUCCESS) 
     { 
      printf ("Converged:\n"); 
     } 
     printf ("%5d [%.7lf, %.7lf] %.7lf %+.7lf %.7lf\n", iter, x_lo, x_hi, r, r - r_expected, x_hi - x_lo); 


    } 
    while (status == GSL_CONTINUE && iter < max_iter); 

    gsl_root_fsolver_free (s); 

//  } 

    printf("\n"); 
} 



return 0; 

} 
+0

'#include" demo_fn.c "は最小限だと言っても構わないものです。 – EOF

+0

私はこの部分が私の機能であり、デモからのデモです。 – Gabriela

答えて

2

ガブリエル。出力は、あなたがなぜプログラムが間違っているのかをすでに伝えています。 エンドポイントはy = 0に跨っていません。

The root bracketing algorithms described in this section require an initial interval which is guaranteed to contain a root—if a and b are the endpoints of the interval then f(a) must differ in sign from f(b).

上記manual of gslからなので、エンドポイントは、同じ符号を持っている場合、プログラムが停止し、あなたにこのエラーを教えてくれます。

gslでエラーハンドラを試したことがありますか?マニュアルの第3章では、gsl_set_error_handler_off()という関数を提供しています。この関数をgsl_root_fsolver_set(s,&F, x_lo, x_hi)の直前に置いて、int型変数にこの関数を割り当てることができます。statusgsl_root_fsolver_set(s,&F, x_lo, x_hi))がint functionの場合、statusの値を出力してgsl_errno.hファイルで確認すると、その値の意味を知ることができます。

gsl_set_error_handler_off()は、中絶を実行から却下することができます。

あなたのコードのように、あなたが行う必要があり、以下:あなたは少し変更を行うために、プログラムの次のループのようなstatusの値を使用しgsl_set_error_handler_off()

  • status=gsl_root_fsolver_set(s,&F, x_lo, x_hi)

    1. が追加#include <gsl/gsl_errno.h>
    2. を追加あなたが終点を拡大したり狭めたり翻訳したりすることができます。最初の条件を満たしたときにプログラムは再び実行されます。
  • 関連する問題