2

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

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 对语言的添加来对它进行多线程处理。非常感谢你。

4

1 回答 1

2

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

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

一般来说,您的 Jacobian 必须是具有特定条目的函数 - 请参阅 gsl 手册 - 这就是您的编译器抱怨的原因。

此外,您可能需要手动链接 gsl 库:

-L/usr/local/lib -lgsl

如果你在linux系统上。

于 2013-04-04T09:50:12.247 回答