多维积分耦合极限 我需要计算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);