2

Cubature C パッケージを使用して、複雑な関数の多次元積分を実行したいと考えています。正方形 [0,1]x[0,1] 上の非常に単純な関数 f(x,y) = x + y*i に対して、次の方法でそれを実行しようとしました。正確な結果は 0.5 + 0.5i です。

#include <stdio.h>
#include <math.h>
#include <complex.h>
#include "../cubature.h"

int f(unsigned ndim, const double *x, void *fdata, unsigned fdim, double *fval);

int main(void)
{
    double xmin[2] = {0,0}, xmax[2] = {1,1}, val, err;
    hcubature(1, f, NULL, 2, xmin, xmax, 0, 0, 1e-3, ERROR_PAIRED, &val, &err);
    printf("Computed integral = %f+%fi +/- %f\n", creal(val),cimag(val), err);
}

int f(unsigned ndim, const double *x, void *fdata, unsigned fdim, double *fval) 
{
    fval[0] = x[0]+x[1]*I;
    return 0;
}

しかし、私が得Computed integral = 0.500000+0.000000i +/- 0.000000たのは、虚数部が表示されないということです。純粋な虚数被積分関数 (x*i など) を入れると、結果として常に 0 が得られます。

私は何を間違っていますか?C で複雑な関数の積分を計算するより良い方法を知っていますか?

4

2 に答える 2

3

2 つの問題:

1) あなたは を宣言しdouble valていますが、それを にしたいですdouble val[2]doublecimag(val)の元の valは常に 0.0 を返します。への変更

double xmin[2] = {0,0}, xmax[2] = {1,1}, val[2] /* not val */, err;
hcubature(2 /* not 1 */, f, NULL, 2, xmin, xmax, 0, 0, 1e-3, ERROR_PAIRED, /* & */val, &err);
printf("Computed integral = %f+%fi +/- %f\n", val[0], val[1], err);

f(x,y) = x + y*i2) で正しく計算していないようですf()fval[0]は double であり、割り当てようとしている複雑な答えを保持できません。

int f(unsigned ndim, const double *x, void *fdata, unsigned fdim, double *fval) {
    fval[0] = x[0];
    fval[1] = x[1];
    return 0;
}

申し訳ありませんが、現在テストする "../cubature.h" がありません。

于 2013-06-05T05:08:53.583 に答える