在 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,以便在使用时可以依赖他们的算法版本。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)