C++ 复函数的多维数值积分

C++ 复函数的多维数值积分,c++,integration,gsl,numerical-integration,C++,Integration,Gsl,Numerical Integration,我有两个功能 std::complex<double> foo(double x, double y); double bar(double x, double y); 当然,可以使用GSL提供的例程将此积分拆分为实部和虚部,并分别对它们进行积分,但是,函数bar在计算上非常昂贵(并且运行时非常重要),因此我希望避免调用bar两次。是否有任何库允许我执行此积分(或者您是否有建议如何执行此积分而不必调用两次bar) 我可能还应该声明这两个函数都是类的成员函数。对于“避免调用bar两次

我有两个功能

std::complex<double> foo(double x, double y);
double bar(double x, double y);
当然,可以使用GSL提供的例程将此积分拆分为实部和虚部,并分别对它们进行积分,但是,函数
bar
在计算上非常昂贵(并且运行时非常重要),因此我希望避免调用
bar
两次。是否有任何库允许我执行此积分(或者您是否有建议如何执行此积分而不必调用两次bar)


我可能还应该声明这两个函数都是类的成员函数。

对于“避免调用
bar
两次”,我假设您的意思是“避免为相同的输入调用它两次”。如果是这样,您可以在另一个函数中包装
,该函数存储所有给定
x,y
组合的结果,并在重复计算相同的
x,y
时返回存储的值。您的积分限制是什么?如果它们是常数,我可能会从众多的c2集成方法中选择一种,并自己实现。您能给我们提供一些关于
bar
的信息吗?我做了核磁共振成像模拟,平面上的磁场矢量是用复杂的图形计算出来的。你可能犯了我们一开始常犯的所有错误。我真的相信GSL不一定是一个好去处。我非常喜欢CVODE。它是一个可变时间步进解算器,为运行时带来了魔力。但事实也证明,当我们积分幅度和相位时,我们会加速积分的2000倍。你找到了我合著的东西,请原谅我迟来的回答,我已经有一段时间没有检查stackoverflow了,因为我不得不暂停那个项目。如果你感兴趣的话,我想积分的函数是,将(l1,l2)-积分变换成极坐标(r,psi)的等式(15),因此贝塞尔函数的参数只取决于r。然后,我用Ogata等人(2005)的方法求解r积分。结果是我的(实值)条。其余(phi,psi)积分的前置因子是foo。对于“避免调用
bar
两次”,我假设您的意思是“避免为同一输入调用它两次”。如果是这样,您可以在另一个函数中包装
,该函数存储所有给定
x,y
组合的结果,并在重复计算相同的
x,y
时返回存储的值。您的积分限制是什么?如果它们是常数,我可能会从众多的c2集成方法中选择一种,并自己实现。您能给我们提供一些关于
bar
的信息吗?我做了核磁共振成像模拟,平面上的磁场矢量是用复杂的图形计算出来的。你可能犯了我们一开始常犯的所有错误。我真的相信GSL不一定是一个好去处。我非常喜欢CVODE。它是一个可变时间步进解算器,为运行时带来了魔力。但事实也证明,当我们积分幅度和相位时,我们会加速积分的2000倍。你找到了我合著的东西,请原谅我迟来的回答,我已经有一段时间没有检查stackoverflow了,因为我不得不暂停那个项目。如果你感兴趣的话,我想积分的函数是,将(l1,l2)-积分变换成极坐标(r,psi)的等式(15),因此贝塞尔函数的参数只取决于r。然后,我用Ogata等人(2005)的方法求解r积分。结果是我的(实值)条。其余(phi,psi)集成的前置因子是foo。
\int dx \int dy foo(x,y)*bar(x,y) .