我将可以选择在 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。您有任何解决方案或替换想法吗?