微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将包装的 ode 类模型传递给集成器swig

如何解决将包装的 ode 类模型传递给集成器swig

我将有一个选项可以在 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];
    }
};

和作为接受 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,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 &,double const) >'

如果你有兴趣测试它,我把完整的代码 here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。