matlab代码实例

练习

要求:

已知边长3.5m,初始深度1.5m的水车沿着倾角阿尔法的斜面加速下行,求水箱的压强分布规律,计算水箱右下角A点压强与加速度a的关系,并绘制关系曲线。

知识点补充:

1.[Y, Z] = meshgrid(y, z) 是用于生成一个二维网格的 MATLAB 函数。给定两个一维坐标向量 y 和 z,meshgrid 函数将返回两个二维矩阵 Y 和 Z,其中 Y 的每个元素都是来自于 y 向量,Z 的每个元素都是来自于 z 向量。具体来说,Y 矩阵是通过将 y 向量的元素复制到每一行而生成的。Z 矩阵是通过将 z 向量的元素复制到每一列而生成的。这样生成的 Y 和 Z 矩阵可以用于在三维绘图中创建一个网格,其中 Y 对应 x 轴,Z 对应 y 轴,这样可以在该网格上绘制具有压强值的三维图像

2.y = linspace(-L/2, L/2, 100) 是一个用于在给定范围内生成等间隔的线性分布的 MATLAB 函数。它将生成一个包含 100 个元素的向量 y,这些元素均匀分布在由 -L/2 到 L/2 定义的范围内。具体来说,linspace(a, b, n) 函数会生成一个包含 n 个元素的向量,其中第一个元素为 a,最后一个元素为 b,并且这些元素之间的差值相等

3.colorbar 是一个用于添加颜色条(color bar)到 MATLAB 绘图中的函数。颜色条是一个显示颜色对应数值的垂直条状图例,用于表示绘图中不同颜色所代表的数据范围或数值。当您在 MATLAB 绘制一个带有颜色映射的图像时(例如使用 imagesc、pcolor 或 surf 函数),颜色在图像中表示不同数值或数据的变化。colorbar 函数可以通过在绘图中添加一个侧边的颜色条来提供颜色到数值的对应关系。此函数会自动获取当前图形中的颜色数据,并根据颜色映射为其添加合适的刻度标签。刻度标签表示颜色对应数值的范围。

4.函数 f 是一个以 y 和 z 为变量的匿名函数,在给定的函数定义 f = @(y, z) p0 + rho*(a*y*cos(alpha) + z*(a*sin(alpha) - g)) 中,@(y, z) 是一个函数句柄的声明。通过在 @ 后面列出函数的输入变量,我们可以创建一个将这些变量作为参数的匿名函数。使用 @ 符号和括号将变量列表括起来,可以定义一个函数句柄,使得我们可以像使用函数一样使用这个句柄,并传递合适的参数值。优点是,通过使用函数句柄,我们可以将函数视为变量,并在代码中将其传递给其他函数或使用它进行更复杂的计算

5.syms 命令用于定义符号变量,也就是用来表示和操作数学符号的变量。通过 syms 命令,你可以创建用于符号计算的符号变量,这些变量可以被用于代数运算、方程求解等

6.subs(f,a,b)指将函数f中的a变量替换为b

7.sprintf 函数是在 MATLAB 中用于创建格式化字符串的函数。它的语法格式如下:result_str = sprintf(format, arg1, arg2, arg3, ...)

8.rad2deg 是一个用于将弧度值转换为角度值的函数

9. gca 被称为当前图形的句柄,因为它允许我们获取和修改当前图形对象中的坐标轴,set(gcf, 'Position', [100, 200, 800, 500]); 的作用是通过使用 set 函数来设置当前图形窗口的属性,gcf 是 get current figure 的缩写,用于获取当前的图形窗口对象,'Position' 是要设置的图形窗口属性,表示位置和大小,[100, 200, 800, 500] 是一个包含四个数值的向量,用于指定图形窗口的位置和大小

向量中的四个值分别是:

  1. 窗口左下角的 x 坐标(离屏幕左侧的距离)。
  2. 窗口左下角的 y 坐标(离屏幕底部的距离)。
  3. 窗口的宽度。
  4. 窗口的高度

10.num2str(..., 'alpha = %.2f°'):num2str 是一个 MATLAB 函数,用于将数值转换为字符串。这里,它将以度数表示的角度值转换为字符串,并使用 'alpha = %.2f°' 的格式进行表示。这个格式说明将格式化的角度值插入到字符串 'alpha = ' 和 '°' 之间,小数位数为 2 位。

11.cellstr(...):cellstr 是一个 MATLAB 函数,用于将其他数据类型转换为单元格数组类型。在这里,它将通过 num2str 函数转换为字符串的角度值,转换为单元格数组类型

