我花了一些时间在互联网上寻找解决方案,也许它就在那里,但我看到的并没有帮助我。
我有一个功能!
double integrand(double r, double phi, double theta)
我希望在三个维度上与某些给定的界限相结合。我在互联网上发现了多行代码,实现了单变量定积分数值方案。我在想自己“好吧,我会只是沿着一个维度整合”。
从算法上讲我想做的是:
double firstIntegral(double r, double phi) {
double result = integrationFunction(integrand,lower_bound,upper_bound);
return result;
}
再简单再做两次。这在Matlab这样的语言中很容易,我可以在任何地方创建函数处理程序,但我不知道如何在C ++中这样做。我必须首先定义一个函数,一些r和phi将计算任何theta的积分(r,phi,theta),并使它在C ++中只是一个变量的函数,但我不知道该怎么做。
如何使用一维集成例程(或其他任何真正......)来计算C ++中三变量函数的三重积分?
答案 0 :(得分:1)
对于积分超过笛卡尔坐标,这是一个非常缓慢且不精确的版本,应该适用于C ++ 11。
使用std :: function和lambdas来实现数值积分。没有采取任何措施来优化这一点。
基于模板的解决方案可能比这更快(几个数量级),因为它可以允许编译器内联和简化一些代码。
#include<functional>
#include<iostream>
static double integrand(double /*x*/, double y, double /*z*/)
{
return y;
}
double integrate_1d(std::function<double(double)> const &func, double lower, double upper)
{
static const double increment = 0.001;
double integral = 0.0;
for(double x = lower; x < upper; x+=increment) {
integral += func(x) * increment;
}
return integral;
}
double integrate_2d(std::function<double(double, double)> const &func, double lower1, double upper1, double lower2, double upper2)
{
static const double increment = 0.001;
double integral = 0.0;
for(double x = lower2; x < upper2; x+=increment) {
auto func_x = [=](double y){ return func(x, y);};
integral += integrate_1d(func_x, lower1, upper1) * increment;
}
return integral;
}
double integrate_3d(std::function<double(double, double, double)> const &func,
double lower1, double upper1,
double lower2, double upper2,
double lower3, double upper3)
{
static const double increment = 0.001;
double integral = 0.0;
for(double x = lower3; x < upper3; x+=increment) {
auto func_x = [=](double y, double z){ return func(x, y, z);};
integral += integrate_2d(func_x, lower1, upper1, lower2, upper2) * increment;
}
return integral;
}
int main()
{
double integral = integrate_3d(integrand, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
std::cout << "Triple integral: " << integral << std::endl;
return 0;
}
答案 1 :(得分:0)
您可以使用仿函数
#include <iostream>
struct MyFunctorMultiply
{
double m_coeff;
MyFunctorMultiply(double coeff)
{
m_coeff = coeff;
}
double operator()(double value)
{
return m_coeff * value;
}
};
struct MyFunctorAdd
{
double m_a;
MyFunctorAdd(double a)
{
m_a = a;
}
double operator()(double value)
{
return m_a + value;
}
};
template<class t_functor>
double calculate(t_functor functor, double value, double other_param)
{
return functor(value) - other_param;
}
int main()
{
MyFunctorMultiply multiply2(2.);
MyFunctorAdd add3(3.);
double result_a = calculate(multiply2, 4, 1); // should obtain 4 * 2 - 1 = 7
double result_b = calculate(add3, 5, 6); // should obtain 5 + 3 - 6 = 2
std::cout << result_a << std::endl;
std::cout << result_b << std::endl;
}
答案 2 :(得分:0)
如果您只关心将正确的原型传递给集成函数,那么您可以很好地使用替代数据传递机制,其中更简单的是使用全局变量。
假设集成顺序在theta
上,然后是phi
,然后是r
,则编写一个参数的三个函数:
It(theta)
计算明确传递的参数theta
和全局phi
和r
的被积函数。
Ip(phi)
从显式传递的参数theta
和全局phi
计算r
的界限;它还将phi
参数复制到全局变量并调用integrationFunction(It, lower_t, upper_t)
。
Ir(r)
从显式传递的参数phi
计算r
的边界;它还将r
参数复制到全局变量并调用integrationFunction(Ip, lower_p, upper_p)
。
现在您已准备好致电integrationFunction(Ir, lower_r, upper_r)
。
也可能integrationFunction
支持&#34; context
&#34;您可以存储所需内容的参数。