2013-04-02 108 views
1

我正在尝试使用g ++编译与ODE求解器gsl/gsl_odeiv2相关的示例代码。下面的代码是从他们的网站:使用g ++编译GSL odeiv2

http://www.gnu.org/software/gsl/manual/html_node/ODE-Example-programs.html

下的gcc编译罚款,但G ++引发错误

invalid conversion from 'void*' to 'int (*)(double, const double*, double*, double*, void*)' [-fpermissive]

代码:

#include <stdio.h> 
#include <gsl/gsl_errno.h> 
#include <gsl/gsl_matrix.h> 
#include <gsl/gsl_odeiv2.h> 

int func (double t, const double y[], double f[], void *params) 
{ 
    double mu = *(double *)params; 
    f[0] = y[1]; 
    f[1] = -y[0] - mu*y[1]*(y[0]*y[0] - 1); 
    return GSL_SUCCESS; 
} 


int * jac; 

int main() 
{ 
    double mu = 10; 
    gsl_odeiv2_system sys = {func, jac, 2, &mu}; 

    gsl_odeiv2_driver * d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rkf45, 1e-6, 1e-6, 0.0); 
    int i; 
    double t = 0.0, t1 = 100.0; 
    double y[2] = { 1.0, 0.0 }; 

    for (i = 1; i <= 100; i++) 
    { 
     double ti = i * t1/100.0; 
     int status = gsl_odeiv2_driver_apply (d, &t, ti, y); 

     if (status != GSL_SUCCESS) 
     { 
      printf ("error, return value=%d\n", status); 
      break; 
     } 

     printf ("%.5e %.5e %.5e\n", t, y[0], y[1]); 
    } 

    gsl_odeiv2_driver_free (d); 
    return 0; 
} 

错误在线上给出

gsl_odeiv2_system sys = {func, jac, 2, &mu};

任何帮助解决这个问题将是太棒了。我希望包含一些stdlib元素,因此希望将其编译为C++。另外,如果我可以用g ++ - 4.7编译它,我可以更容易地使用C++ 11对该语言的补充来多线程化它。非常感谢你。

回答

1

它看起来像你有雅可比一些问题。在您的特定情况下,你可以只在您的系统的定义中使用NULL而不是江淮,即

gsl_odeiv2_system sys = {func, NULL, 2, &mu}; 

一般来说,你的雅可比必须与特定条目的功能 - 看GSL手册 - 这就是为什么你的编译器是抱怨。

此外,您可能希望将GSL库手动链接:

-L/usr/local/lib -lgsl 

如果你是一个Linux系统上。

+0

谢谢,那的确是问题所在。我宣布雅可比作为一个无关的相关论据的函数,但我会在下一次使用NULL,因为它更干净。 – Quentin

+0

很高兴帮助:-) –