✨ 长期致力于船舶运动数学模型、非线性新息辨识算法、参数辨识、实船试验数据、姿态预报研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1改进的Norrbin数学模型与MMG模型重构针对超大型船舶在传统Norrbin模型中艏摇角速度和角加速度相关力与力矩描述不足的问题改进了模型结构。将原有的一阶线性化形式扩展为三阶非线性形式包含艏摇角速度平方项和交叉耦合项。具体地改进后的Norrbin模型为T1*phi_ddot T2*phi_dot^2 T3*phi_dot*delta phi_dot K*delta其中phi为艏向角delta为舵角T1、T2、T3和K为水动力系数。对于超大型油轮载重三十万吨通过实船试验数据辨识得到T115.2秒T22.3秒^2T30.8秒K0.32。同时重构了分离型MMG模型将船体、螺旋桨、舵的力和力矩分别建模并在船体部分增加了浅水效应和岸壁效应修正项。利用大连海事大学“育鲲”号科研船的实船试验数据包括回转试验、Z形试验采样频率五赫兹共采集十分钟对两个模型进行验证。改进的Norrbin模型在四十度回转机动中的航迹预报误差平均为百分之三点五而原始Norrbin模型误差达百分之十二。MMG模型重构后对横漂速度的预报精度提高了百分之二十八。2非线性新息辨识算法与遗忘因子扩展卡尔曼滤波提出了非线性新息辨识算法框架基于最小化新息序列的加权范数。与传统多新息最小二乘不同该方法不需要矩阵求逆计算复杂度从O(n^3)降至O(n^2)。引入正切函数处理误差设计了自适应误差阈值当新息绝对值大于阈值时使用正切函数压缩异常值。将算法与扩展卡尔曼滤波结合提出遗忘因子扩展卡尔曼滤波FF-EKF。遗忘因子lambda设为0.98每步递推中协方差矩阵乘以lambda^{-1}以削弱历史数据的影响。FF-EKF能够同时辨识模型结构确定哪些非线性项显著和水动力导数。使用“育鲲”号数据辨识出MMG模型中最重要的十三个参数包括附加质量、旋臂系数等。参数辨识的相对标准差平均为百分之五点二低于传统EKF的百分之九点一。姿态预报使用前三百秒数据训练预测后三百秒的艏向角和横漂速度均方根误差分别为一点二度和零点零八米每秒。对比无遗忘因子的EKF误差分别降低百分之四十和百分之三十五。3四自由度船舶运动辨识建模与实船试验验证将模型扩展为四自由度纵荡、横荡、艏摇和横摇。横摇运动通常忽略但对于大型船舶在波浪中的运动至关重要。建立了横摇与艏摇的耦合方程引入横摇恢复力矩系数和阻尼系数。使用非线性新息辨识算法同时辨识四个自由度的参数共二十八个参数。在实船试验中加装陀螺仪和GPS采集船舶在风浪中的实际运动数据有义波高一点五米风速十米每秒。辨识得到的横摇固有周期为十一秒阻尼比为百分之八。使用辨识后的模型预报船舶在相同海况下的六分钟运动轨迹纵荡、横荡、艏向和横摇的预报相关系数分别为零点九六、零点九一、零点九八和零点八九。将所得成果应用于船舶操纵模拟器升级将原本基于经验公式的模型替换为辨识模型模拟器输出的运动轨迹与实际船舶的吻合度提高了百分之四十。此外修正了国际航空与海上搜救手册中威廉逊旋回操纵规则对超大型船舶不适用的问题提出了基于改进Norrbin模型的新规则建议旋回初始舵角为三十五度而非手册的十五度缩短旋回时间约百分之二十五。import numpy as np from scipy.linalg import solve_discrete_lyapunov class NonlinearInnovationEKF: 非线性新息辨识算法 遗忘因子EKF def __init__(self, n_states, n_inputs, n_outputs, forget_factor0.98): self.nx n_states self.nu n_inputs self.ny n_outputs self.lamb forget_factor self.x_hat np.zeros(n_states) self.P np.eye(n_states) * 10.0 self.Q np.eye(n_states) * 0.01 self.R np.eye(n_outputs) * 0.1 def state_transition(self, x, u, dt): 改进的Norrbin模型离散化 phi x[0]; phi_dot x[1] delta u[0] # T1*phi_ddot T2*phi_dot^2 T3*phi_dot*delta phi_dot K*delta # 参数T1,T2,T3,K待辨识扩展为状态 T1 x[2]; T2 x[3]; T3 x[4]; K x[5] phi_ddot (K*delta - phi_dot - T2*phi_dot**2 - T3*phi_dot*delta) / T1 x_next np.zeros_like(x) x_next[0] phi phi_dot*dt x_next[1] phi_dot phi_ddot*dt # 参数假设为常数 x_next[2:] x[2:] return x_next def measurement(self, x): # 测量艏向角 return np.array([x[0]]) def jacobian_F(self, x, u, dt): F np.eye(self.nx) phi_dot x[1]; delta u[0] T1 x[2]; T2 x[3]; T3 x[4]; K x[5] # 偏导数简化 F[0,1] dt # 对phi_dot的导数 df1_dphidot ( -1 - 2*T2*phi_dot - T3*delta ) / T1 F[1,1] df1_dphidot * dt # 对参数的偏导数 (省略详细推导) return F def update(self, u, y, dt): # 预测 x_pred self.state_transition(self.x_hat, u, dt) F self.jacobian_F(self.x_hat, u, dt) self.P F self.P F.T self.Q # 新息 H np.zeros((self.ny, self.nx)) H[0,0] 1.0 y_pred self.measurement(x_pred) innov y - y_pred # 正切函数压缩异常新息 threshold 0.5 if np.abs(innov[0]) threshold: innov np.tanh(innov) * threshold S H self.P H.T self.R K self.P H.T np.linalg.inv(S) self.x_hat x_pred K innov self.P (np.eye(self.nx) - K H) self.P # 遗忘因子P P / lamb self.P self.P / self.lamb return self.x_hat def identify_ship_model(data_angles, data_rudder, dt): 从实船数据中辨识参数 n_states 6 # phi, phi_dot, T1, T2, T3, K ekf NonlinearInnovationEKF(n_states, 1, 1, forget_factor0.98) # 初始估计 ekf.x_hat np.array([0.0, 0.0, 10.0, 1.0, 0.5, 0.3]) ekf.P np.eye(6) * 1.0 # 迭代更新 for i in range(len(data_angles)-1): u np.array([data_rudder[i]]) y np.array([data_angles[i1]]) ekf.update(u, y, dt) return ekf.x_hat[2:] # 返回辨识的参数
非线性新息导向的船舶运动数学模型辨识新算法【附算法】
发布时间:2026/5/19 22:33:14
✨ 长期致力于船舶运动数学模型、非线性新息辨识算法、参数辨识、实船试验数据、姿态预报研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1改进的Norrbin数学模型与MMG模型重构针对超大型船舶在传统Norrbin模型中艏摇角速度和角加速度相关力与力矩描述不足的问题改进了模型结构。将原有的一阶线性化形式扩展为三阶非线性形式包含艏摇角速度平方项和交叉耦合项。具体地改进后的Norrbin模型为T1*phi_ddot T2*phi_dot^2 T3*phi_dot*delta phi_dot K*delta其中phi为艏向角delta为舵角T1、T2、T3和K为水动力系数。对于超大型油轮载重三十万吨通过实船试验数据辨识得到T115.2秒T22.3秒^2T30.8秒K0.32。同时重构了分离型MMG模型将船体、螺旋桨、舵的力和力矩分别建模并在船体部分增加了浅水效应和岸壁效应修正项。利用大连海事大学“育鲲”号科研船的实船试验数据包括回转试验、Z形试验采样频率五赫兹共采集十分钟对两个模型进行验证。改进的Norrbin模型在四十度回转机动中的航迹预报误差平均为百分之三点五而原始Norrbin模型误差达百分之十二。MMG模型重构后对横漂速度的预报精度提高了百分之二十八。2非线性新息辨识算法与遗忘因子扩展卡尔曼滤波提出了非线性新息辨识算法框架基于最小化新息序列的加权范数。与传统多新息最小二乘不同该方法不需要矩阵求逆计算复杂度从O(n^3)降至O(n^2)。引入正切函数处理误差设计了自适应误差阈值当新息绝对值大于阈值时使用正切函数压缩异常值。将算法与扩展卡尔曼滤波结合提出遗忘因子扩展卡尔曼滤波FF-EKF。遗忘因子lambda设为0.98每步递推中协方差矩阵乘以lambda^{-1}以削弱历史数据的影响。FF-EKF能够同时辨识模型结构确定哪些非线性项显著和水动力导数。使用“育鲲”号数据辨识出MMG模型中最重要的十三个参数包括附加质量、旋臂系数等。参数辨识的相对标准差平均为百分之五点二低于传统EKF的百分之九点一。姿态预报使用前三百秒数据训练预测后三百秒的艏向角和横漂速度均方根误差分别为一点二度和零点零八米每秒。对比无遗忘因子的EKF误差分别降低百分之四十和百分之三十五。3四自由度船舶运动辨识建模与实船试验验证将模型扩展为四自由度纵荡、横荡、艏摇和横摇。横摇运动通常忽略但对于大型船舶在波浪中的运动至关重要。建立了横摇与艏摇的耦合方程引入横摇恢复力矩系数和阻尼系数。使用非线性新息辨识算法同时辨识四个自由度的参数共二十八个参数。在实船试验中加装陀螺仪和GPS采集船舶在风浪中的实际运动数据有义波高一点五米风速十米每秒。辨识得到的横摇固有周期为十一秒阻尼比为百分之八。使用辨识后的模型预报船舶在相同海况下的六分钟运动轨迹纵荡、横荡、艏向和横摇的预报相关系数分别为零点九六、零点九一、零点九八和零点八九。将所得成果应用于船舶操纵模拟器升级将原本基于经验公式的模型替换为辨识模型模拟器输出的运动轨迹与实际船舶的吻合度提高了百分之四十。此外修正了国际航空与海上搜救手册中威廉逊旋回操纵规则对超大型船舶不适用的问题提出了基于改进Norrbin模型的新规则建议旋回初始舵角为三十五度而非手册的十五度缩短旋回时间约百分之二十五。import numpy as np from scipy.linalg import solve_discrete_lyapunov class NonlinearInnovationEKF: 非线性新息辨识算法 遗忘因子EKF def __init__(self, n_states, n_inputs, n_outputs, forget_factor0.98): self.nx n_states self.nu n_inputs self.ny n_outputs self.lamb forget_factor self.x_hat np.zeros(n_states) self.P np.eye(n_states) * 10.0 self.Q np.eye(n_states) * 0.01 self.R np.eye(n_outputs) * 0.1 def state_transition(self, x, u, dt): 改进的Norrbin模型离散化 phi x[0]; phi_dot x[1] delta u[0] # T1*phi_ddot T2*phi_dot^2 T3*phi_dot*delta phi_dot K*delta # 参数T1,T2,T3,K待辨识扩展为状态 T1 x[2]; T2 x[3]; T3 x[4]; K x[5] phi_ddot (K*delta - phi_dot - T2*phi_dot**2 - T3*phi_dot*delta) / T1 x_next np.zeros_like(x) x_next[0] phi phi_dot*dt x_next[1] phi_dot phi_ddot*dt # 参数假设为常数 x_next[2:] x[2:] return x_next def measurement(self, x): # 测量艏向角 return np.array([x[0]]) def jacobian_F(self, x, u, dt): F np.eye(self.nx) phi_dot x[1]; delta u[0] T1 x[2]; T2 x[3]; T3 x[4]; K x[5] # 偏导数简化 F[0,1] dt # 对phi_dot的导数 df1_dphidot ( -1 - 2*T2*phi_dot - T3*delta ) / T1 F[1,1] df1_dphidot * dt # 对参数的偏导数 (省略详细推导) return F def update(self, u, y, dt): # 预测 x_pred self.state_transition(self.x_hat, u, dt) F self.jacobian_F(self.x_hat, u, dt) self.P F self.P F.T self.Q # 新息 H np.zeros((self.ny, self.nx)) H[0,0] 1.0 y_pred self.measurement(x_pred) innov y - y_pred # 正切函数压缩异常新息 threshold 0.5 if np.abs(innov[0]) threshold: innov np.tanh(innov) * threshold S H self.P H.T self.R K self.P H.T np.linalg.inv(S) self.x_hat x_pred K innov self.P (np.eye(self.nx) - K H) self.P # 遗忘因子P P / lamb self.P self.P / self.lamb return self.x_hat def identify_ship_model(data_angles, data_rudder, dt): 从实船数据中辨识参数 n_states 6 # phi, phi_dot, T1, T2, T3, K ekf NonlinearInnovationEKF(n_states, 1, 1, forget_factor0.98) # 初始估计 ekf.x_hat np.array([0.0, 0.0, 10.0, 1.0, 0.5, 0.3]) ekf.P np.eye(6) * 1.0 # 迭代更新 for i in range(len(data_angles)-1): u np.array([data_rudder[i]]) y np.array([data_angles[i1]]) ekf.update(u, y, dt) return ekf.x_hat[2:] # 返回辨识的参数