python - boost::odeint 和 scipy.integrate 中微分方程的解完全不同
问题描述
我正在尝试将我的快速原型设计从 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)
我预计时间序列的结果相同,但 pythons 解决方案正在下降,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));
}
推荐阅读
- python - tf.image.stateless_random_crop VS。tf.image.random_crop。这些不应该是一样的吗?
- amazon-web-services - 如何使用 CDK 将 AWS Contributor Insights 添加到 Cloudwatch 仪表板?
- javascript - socketcluster-client中的内存泄漏?
- html - 在“tick”图标的 HTML 十六进制代码周围添加一个适当的圆圈
- javascript - Value 与 Prototype 的比较逻辑
- python - 将多维数组的元素与两个新数组进行比较和存储
- pic - PIC 16F887内部EEPROM写入问题
- javascript - 如何打印数组的更改值并将其恢复为 Javascript 中的先前值?
- flask - Flask 使用 url_for() 路由多个可选参数
- javascript - 我如何获得令牌?