Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多变量数值积分_C++_Integration_Gsl - Fatal编程技术网

C++ 多变量数值积分

C++ 多变量数值积分,c++,integration,gsl,C++,Integration,Gsl,我一直在使用GSL集成包GSL_integration.h,试图在一些极限[a,b]之间,集成一些关于x的多变量函数fx,y,z。在这个例子中,我有一个玩具模型:fx,y,z=xyz 我想用一个函数输出这个积分的结果 double integral(double a, double b, double y, double z){} 在这里我可以保持y和z任意直到这一点。到目前为止,我的尝试主要涉及在一些预定义函数中将y,z设置为常数,然后使用 gsl_integration_qags 函数在

我一直在使用GSL集成包GSL_integration.h,试图在一些极限[a,b]之间,集成一些关于x的多变量函数fx,y,z。在这个例子中,我有一个玩具模型:fx,y,z=xyz

我想用一个函数输出这个积分的结果

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;

}
代码设置了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集成而不是推进。我也咨询过,但一点也不明智。任何建议都将不胜感激,谢谢。

我在猜测,但我觉得你想知道

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


谢谢!我已经为此挣扎了一段时间。你的解决方案解决了这个问题。你能把答案标记为正确吗?
double params[] = { y, z };
F.params = params;
double y = ((double *)params)[0];
double z = ((double *)params)[1];