0

統合にGSLを使用したい http://www.gnu.org/software/gsl/manual/html_node/Numerical-Integration.html

(例の関数 f http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html )

インテグレータにエラーを報告できます。失敗する可能性のある統合の結果である関数を統合したいと考えています。これは私のサンプルプログラムです

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>

double f (double x, void * params) {
    GSL_ERROR("test error",GSL_FAILURE);
    return 0.0;
}



int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);

double result, error;

gsl_function F;
F.function = &f;

gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
                     w, &result, &error); 

printf ("status          = %d\n", status);
status  = GSL_FAILURE;
printf ("status          = %d\n", status);


gsl_integration_workspace_free (w);

return 0;
}

出力 status = 0 status = -1 になります

インテグレーターは停止してエラー コードを返す必要があると思います。どうすればこれを達成できますか?

ご助力ありがとうございます!!!

2011-04-27: Brian Gough が私に言った後、私もこの変種を試しました。

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>

double f (double x, void * params) {
    GSL_ERROR("test error",GSL_FAILURE);
    return GSL_NAN;
}



int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);

double result, error;

gsl_function F;
F.function = &f;

gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
                     w, &result, &error); 

printf ("status          = %d\n", status);
status  = GSL_FAILURE;
printf ("status          = %d\n", status);


gsl_integration_workspace_free (w);

return 0;
}

それも役に立ちませんでした。バグレポートに記入します。

4

3 に答える 3

4

GSLメーリングリストのXuebinWuのおかげで、問題は解決しました。

やあ、

GSL_ERROR自体はマクロであり、次のようになります。

      gsl_error (reason, __FILE__, __LINE__, gsl_errno);
      return gsl_errno;

GSL_ERRORが呼び出されているため、NANを返す前に、関数はすでに返されています。ハンドラーをオフにすると、最初の行は何もしません。デフォルトのエラーハンドラは、エラーメッセージを出力した後にプログラムを中止します。

バグではないと思います。たぶん、あなたはあなたの問題を解決するためにあなた自身のエラーハンドラを書くことができます。たとえば、「goto」を使用してgsl_integration_qagsからジャンプしたり、グローバル変数を設定して積分結果が正しくないことを示したりすることができます。

PS:このマクロはあなたが必要としているものだと思います、

マクロ:GSL_ERROR_VAL(reason、gsl_errno、value)このマクロはGSL_ERRORと同じですが、エラーコードの代わりにユーザー定義の値の値を返します。浮動小数点値を返す数学関数に使用できます。

次の例は、GSL_ERROR_VALマクロを使用して数学的な特異点でNaNを返す方法を示しています。

 if (x == 0)
   {
     GSL_ERROR_VAL("argument lies on singularity",
                   GSL_ERANGE, GSL_NAN);
   }

だから私はに従ってコードを調整しました

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>

double f (double x, void * params) {
//  return GSL_NAN;
    GSL_ERROR_VAL ("argument lies on singularity", GSL_ERANGE, GSL_NAN);
}



int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);

double result, error;

gsl_function F;
F.function = &f;

gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
                     w, &result, &error); 

printf ("status          = %d\n", status);
status  = GSL_FAILURE;
printf ("status          = %d\n", status);


gsl_integration_workspace_free (w);

return 0;
}

そして、すべてが期待どおりに機能します...

于 2011-04-28T16:48:42.553 に答える
0

関数の結果とエラーステータスを含む構造体へのポインタを返す関数のラッパーを書くのはどうですか? または、c++ を使用する場合、このカプセル化はオブジェクトを使用して行うことができます ....

于 2011-04-19T14:19:57.150 に答える
0

少しハックですが、おそらく関数にフラグを保存してもらいます。エラーが発生すると、フラグが設定され、その後のすべての評価でゼロが返されます。次に、統合した後、このフラグをチェックして、結果が有効かどうかを確認できます。

于 2011-04-19T14:12:30.870 に答える