gsl多变量数值积分

时间:2018-07-16 15:39:55

标签: c++ integration gsl

我一直在使用GSL集成软件包(gsl_integration.h),试图将某些多变量函数f(x,y,z)相对于x在某个极限[a,b]之间进行积分。在此示例中,我有一个玩具模型: f(x,y,z)= x y z

我想使用函数

输出该积分的结果
double integral(double a, double b, double y, double z){}

在此之前,我可以使y和z保持任意值。到目前为止,我的尝试主要涉及在某些预定义函数中将y,z设置为等于常数,然后使用

gsl_integration_qags

函数以集成该功能。但是,我想保持y和z的值任意,直到在上述函数中定义它们为止。到目前为止,我得到的最接近的信息如下

#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
#include <gsl/gsl_integration.h>
#include<stdio.h>
#include<math.h>

#define PI 3.1415926535897

double integrand(double x, void * params){
  double y = *(double *) params;
  double z = *(double *) params;            // PROBLEM: this just sets z = y
  double tmp = x*z*y;
  return tmp;
}

double integral(double a, double b, double y, double z){
  gsl_integration_workspace * w
    = gsl_integration_workspace_alloc (1000);
  gsl_function F;
  F.function = &integrand;               // Set integrand
  F.params = &y, &z;             // Set the parameters you wish to treat as constant in the integration
  double result, error;
  gsl_integration_qags (&F, a, b, 0, 1e-7, 1000,
                        w, &result, &error);
  gsl_integration_workspace_free (w); // Free the memory
  return result;
}




int main(){
std::cout << "Result "<< integral(0.0,1.0,3.0,5.0)<<std::endl;

}

输出为

Result 4.5

代码设置a = 0.0,b = 1.0,y = z = 3.0-我想要a = 0.0,b = 1.0,y = 3.0,z = 5.0,这将得出7.5的结果。

我想坚持与GSL集成,而不是尽可能提高。我也曾咨询过https://www.gnu.org/software/gsl/doc/html/integration.html,但不是明智的选择。任何建议将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

我正在猜测,但是在我看来你想要

double params[] = { y, z };
F.params = params;

double y = ((double *)params)[0];
double z = ((double *)params)[1];