集成三个变量C ++的函数

时间:2017-07-06 12:17:52

标签: c++ numerical-methods scientific-computing numerical-integration

我花了一些时间在互联网上寻找解决方案,也许它就在那里,但我看到的并没有帮助我。

我有一个功能!

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 ++中三变量函数的三重积分?

3 个答案:

答案 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和全局phir的被积函数。

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;您可以存储所需内容的参数。