【问题标题】:How to solve this ordinary differential equation using C++ Boost odeint library [closed]如何使用 C++ Boost odeint 库求解这个常微分方程 [关闭]
【发布时间】:2016-01-17 19:52:26
【问题描述】:

使用boost c++ odeint库,如何求解以下运动常微分方程,

z'' = -n²·z.

上述ODE的解析解为

z(t) = (z0'/n)·sin(n·t) + z0·cos(n·t)。


OP 在回答中根据评论(1 月 17 日 23:01)尝试解决方案

我的程序是:

void ode( const state_type &z , state_type &dzdt , double t ) { 
    dzdt[0] = z[1]; 
    dzdt[1] = -1 * z[0] * w * w; 
} 

void write_ode( const state_type &z , const double t ) {
    cout << t << '\t' << z[0] << '\t' << z[1] << endl; 
} 

int main { ... 

    integrate( ode , z , t , 1000 , 0.1 , write_ode ); 
}

但集成函数只返回 z0 和 z0' 的值。我需要找到 z(t) 的值。

【问题讨论】:

  • 这个问题对于 Stack Overflow 来说有点过于抽象和概念化。 SO 更多的是用于获得特定编程问题的答案,而不是用于一般算法建议(当然也不是为了让人们为您编写代码)。一旦你有了一个算法并且你第一次尝试编写代码来解决这个问题,这个网站可以帮助你解决具体问题。
  • z(0) 和 z'(0) 是初始值,需要您自己提供。
  • 为什么问题已关闭?这个问题的措辞不是很好,但我认为这个问题不需要结束。这里有几个类似于这个问题的问题,但它们没有关闭。请重新考虑打开它。

标签: c++ boost odeint


【解决方案1】:

您可以使用标准方法来转换 N 维一阶 ODE 的 N 阶微分方程。在您的情况下,这是:

x = z
y = dz/dt

dx/dt = y
dy/dt = n^2 x

您可以轻松地将其放入任何 odeint 求解器中。但是,您的 ODE 似乎是哈密顿量 - 您可能还会考虑一个辛求解器。它们保存相空间体积并且能量“仅”围绕初始能量振荡。 Odeint 实现了两个辛求解器。

【讨论】:

  • 非常感谢。我做到了,但集成函数只返回 z0 和 z0' 的值。我需要找到 z(t) 的值。我的程序是: void ode( const state_type &z , state_type &dzdt , double t ) { dzdt[0] = z[1]; dzdt[1] = -1 * z[0] * w * w; } void write_ode( const state_type &z , const double t ) { cout
  • 嗯,你的代码看起来基本没问题。您没有在控制台上打印 z 的时间演变吗?当然,调用integrate z 后会包含z 的当前值。如果你需要一个数组(或向量)的完整演化,你需要修改你的观察者:vector z_eval;积分( ode , z , t , 1000 , 0.1 , [&z_eval]( const state_type& x , double t ) { z_eval.push_back( x ); } );
  • 请在问题中添加代码和其他相关信息。它确实属于那里,并且格式更好。这样,您甚至可以获得足够的选票来“重新打开”问题。
  • t的初始化值是多少?
  • @LutzL,t的初始化值由OP决定。从零开始是一个合理的选择。我对这个问题有一个完整的解决方案,但问题正在关闭。
猜你喜欢
  • 2020-01-21
  • 2018-02-08
  • 1970-01-01
  • 2015-12-13
  • 2012-02-28
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多