1

我将可以选择在 swig 中包装的 ode 求解器中选择积分方法。我在一个类中定义了简单的谐振子:

class HO
{
    double gamma;

public:
    HO(double gamma_) : gamma(gamma_) {}

    void operator()(const vector<double> &y, vector<double> &dydt, const double t)
    {
        dydt[0] = y[1];
        dydt[1] = -y[0] - gamma * y[1];
    }
};

和 euler 积分器作为接受 std::function 作为参数的函数:

typedef std::vector<double> dim1;
typedef std::vector<vector<double>> dim2;

dim2 integrate_euler(
    std::function<void(const dim1 &, dim1 &, const double)> func,
    dim1 &y0,
    double ti,
    double tf,
    double dt);

用 swig 编译后,我在 python 中导入库:

import odesolver
dt = 0.01
ode = odesolver.HO(0.05)
x0 = [0.5, 1.0]
s =  odesolver.integrate_euler(ode, x0, 0., 100., dt)

我收到以下错误:

Traceback (most recent call last):
  File "runme.py", line 19, in <module>
    s =  odesolver.integrate_euler(ode, x0, 0., 100., dt)
  File "/home/ziaee/git/04_SOLVERS/ode_solver/CPP/using_operator/swig/odesolver.py", line 459, in integrate_euler
    return _odesolver.integrate_euler(func, y0, ti, tf, dt)
TypeError: in method 'integrate_euler', argument 1 of type 'std::function< void (dim1 const &,dim1 &,double const) >'

如果您有兴趣测试它,我将完整的代码放在这里。

这个问题有点像这个问题,不同之处在于我传递了一个 std::function。您有任何解决方案或替换想法吗?

4

0 回答 0