微分方程的解在 boost::odeint 和 scipy.integrate 中完全不同

Solution for differential equation is completly different in boost::odeint and scipy.integrate

本文关键字:integrate scipy boost odeint 微分方程      更新时间:2023-10-16

我正在尝试将我的快速原型从python移植到C++。我尝试用一个简单的微分方程来测试符号,但起始值 [2,0] 的结果非常不同。Python正在下降,而C++解决方案正在强劲增长。

它适用于此处找到的示例:如何将查找表中的时变参数合并到 boost::odeint、c++ 中

但它不适用于我的例子

TransferF::TransferF(const double& deltaT) : dt(deltaT), t(0.0), y(2)
{
    // initial values
    y[0] = 2.0;  //  x1 
    y[1] = 0.0;  //  x2
}

void TransferF::ode(const state_type &x, state_type &y, double t)
{
    y[0] = x[0];
    y[1] = x[1];
    y[2] = (-2*y[1] - y[0] + 1) / (pow(y[0],2));
}

在 PY 中也是如此:

def modelt(x,t):
    y = x[0]
    dydt = x[1]
    dy2dt2 = (-2*dydt - y + 1)/ (y **2)
    return [dydt,dy2dt2]
x3 = odeint(modelt,[2,0],timev)

我预计时间序列的结果相同,但 python 的解决方案正在下降,C++正在上升。

C++代码有一个微妙的不一致。输出向量y应该只包含导数y', y",而不是函数本身y

void TransferF::ode(const state_type &x, state_type &y, double t)
{
    y[0] = x[1];
    y[1] = (-2*x[1] - x[0] + 1) / (pow(x[0],2));
}