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