本节书摘来自异步社区出版社《MATLAB智能算法超级学习手册》一书中的第1章,第1.5节,作者:MATLAB技术联盟 , 高飞 , 许玢更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.5 简单工程应用分析
MATLAB智能算法超级学习手册
MATLAB在工程上的应用较多,例如机械机构优化分析、机械控制、通信领域、数值计算等方面。MATLAB因其强大的数据处理能力,逐渐成为工程应用领域主导辅助工具。本节主要应用MATLAB解决简单的工程问题,例如机械中的内燃机转角与升程之间的插值拟合关系、海上航行区域警示线问题、物种竞争模型的求解等。这类问题的优化求解对解决复杂的工程问题起着关键的作用。
1.5.1 内燃机转角与升程插值模型
内燃机的气门开启状态是由与发动机转轴连接的凸轮来控制的,气门开启的大小决定了发动机的性能。因此,驱动气门的凸轮加工曲线是非常重要的。表1-1给出了某凸轮转角与升程的几组实测数据。为了机床加工的需要,试确定φ从91°到130°每隔1°的升程。
解:这是个一元函数插值问题。运用MATLAB软件,采用双三次插值法“cubic”,易求得φ从91°到130°每隔1°的升程,如表1-2所示。
根据表1-2,φ从91°到130°每隔1°的升程图像如图1-11所示。
从图1-11中可看出,插入值与原函数值组成的图像能很好地吻合,故双三次插值法“cubic”较精确。
程序如下。
clc,clear,close all
x=[91,105,110,115,120,124,128];
h=[0,1.0869,1.9710,2.7555,3.3986,4.9073,8.3409];
j=1;
for i=91:130
y(1,j)=interp1(x,h,i,'cubic');
j=j+1;
end
x1=91:130;
plot(x,h,'r')
hold on
plot(x1,y,'o')
1.5.2 航行区域警示线模型
海上运输涉及世界上各个水域。由于船舶航行的航线、区域、季节的不同,其海上风险也不一样。因此,为了避免特殊风险,船舶不能驶入某些区域或一定时间内的某些地区,相关部门也会根据一定时间内该区域的水位情况予以警示。本小节针对航行区域警示线模型进行分析求解。
某海域上各种吨位的船只频繁地经过。为了保证船只的航行安全,有关机构在低潮时对水深进行了测量。表1-3给出了测量数据。
表1-3中,(x,y)为测量点,z为(x,y)处的水深(单位:米)。船的吨位可以用其吃水深度来反映,分为4吨、4.5吨、5吨和5.5吨4档。
现在,航运部门要在矩形海域(75,200)(50,150)上为不同吨位的航船设置警示标志。根据测量数据描述该海域的地貌,并绘制不同吨位的警示线,供航运部门使用。相邻监测点之间地势没有剧烈变化;测量时该海域潮高没有明显变化;忽略大气压引起的水位变化,以及测量仪器引起的测量误差;题中数据基本符合实际情况。
航行区域的警示线关系船只航行安全,即由于不同船只载重的不同,吃水深度也不同,因此行船需要选择合适的航道以满足其航行需要。由题意,把水深z作为x,y的函数,需要根据已知数据运用插值函数的求解算法,通过求解,作地貌和等深线图,由图能清楚地了解该海域的复杂地貌。
解:由题意知,船吃水深度划分为4档。为了使过往船只能够清楚该海域的水深情况,需要根据等深线的不同,标注不同吃水深度船只的警示线。使用MATLAB操作如下。
Step1:输入表1-3中的数据,对数据进行meshgrid()操作,使数组x和y产生网格,以绘制3D曲面;
Step2:x和y平面设置好后,用griddata()命令对矩形海域内的格点样条函数内插,得到相应的水深z;
Step3:运用mesh()作图命令,绘出该海域的地貌图,如图1-12(a)所示;
Step4:等高线易于观察地形地貌,使用contour()命令绘制等位线,并用clabel()命令标识等位线所处位置的深度值,如图1-12(b)所示;
Step5:对于特殊等位线在航海警示线上的应用,应特殊标记,再次运用contour()命令绘制警示线,运用gtext()命令标识不同吨位的警示线,如图1-12(c)所示,航行船只应该予以避让。
从图1-12中可看出,该地貌高低起伏,最大水位为,最低水位为。根据警示线标识情况,航运部门可对船只进行宏观调控,并对过往船只给以提示,避免发生安全事故。
程序如下。
clc,clear,close all
x=[129,140,103.5,88,185.5,195,105.5,157.5,107.5,77,81,162,162,117.5];
y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5];
z=[4,8,6,8,6,8,8,9,9,8,8,9,4,9];
x1=75:0.5:200;
y1=-50:0.5:150;
[x2,y2]=meshgrid(x1,y1);
z2=griddata(x,y,z,x2,y2,'v4'); % 'v4'MATLAB 4 格点样条函数内插
subplot(1,3,1)
mesh(x2,y2,z2);
hold on
C=contour(x2,y2,z2); %绘制等位线
clabel(C);
subplot(1,3,2)
C=contour(x2,y2,z2); %绘制等位线
clabel(C); %等位线标识
[C,d] = contour(x2,y2,z2);
clabel(C,d,'manual');
grid on
hold on
subplot(1,3,3)
contour(x2,y2,z2,[4,4,4.5,4.5,5,5,5.5,5.5]); %绘制不同吨位的警示线
>> title('警示线图');
>> hold on
xlabel('X'),ylabel('Y');
grid on
gtext('4吨的警戒线');
gtext('4.5吨的警戒线');
gtext('5吨的警戒线');
gtext('5.5吨的警戒线');