2013-04-02 106 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

很高興幫助:-) –