c++ - 使用 C++ Boost odeint 库的二阶微分方程

标签 c++ boost odeint

使用 boost c++ odeint 库,是否可以求解如下定义的二阶微分方程?

m*x''[i] + x'[i] = K*\sum{j=1,N} sin(x[j] - x[i]), where i = 1,2,3..N.
m = 1, K = 1

其中 x 的初始值是 N 个均匀生成的随机数的 vector 或数组,随机数介于 0 到 2*pi 之间。 我想使用 odeint 的 runge_kutta 步进器对上面的等式进行积分?

我可以通过写上面的方程来解决它。在两个一阶微分方程中,但是 那么在那种情况下如何编写或修改 odeint 步进器?

最佳答案

只需将您的方程式转换为一阶 ODE 并使用长度 2 N 的状态类型。前 N 个条目现在仅处理 x[i],而后 N 个条目涉及速度 x'[i]

void ode( state_type const& x , state_type &dxdt , double t )
{
    for( size_t i=0 ; i<N ; ++i )
    {
        double sum = 0.0;
        // calculate sum
        dxdt[i] = x[i+N];
        dxdt[i+N] = K * sum;
    }
}

一个完整的例子可能是这样的

size_t N = 512;
typedef std::vector< double > state_type;
state_type x( 2 * N );
// initialize x
double t_start = 0.0 , t_end = 10.0 , dt = 0.01;
odeint::integrate( ode , x , t_start , t_end , dt );

关于c++ - 使用 C++ Boost odeint 库的二阶微分方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21525964/

相关文章:

c++ - 安装 odeint <boost/config.hpp> 时出错

c++ - C++ 上的 UNICODE (fread) 读取文件错误

c++ - 在多线程上使用共享缓冲区 boost asio async_write

c++ - 多线程程序线程连接问题

c++ - Boost.Filesystem 如何找出您的可执行文件在哪个目录中?

c++ - ODEi​​nt:具有任意精度的自适应积分

python - 在出现第一个错误时停止 scipy odeint

c++ - 如何摆脱这些警告?

c++ - 打印文本导致内存泄漏

c++ - 在 VS 和 gcc 上计算的不同值