c++ - 在 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,以便在使用它时可以依赖他们的算法版本。
谢谢你。
解决方案
推荐阅读
- python - 为输赢造成延迟
- xilinx - 当被调用函数不可合成时合成调用函数
- php - 在循环中将三个元素增加一个数字
- google-apps-script - Google Scripts - 多重保护的 removeEditors()
- reference - IBM Integration Bus ESQL 对 OutputRoot 的引用不起作用
- c# - C# 和 WPF,当使用 mvvm 样式和按钮操作作为带有命令参数的命令时,如何始终在命令参数中创建新对象?
- angular - 在 angular6 中传递 JSON.stringfy 中的多个值
- c++ - 检查两个矩形是否重叠或边缘是否接触
- amazon-web-services - AWS 认知和组
- android - 根据 Android 中的焦点元素在 WebView 中显示或隐藏键盘