三维微分方程组四阶龙格库塔求解

利用c++ boost库求解一阶微分方程计算船舶运动_河北一帆的博客-CSDN博客_c++求解微分方程

这篇博文中利用boost库求解线性三自由度船舶运动模型。但是boost库非常庞大,达到好几个G,不如自己写一个龙格库塔求解。网上搜索到的例子大多数是一维微分方程的,推广到三维其实很容易。三自由度船舶运动模型如下所示。

一维微分方程

\frac{dx}{dt}=f(t,x)

x(t_0)=x_0

四阶龙格库塔计算公式为

K1=f(t_i,x_i)

K2=f(t_i+\frac{h}{2},x_i+\frac{hK1}{2})

K3=f(t_i+\frac{h}{2},x_i+\frac{hK2}{2})

K4=f(t_i+h,x_i+hK3)

x_{i+1}=x_{i}+h\frac{K1+2K2+2K3+K4}{6}

h是求解步长。 对于推广到三维,直接将三维向量\nu替换x

double h = 0.1;
double dt = 1;
Eigen::Vector3d nu_;
nu_ << this->nu[0], this->nu[1], this->nu[2];
for (int i = 0; i < 10; i++) {
    Eigen::Vector3d K1 = this->f(nu_, tau);
    Eigen::Vector3d K2 = this->f(nu_ + 0.5 * h * K1, tau);
    Eigen::Vector3d K3 = this->f(nu_ + 0.5*h*K2, tau);
    Eigen::Vector3d K4 = this->f(nu_ + h * K3, tau);
    nu_ = nu_ + h / 6 * (K1 + 2 * K2 + 2 * K3 + K4);
}

Eigen::Vector3d mss::Vessel::f(Eigen::Vector3d y, Eigen::Vector3d F) {
    return this->M.inverse() * (-this->D * y + F);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值