12.在 MATLAB 中,单元格数组(Cell Array)是一种特殊的数据类型,它可以容纳不同类型的元素,如字符串、数字、逻辑值、字符数组、其他单元格数组以及其他 MATLAB 数据类型。单元格数组可以看作是一个二维表格,其中每个单元格可以容纳一个元素。

与常规的数组不同,单元格数组的每个元素可以具有不同的数据类型和尺寸。这使得单元格数组非常灵活,可以存储和处理各种不同类型和尺寸的数据。

单元格数组可以通过使用花括号 {} 来访问和操作其中的元素。例如,cell_array{1, 2} 表示访问单元格数组中第 1 行、第 2 列的元素

使用单元格数组的一个常见的应用是在绘图中设置图例标签。例如,当需要给不同的线条或数据系列添加图例时,可以将图例标签存储在单元格数组中,并将其与对应的绘图元素关联起来

13.legend(legend_cell, 'Location', 'best') 是一个 MATLAB 函数调用。它的作用是在当前的图形窗口中添加一个图例,并指定了图例的位置为 'best'

(1)压强分布规律

1.压强p、坐标y、z三个未知数,三个变量,应该为三维立体图像

2.设置计算所需参数值:

p0 = 101325;   % 大气压,单位:Pa
rho = 1000;    % 流体密度,单位:kg/m^3
a = 2;         % 加速度,单位:m/s^2
alpha = pi/4;  % 角度,单位:弧度
g = 9.8;       % 重力加速度,单位:m/s^2
L = 3.5;       % 水车边长,单位:m
h0 = 1.5;      % 初始深度,单位:m

此处给出加速度a与斜坡角度alpha均可更改

3.由书本上压强分布公式进行函数定义

f = @(y, z) p0 + rho*(a*y*cos(alpha) + z*(a*sin(alpha) - g));

4.指定y、z轴的坐标值变化,因为水车边长为3.5,故坐标都取从0到L,即取原点为水车左下角A点为原点,实现对水箱内部的全覆盖

y = linspace(0, L, 100);  % y 坐标范围从 -L/2 到 L/2
z = linspace(0, L, 100);       % z 坐标范围从 0 到 L
[Y, Z] = meshgrid(y, z);       % 生成 y-z 坐标网格

5.通过调用先前的函数f进行压强计算,并绘图

% 计算压强分布
P = f(Y, Z);
% 绘制三维图像
figure;
mesh(Y, Z, P);
xlabel('y');
ylabel('z');
zlabel('压强 (Pa)');
title('压强随y、z坐标变化');
colorbar;

(2)左下角A点的压强与加速度的关系

在此处我选取有y,z以及斜坡倾角alpha为定值,将变量变为加速度a,此处定义加速度a从0到10 代码如下:

syms p a alpha;
%定义水车左下角为坐标系原点位置
L = 3.5;       % 水车边长
H0 = 1.5;      % 初始水深
rho = 1000;    % 水的密度,单位:kg/m^3
y = L*cos(alpha); % 水车右下角 A 点的 y 坐标
z = L*sin(alpha); % 水车右下角 A 点的 z 坐标
g = 9.8;       % 重力加速度为 9.8 m/s^2
% 定义压强公式
p = rho * (a * y * cos(alpha) + z * (a * sin(alpha) - g)) + p0;
% 定义加速度范围
a_range = linspace(0, 9.8, 100);
% 定义不同的 alpha 值计算压强数据
alpha_values = [pi/6, pi/4, pi/3];
P = zeros(length(alpha_values), length(a_range)); %初始化压强p的数据为0
%p(i,:)为计算的压强数据,i,:意为第i行的所有列,第一个循环i为1,即第1行的100列
for i = 1:length(alpha_values)
    P(i, :) = subs(p, {a, alpha}, {a_range, alpha_values(i)});
end
% 绘制曲线图
figure
colors = ['b', 'r', 'g']; % 不同 alpha 值对应曲线的颜色
for i = 1:length(alpha_values)
    plot(a_range, P(i, :), colors(i)); %使用plot画出三条关系线,并为其取三种不同的颜色
    hold on; %使我们绘制的三条图线能够在同一窗口中显示
end
hold off; %关闭绘图窗口
% 设置图例和标题字符串,图例为alpha 的信息
legend_cell = cellstr(num2str(rad2deg(alpha_values'), 'alpha = %.2f°'));
%此处alpha_values'是将此前给出的alpha_values进行转置,使得数据能够纵向显示
%rad2deg即将弧度转化为角度
title_str = sprintf('水车右下点 A 的压强与加速度的关系 ');
title(title_str);
xlabel('加速度 a');
ylabel('水车右下点 A 的压强');
legend(legend_cell, 'Location', 'best'); %为此图例寻找一个最佳位置

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值