多维积分耦合极限 我需要计算C++中高维积分的值。我发现很多库都能解决固定极限积分的问题 \int_{0}^{L} \int_{0}^{L} dx dy f(x,y) .

多维积分耦合极限 我需要计算C++中高维积分的值。我发现很多库都能解决固定极限积分的问题 \int_{0}^{L} \int_{0}^{L} dx dy f(x,y) .,c++,numerical-methods,integral,C++,Numerical Methods,Integral,但是我看到的积分有可变的极限 \int_{0}^{L} \int_{x}^{L} dx dy f(x,y) . 为了澄清我的意思,这里有一个简单的2D Riemann和实现,它返回了期望的结果 int steps = 100; double integral = 0; double dl = L/((double) steps); double x[2] = {0}; for(int i = 0; i < steps; i ++){ x[0] = dl*i; for(i

但是我看到的积分有可变的极限

\int_{0}^{L} \int_{x}^{L} dx dy f(x,y) .
为了澄清我的意思,这里有一个简单的2D Riemann和实现,它返回了期望的结果

int steps = 100;
double integral = 0;
double dl = L/((double) steps);
double x[2] = {0};

for(int i = 0; i < steps; i ++){
    x[0] = dl*i;
    for(int j = i; j < steps; j ++){
        x[1] = dl*j;
        double val = f(x);
        integral += val*val*dl*dl;
    }
}
int步数=100;
二重积分=0;
双dl=L/((双)步);
双x[2]={0};
对于(int i=0;i
其中f是任意函数,L是公共积分上限。虽然这个实现可以工作,但速度很慢,因此对于更高的维度来说是不切实际的

存在针对更高维度的有效算法,但据我所知,库实现(例如Cuba)将固定值向量作为极限参数,这使得它们对我的问题毫无用处


这有什么原因和/或有什么技巧可以避免这个问题吗?

我被你的积分定义搞糊涂了,但从你的代码中我看到它是这样的:

刚刚做了一些测试,下面是您的代码:

//---------------------------------------------------------------------------
double f(double *x) { return (x[0]+x[1]); }
void integral0()
    {
    double L=10.0;
    int steps = 10000;
    double integral = 0;
    double dl = L/((double) steps);
    double x[2] = {0};
    for(int i = 0; i < steps; i ++){
        x[0] = dl*i;
        for(int j = i; j < steps; j ++){
            x[1] = dl*j;
            double val = f(x);
            integral += val*val*dl*dl;
        }
    }
    }
//---------------------------------------------------------------------------
  • 因此,速度提高了约1.3倍(在WOW64 AMD 3.2GHz上的32位应用程序上)
  • 对于更高的维度,它将倍增
  • 但我仍然认为这种方法是缓慢的
  • 我能想到的唯一降低复杂性的方法就是用代数方法简化事情
    • 通过积分表或拉普拉斯变换或Z变换
    • 但是对于这个f(*x)必须知道
  • 当然,可以减少固定时间
    • 通过使用多线程
    • 和或GPU ussage
    • 这可以使你的速度提高N倍
    • 因为这一切都是可以直接并行的

您的集成顺序错误,应该是
dy dx


你在三角形上积分


0当在三角形区域上积分时,例如
0,您实际上也有问题吗?(除了OT)是的,我的问题是,是否有任何有效的库例程可用和/或任何技巧使标准方法适应我的问题。答案中提供的实现是可行的,但对于更高的维度来说是不切实际的。为了澄清这一点,我稍微对问题进行了重新表述。【cuba】标签与任何事情都有什么关系?cuba是一个解决固定积分限制问题(但据我所知,不是耦合限制问题)的库的例子@user22496此处的标记说明:
//---------------------------------------------------------------------------
void integral1()
    {
    double L=10.0;
    int i0,i1,steps = 10000;
    double x[2]={0.0,0.0};
    double integral,val,dl=L/((double)steps);
    #define f(x) (x[0]+x[1])
    integral=0.0;
    for(x[0]= 0.0,i0= 0;i0<steps;i0++,x[0]+=dl)
    for(x[1]=x[0],i1=i0;i1<steps;i1++,x[1]+=dl)
        {
        val=f(x);
        integral+=val*val;
        }
    integral*=dl*dl;
    #undef f
    }
//---------------------------------------------------------------------------
[ 452.639 ms] integral0
[ 336.268 ms] integral1
f = @(x,y) (2*x+y).*(x<=y);
result = integral2(f, 0, 1, 0, 1);
fprintf('%.9f\n',result);
g = @(x,y) (2*min(x,y)+max(x,y));
result2 = integral2(g, 0, 1, 0, 1)/2;
fprintf('%.9f\n',result2);