四阶龙格库塔方程(Rungekutta)解二阶常微分方程组并计算船舶在迎浪下的纵摇埀荡耦合运动方程-附Matlab代码

本文介绍了如何使用四阶龙格库塔方法解决二阶常微分方程组,以模拟船舶在迎浪下的纵摇和埀荡耦合运动。作者分享了自己编写的Matlab代码,包括纵摇和埀荡方程,以及龙格库塔算法实现,同时涉及到波浪力和力矩的计算。最终结果展示为周期性运动,符合物理预期。
摘要由CSDN通过智能技术生成

今年年初的时候给师姐做了DDPG算法的船舶减横摇控制算法,师姐还有想法要让我把纵摇-埀荡两个自由度的减摇也做出来,这个任务归我了。实际上不管是多少个自由度的减摇,其实都需要解运动方程,当初做单自由度横摇的时候就是用四阶龙格库塔求解二阶微分方程,具体代码见:

https://blog.csdn.net/Mezikov/article/details/103898387

0 写在前面

代码内容在第二节,第一节是运动方程各种参数求解。

1 冷静分析一下方程组

在这里插入图片描述
这个方程组是典型的二阶常微分方程组,一堆的水动力参数,但都是可以求出来的已知量(求解方法看下图,Z和M分别是方程1等号右边项和方程2等号右边项),未知量是埀荡量ZG和纵摇角theta及其一阶二阶导。
在这里插入图片描述
在这里插入图片描述

2 现在可以开始编程了,我没有用Matlab自带的Ode45函数,我是自己编写的四阶Rungekutta方程,代码如下:

首先是纵摇运动方程 pitch equation

function w2 = pitch_equation_test3(y1,z1,y2,z2)
% global B d delta V v g L rho A_w C_w C_p C_b W_e x_b GM_l b_zz fi
fi = pi/3;       % 波浪遭遇角
B = 1;           % width of boat
d = 0.341;         % draft
delta = 1.76*10^3;  % displacement
V = 1.76;           % displacement volume
g = 9.8;
L = 6;             % length
lamda = 6;         % 波长
rho = 1*10^3;
A_w = 5.448;        % area of water plane
A_m = 0.346;        % '中横剖面面积'
C_w = A_w / (L * B);  % coefficient of water plane
C_p = V/(L*A_m);
C_b = delta/(1000*L*B*d);
v = 4.44;              %船速
T = 0.8*sqrt(lamda);
W_0 = 2*pi/T  ;      % 波浪圆频率
W_e = W_0*(1+v*W_0*cos(fi)/g) ;   % 波浪遭遇频率'%%%%%%%%%%%%%%%%%
x_b = -0.23 ;     % 'center of float' 这个很可能是错的,因为我自己变得,按照大尺度船的计算是0.23,但是根据参考文献,这里应该是负的
GM_l = (L^2*(5.55*C_w+1)^3/3450)/(C_b*d);
M = 1.6*10^3;      % weight
H_0 = B/(2*d);
a_zz = 0.8*H_0*C_w*M;
b_zz = (5.4*(C_w/C_p)*(H_0)^(0.5)-4.7)*delta/((g*L)^0.5);
c_zz = rho*g*A_w;
a_z0 = (v/W_e^2)*b_zz-a_zz*x_b;
b_z0 = -b_zz*x_b+v*a_zz;     % 0其实就是theta
c_z0 = -rho*g*A_w*x_b;
I_00 = 0.07*C_w*M*L^2;
a_00 = 0.83*H_0*C_p^2*(0.25*L)^2*(delta/g)^0.5;
b_00 = 0.08*H_0*delta*L^2/(g*L)^0.5;
c_00 = rho*g*(V*GM_l);
a_0z = -(a_zz*x_b);
b_0z = -(b_zz*x_b);
c_0z = -rho*g*A_w*x_b-v*b_zz;
fi = pi/3;
a = 0.5*0.17*lamda^(3/4);
k = 2*pi/lamda;
n1 = (I_00+a_00)-(a_0z*a_z0)/(M+a_zz);
n2 = rho*g*a*k*exp(-k*d/2)*B*d*sin(k*B*L*sin(fi)/2)/(k*B*L*sin(fi)/2);
n3 = (I_00+a_00)*(M+a_zz)-a_0z*a_z0;
  
w2 =  (b_00*(M+a_zz)-a_0z*b_z0)/n3*z2+...
      (c_00*(M+a_zz)-a_0z*c_z0)/n3*y2+...
      (b_0z*(M+a_zz)-a_0z*b_zz)/n3*z1+...
      (c_0z*(M+a_zz)-a_0z*c_zz)/n3*y1;
             
end

然后是埀荡运动方程 heave equation

function w1 = heave_equation_test3(y1,z1,y2,z2)
% global B d delta V v g L rho A_w C_w C_p C_b W_e x_b GM_l b_zz fi
fi = pi/3;       % 波浪遭遇角2*pi/3
B = 1;           % width of boat
d = 0.341;         % draft
delta = 1.76*10^
四阶龙格-库塔方法是一种数值求常微分方程初值问题的算法。虽然通常用于求单个一阶微分方程,但可以将其扩展以求二阶常微分方程组。二阶常微分方程组可以转化为两个一阶微分方程组来使用四阶龙格-库塔方法。 以下是使用四阶龙格-库塔方法MATLAB中求二阶常微分方程组的基本步骤: 1. 将二阶微分方程转换为一阶方程组:假设有一个二阶常微分方程组 ``` d^2y/dt^2 = f1(t, y, dy/dt) d^2z/dt^2 = f2(t, z, dz/dt) ``` 可以定义两个新的变量 u 和 v 来表示 y 和 z 的一阶导数: ``` u = dy/dt v = dz/dt ``` 于是原方程组可以转换为一阶方程组: ``` dy/dt = u du/dt = f1(t, y, u) dz/dt = v dv/dt = f2(t, z, v) ``` 2. 编写函数文件:需要定义一个函数,该函数接收当前的 t, y, z, u, v 作为输入,并返回 dy/dt 和 dz/dt 的值。例如: ```matlab function [dydt, dzdt] = odefun(t, y, z, u, v) dydt = u; dzdt = v; du_dt = f1(t, y, u); % 根据实际函数进行定义 dv_dt = f2(t, z, v); % 根据实际函数进行定义 end ``` 3. 使用MATLAB内置函数求MATLAB提供了一个名为`ode45`的函数,它实现了四阶龙格-库塔方法。你可以使用这个函数来求上面定义的方程组: ```matlab % 初始条件 y0 = [y初值; dy初值/dt]; % 初始y值和y的导数 z0 = [z初值; dz初值/dt]; % 初始z值和z的导数 % 时间跨度 tspan = [t开始, t结束]; % 调用ode45求 [t, yz] = ode45(@(t, yz) odefun(t, yz(1), yz(3), yz(2), yz(4)), tspan, [y0; z0]); % 提取结果 y = yz(:, 1); z = yz(:, 3); ``` 请注意,上述代码仅为示例,您需要根据实际的微分方程调整`odefun`函数中的`f1`和`f2`表达式。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值