我正在尝试使用g ++编译与ODE解算器gsl/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添加语言来更轻松地多线程化。非常感谢你。
答案 0 :(得分:2)
看起来雅各比派有些问题。在您的特定情况下,您可以在系统定义中使用NULL而不是jac,即
gsl_odeiv2_system sys = {func, NULL, 2, &mu};
一般来说,Jacobian必须是具有特定条目的函数 - 请参阅gsl手册 - 这就是您的编译器抱怨的原因。
此外,您可能希望手动链接gsl库:
-L/usr/local/lib -lgsl
如果您使用的是Linux系统。