首页 > 解决方案 > 在 boost::odeint 中使用 VectorXd

问题描述

我需要用 C++ 解决一些与我的论文领域相关的 ODE 系统。为此,我可以依赖现有的包,其中有人已经实现了数学问题并硬编码了求解器。

现在,尽可能地保留给定的结构,我想使用更强大和执行的积分器,例如boost::odeint中提供的积分器。

这是包中的功能,我想修改它以便集成它。

//Ordinary differential equation describing elastic rod
Eigen::VectorXd cosseratRodOde(Eigen::VectorXd y){
    //Unpack state vector
    Eigen::Matrix3d R = Eigen::Map<Eigen::Matrix3d>(y.segment<9>(3).data());
    Eigen::Vector3d n = y.segment<3>(12);
    Eigen::Vector3d m = y.segment<3>(15);

    //Hard-coded material constitutive equation w/ no precurvature
    Eigen::Vector3d v = Kse.inverse()*R.transpose()*n + Eigen::Vector3d::UnitZ();
    Eigen::Vector3d u = Kbt.inverse()*R.transpose()*m;

    //ODEs
    Eigen::Vector3d p_s = R*v;
    Eigen::Matrix3d R_s = R*hat(u);
    Eigen::Vector3d n_s = -rho*A*g;
    Eigen::Vector3d m_s = -p_s.cross(n);

    //Pack state vector derivative
    Eigen::VectorXd y_s(18);
    y_s << p_s, Eigen::Map<Eigen::VectorXd>(R_s.data(), 9), n_s, m_s;

    return y_s;
}

现在我知道这个功能需要修改。它必须是 void 并且具有 dxdt 和 t 参数。我尝试了很多次,我不想让这篇文章过于冗长。

如何集成此功能?这种数值积分是否有更实用/更实用的解决方案?

由于我需要实现 Levemberg-Marquadart 算法,因此我更愿意继续使用 Eigen,以便在使用它时可以依赖他们的算法版本。

谢谢你。

标签: c++boosteigenodeint

解决方案


推荐阅读