Matlab拟合曲面,计算质心浮心

统一单位:米和千克

假象船:长0.3米,宽0.2米,深0.1米

1. 定义船(长、宽、高、船型系数)

船体主要要素:主尺度、船型系数、尺度比
Matlab拟合曲面,计算质心浮心_第1张图片

- 主尺度

- 船型系数

Matlab拟合曲面,计算质心浮心_第2张图片

1.水线面系数

2.中横剖面系数

3.方形系数

4.棱形系数

5.垂向棱形系数

- 代码实现

boat.L = 0.30;         % length in meters 长
boat.W = 0.20;         % width in meters  宽
boat.HB = boat.W / 2;  % half breadth in meters
boat.D = 0.10;         % depth in meters 深

boat.mass = 1.5;       % kg
boat.n = 2;            % shape parameter  船舶系数
max_area = boat.D * boat.W   % 深*宽
max_volume = max_area * boat.L  % 体积
density_water = 1025;    % 1025 kg / m^3 海水密度
max_mass = max_volume * density_water  % 质量 m = ρ * V

boat.L 是 struct 类型

Matlab拟合曲面,计算质心浮心_第3张图片

2. 定义一个二维网格

- 代码实现

代码实现

x 长
y 宽
z 高 / 深

dy = 0.01;   % meters
dz = 0.01;   % meters

mesh.ys = -boat.HB:dy:boat.HB;        % mesh.ys 还是一个struct数组
mesh.zs = 0:dz:boat.D;                % meters

[mesh.ygrid,mesh.zgrid] = meshgrid(mesh.ys,mesh.zs); % meshgrid
mesh

meshgrid 生成网格

total_area = boat.W * boat.D       % m^2
mesh.dA = total_area / numel(mesh.ygrid) % numel

dA是是网格中一个单元格的面积,以平方米为单位。

numel:返回数组 A 中的元素数目 n

3.描述船体形状(幂函数)

- 代码实现

描述船体函数

y = mesh.ys;  % mesh.ys = -boat.HB:dy:boat.HB;
n = boat.n;
z = boat.D * abs(y/boat.HB).^n;
plot(y, z)

Matlab拟合曲面,计算质心浮心_第4张图片

4.使用一个逻辑矩阵来表示船内和船外的单元格

- 代码实现

hull = mesh.zgrid > z % 将zgrid和z矩阵作比较,真为1,假为2

redmap = [1,1,1;1,0,0];
colormap(redmap);  % colormap
image(mesh.ys,mesh.zs,flipud(hull),'AlphaData',0.5); 
% AlphaData - 透明度数据

colormap 查看并设置当前颜色图

5.计算质心

- 代码实现

Matlab拟合曲面,计算质心浮心_第5张图片

M(质量的总和,其实理论上直接用数据即可,但是还是算了算)
原因在于后面要求修改质量

% 求和函数 matrixSum 作用是求矩阵里面所有元素的和
matrixSum(masses); 

% masses是指前面网格化
% 设置的y,z的点中每个网格的质量,相当于还是把船离散化

% 怎么求每个点的质量?
% 总质量/点的个数

% 点的个数呢
matrixSum(boat.hull) %% 逻辑矩阵中有几个1代表就是几个点

% 每个点的质量
masses=boat.hull*boat.mass_per_cell

% 求和
matrixSum(masses.*mesh.ygrid)/ boat.mass;

6.加入压舱石之后计算质心

求新的 masses

% 因为是压舱石,代表是加在船底的而不是所有地方都增加质量
% 1. 找到船型的最低点,改变其质量
% 2. 再用centerOfmass函数求新的质心

[abc,index_z]=min(z);  %z=
position_02=[y(index_z),abc];
masses = addMass2(0.5,position_02,masses,mesh);  
COM_weight2 = centerOfMass2(masses, mesh);

7.计算浮心

  1. 水线
  2. 淹没区域
  3. 利用 centerOfmass 函数

你可能感兴趣的:(matlab)