复杂函数与Cubature C包的数值积分

时间:2013-05-28 14:22:37

标签: c math numerical-methods complex-numbers

我想使用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中计算复杂函数积分的更好方法吗?

2 个答案:

答案 0 :(得分:1)

2个问题:

1)您宣布double val,但您希望它为double val[2]。你的原始val是cimag(val)中的double将始终返回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);

2)您似乎无法在f(x,y) = x + y*i中正确计算f()fval[0]是双倍的,无法保留您尝试分配的复杂答案。

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”进行测试。

答案 1 :(得分:0)

定义val时,请执行以下操作:

double *val=(double *) malloc(sizeof(double) * integrand_fdim);

其中integrand_fdim等于unsigned fdim - 您的被积函数f的第一个参数。

P.S。:@chux的回答产生了总线10或段错误......