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

该博客记录了使用四阶龙格库塔方法在Python中解决二阶常微分方程组,以模拟船舶在迎浪时的纵摇和埀荡耦合运动。作者将MATLAB代码移植到Python,并对比了两者2%左右的计算误差。详细代码和结果展示在博客中。
摘要由CSDN通过智能技术生成

0 写在前面

这篇博客是在将我上一篇博客的matlab代码移植到python中,应为后续要开展深度强化学习下的船舶减摇研究,总的来说还是在python上做这项工作比较合适。具体方程的解法和背景不在赘述,见https://blog.csdn.net/Mezikov/article/details/107461970

1 代码

import math
import numpy as np
import matplotlib.pyplot as plt
from math import e
from numpy import reshape

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

##################   写在前面:这个代码只适合用于已知浪向角的规则波   ########################

ts, ys, zs, ys_, zs_ = [], [], [], [], []
# all below is coefficients of wave
fi = math.pi / 3
B = 1
d = 0.341
delta = 1.76 * 10 ** 3
V = 1.76
g = 9.8
L = 6
lamda = 1.64
rho = 1.025 * 10 ** 3
A_w = 5.448
A_m = 0.346
C_w = A_w / (L * B)
C_p = V / (L * A_m)
C_b = delta / (1000 * L * B * d)
v = 4.44
T = 0.8 * math.sqrt(lamda)
W_0 = 2 * math.pi / T
W_e = W_0 * (1 + v * W_0 * np.cos(fi) / g)
x_b = -0.23
GM_l = (L ** 2 * (5.55 * C_w + 1) ** 3 / 3450) / (C_b * d)
M = 1.6 * 10 ** 3
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 = 
四阶龙格-库塔方法是一种数值求解常微分方程初值问题的算法。虽然通常用于求解单个一阶微分方程,但可以将其扩展以求解二阶常微分方程组。二阶常微分方程组可以转化为两个一阶微分方程组来使用四阶龙格-库塔方法求解。 以下是使用四阶龙格-库塔方法在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`表达式。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值