摘要
本软件设计作品使用MATLAB语言进行压水井动画仿真。动画较真实,能较客观反映仿真效果!
压井动画通过clock函数采集电脑中的时间数据,将秒钟数学处理成周期函数,以时间周期函数为基础来控制水面,活塞,连杆,杠杆的周期运动!
关键词:课程设计 仿真 压井 动画 MATLAB clock 周期函数 水面 活塞 连杆 杠杆
一.课程设计目的:
1:熟悉课程设计的基本流程;
2:掌握MATLAB语法结构及调试方法;
3:熟悉MATLAB函数调用,熟练二维画图;
4:掌握MATLAB语言在控制方面的运用;
5:学会用MATLAB进行基本仿真;
6:掌握MATLAB编程技巧,提高编程水平。
二.系统分析
1:题目的描述:
① 在动画运行后。杠杆,连杆,活塞,液面高度都由秒钟计算出一个初值。随时间的变化,由杠杆带动连杆,再由连杆提动活塞做活塞运动,通过活塞的运动将水提起来。水的液面也会上下变化。
② 在动画运行后,水桶里的水面高度由秒钟会计算一个初值,水面高度会随时间的增加而升高。等到水装满时,水桶里的水会自动清空。
2:设计的要求:
① 杠杆,连杆,活塞,液面的运动都是都是周期运动,并符合现实的规律。
② 水桶里的水能随时间的变化而增加,水装满后自动清空。
三.系统设计:
1:系统总体设计:先静后动式设计
我将设计分成三块:一是压井壁,水管壁,支点,水桶壁等静态对象的设计。二是杠杆,连杆,活塞,压井液面,水桶液面等动态对象的设计及初始化。三是杠杆,连杆,活塞,压井液面,水桶液面等动态对象的状态重置。
2:系统详细设计:
静态对象包括:压井壁,水管壁,支点,水桶壁等
动态对象包括:杠杆,连杆,活塞,压井液面,水桶液面等
3: MATLAB动画源程序清单:
hf=figure('name','压井');%创建figure
axis([-10,10,-5,15]);%创建坐标
axis off%去掉坐标
hold on%定格坐标
text(-9,-1,'版权所有 自动化060408405张传兵','fontsize',9,'color','b');%申明版权
fill([2;2;0;0;-1;-1.5;-0.5;-0.5;2.5;2.5],[5.8;0.5;0.5;5.8;8;8;5.8;0;0;5.5],'r')%压井壁
fill([2.5;3.5;4;3],[6.8;8;8;6.5],'r')
fill([-1.5;-1.5;-1;-1],[8;10;10;8],'r')%杠杆支点
h1=line(-1.25,10,'color','k','marker','.','erasemode','xor','markersize',40);%杠杆和支点的连接点
hs1=plot([2.5 3.5],[5.3 4.4],'color','r','linewidth',2);%压井嘴口
hs2=plot([2.5 4],[6.8 5.5],'color','r','linewidth',2);
hs3=plot([0.5 0.5],[-5 0],'color','k','linewidth',3);%压井水管壁
hs4=plot([1.5 1.5],[-5 0],'color','k','linewidth',3);
fill([0.5;0.5;1.45;1.45],[-5;0;0;-5],'b')%填充水管里的水
fill([0;0;2;2;0],[0.5;5.8;5.8;0.5;0.5],'b')%填充压井活塞里的水
fill([3;3;9.5;9.5;9;9;3.5;3.5;3],[4;-5;-5;4;4;-4.5;-4.5;4;4],'r')%桶壁
%动态部分的初始化
ti=clock;%clock = [year month day hour minute seconds]
w=pi/3*(ti(6)-fix(ti(6))-0.5);%计算杠杆的角度
hs=plot([-1.25-8*cos(w) -1.25+2.3*cos(w)],[10-8*sin(w) 10+2.3*sin(w)],'color','r','linewidth',4);%确定杠杆的初始位置
h2=line(-1.25+2.3*cos(w),10+2.3*sin(w),'color','c','linestyle','.','erasemode','xor','markersize',30);%杠杆和连杆的交点
z=-4.5+ti(6)*8/60;%计算桶中水的位置
water=fill([3.5 3.5 9 9 3.5],[-4.5 z z -4.5 -4.5],'b');%确定桶中水的初始位置
y=6.8+2*(ti(6)-fix(ti(6))-0.5);%计算压井中水的位置
if(y<6.8)%当水面低于出口上侧
hm=fill([0.5*(5.8-y) 0 2 3.5 4 2.25 0.5*(5.8-y)],[y 5.8 5.8 4.5 5.5+(y-6.8) y y],'b');%压井中水的初始状态
h4=fill([3.5 6-0.5*z 6-0.5*z+y-5.8 4 3.5],[4.5 z z y-1.3 4.5],'b');%设置水柱初始状态
else%当水面高于出口上侧
hm=fill([0.5*(5.8-y) 0 2 3.5 4 2.5 0.35*(y-5.8)+2.5 0.5*(5.8-y)],[y 5.8 5.8 4.5 5.5+(y-6.8) 6.8 y y],'b');%压井中水的初始状态
end
x=3.2+4.4*(ti(6)-fix(ti(6))-0.5);%计算活塞的初始状态
huosai=plot([0 2],[x x],'color','k','linewidth',6);%确定活塞的初始位置
liangan=plot([1 -1.25+2.3*cos(w)],[x+0.1 10+2.3*sin(w)],'color','r','linewidth',4);%确定连杆的初始状态
%动态部分的重置
while 1;
ti=clock;%clock = [year month day hour minute seconds]
w=pi/3*(ti(6)-fix(ti(6))-0.5);%计算连杆的角度
set(hs,'XData',[-1.25-8*cos(w) -1.25+2.3*cos(w)],'YData',[10-8*sin(w) 10+2.3*sin(w)])%重置连杆的位置
set(h2,'xdata',-1.25+2.3*cos(w),'ydata',10+2.3*sin(w));%重置杠杆和连杆的交点
z=-4.5+ti(6)*8/60;%计算桶中水的位置
set(water,'XData',[3.5 3.5 9 9 3.5],'YData',[-4.5 z z -4.5 -4.5])%重置桶中水的位置
y=6.8+2*(ti(6)-fix(ti(6))-0.5);%计算压井中水的位置
if(y<6.8)%当水没有超过压井嘴上口
set(hm,'XData',[0.5*(5.8-y) 0 2 3.5 4 2.25 0.5*(5.8-y)],'YData',[y 5.8 5.8 4.5 5.5+(y-6.8) y y])%重新设置水的位置
set(h4,'XData',[3.5 6-0.5*z 6-0.5*z+y-5.8 4 3.5],'YData',[4.5 z z y-1.3 4.5])%重置水柱
else%当水没有超过压井嘴上口
set(hm,'XData',[0.5*(5.8-y) 0 2 3.5 4 2.5 0.35*(y-5.8)+2.5 0.5*(5.8-y)],'YData',[y 5.8 5.8 4.5 5.5 6.8 y y])%重新设置水的位置
end
x=3.2+4.4*(ti(6)-fix(ti(6))-0.5);%计算活塞的位置
set(huosai,'XData',[0 2],'YData',[x x])%重置活塞的位置
set(liangan,'XData',[1 -1.25+2.3*cos(w)],'YData',[x+0.1 10+2.3*sin(w)])%重置连杆的位置
set(gcf,'doublebuffer','on'); %消振
drawnow;%刷新
pause(0.02)%延时0.09秒
end
四.系统调试过程中出现的主要问题:
1:程序报错--原因是出现语法错误; 如:未定义变量时有??? Error: File: C:/Documents and Settings/Administrator/桌面/新建文件夹/Untitled2.m Line: 8 Column: 60
Missing variable or function.
使用非英文符号时有Error: "End of Input" expected, ";" found.
2:程序无响应--原因是路径错误;如果调用M文件,要使M文件处于当前路径;
3:实际与理论不符--原因是出现逻辑错误;如当活塞向上运动时,水柱要变粗;活塞下降的速度要比活塞上升提水时的速度快。
4:动画变化过快--原因是延时时间变量设置过小;
5:一些书写错误;如Error in ==> C:/Documents and Settings/Administrator/桌面/新建文件夹/Untitled2.m
On line 45 ==> set(hs,'XData',[-1.25-8*cos(w) -1.25+2.3*cos(w)],'YData',[10-8*sin(w) 10+2.3*sin(w)])%重置连杆的位置;
五.系统调试后的效果图:
六.系统运行报告与结论:
经运行基本能够实现设计的要求。
在一些需要的运动的情况都可以通过clock函数来实现,既简单又有效,特别对于周期运动的物体,clock函数更显示出了其优越性。在将秒钟转换成周期函数是要又一定的数学功底和用用一些数学函数(如fix函数)。同时也要将一些现实逻辑关系转化成语言逻辑关系,如本程序在处理压水井水面高度时就运用了if…else…逻辑语言。一切灵感都来自现实生活!
七.作品中的不足:
1,动画中水柱应该是抛物线型,但由于技术有限不能将其实现,因而用直线来代替了。
2,为了使压井更生动,可以在活塞和压井底加上活门,我在这儿省略了。
八.总结:
通过Matlab动画的制作让我学到了很多的东西!看到的matlab功能的强大,有很多东西都可以在matlab平台上运用(例如c语言,vb等)。Matlab动画的制作更像是一次各种知识的大串联!
九.致谢:
在这里我特别感谢康老师在课堂上的讲解和引导,使我对MATLAB语言有强烈的兴趣,从而促使我更进一步的学习MATLAB语言,并将知识应用与实际问题的解决!例如,数学模型的仿真,大量数据和图象的处理等等!
十.参考书目:
1.张平编著《MATLAB基础与应用》北京航空航天大学出版社 2001.1;
2,MATLAB命令大全----网络下载
3,matlab制作时钟程序----网络下载
4,matlab仿真例题----康老师提供
本软件设计作品使用MATLAB语言进行压水井动画仿真。动画较真实,能较客观反映仿真效果!
压井动画通过clock函数采集电脑中的时间数据,将秒钟数学处理成周期函数,以时间周期函数为基础来控制水面,活塞,连杆,杠杆的周期运动!
关键词:课程设计 仿真 压井 动画 MATLAB clock 周期函数 水面 活塞 连杆 杠杆
一.课程设计目的:
1:熟悉课程设计的基本流程;
2:掌握MATLAB语法结构及调试方法;
3:熟悉MATLAB函数调用,熟练二维画图;
4:掌握MATLAB语言在控制方面的运用;
5:学会用MATLAB进行基本仿真;
6:掌握MATLAB编程技巧,提高编程水平。
二.系统分析
1:题目的描述:
① 在动画运行后。杠杆,连杆,活塞,液面高度都由秒钟计算出一个初值。随时间的变化,由杠杆带动连杆,再由连杆提动活塞做活塞运动,通过活塞的运动将水提起来。水的液面也会上下变化。
② 在动画运行后,水桶里的水面高度由秒钟会计算一个初值,水面高度会随时间的增加而升高。等到水装满时,水桶里的水会自动清空。
2:设计的要求:
① 杠杆,连杆,活塞,液面的运动都是都是周期运动,并符合现实的规律。
② 水桶里的水能随时间的变化而增加,水装满后自动清空。
三.系统设计:
1:系统总体设计:先静后动式设计
我将设计分成三块:一是压井壁,水管壁,支点,水桶壁等静态对象的设计。二是杠杆,连杆,活塞,压井液面,水桶液面等动态对象的设计及初始化。三是杠杆,连杆,活塞,压井液面,水桶液面等动态对象的状态重置。
2:系统详细设计:
静态对象包括:压井壁,水管壁,支点,水桶壁等
动态对象包括:杠杆,连杆,活塞,压井液面,水桶液面等
3: MATLAB动画源程序清单:
hf=figure('name','压井');%创建figure
axis([-10,10,-5,15]);%创建坐标
axis off%去掉坐标
hold on%定格坐标
text(-9,-1,'版权所有 自动化060408405张传兵','fontsize',9,'color','b');%申明版权
fill([2;2;0;0;-1;-1.5;-0.5;-0.5;2.5;2.5],[5.8;0.5;0.5;5.8;8;8;5.8;0;0;5.5],'r')%压井壁
fill([2.5;3.5;4;3],[6.8;8;8;6.5],'r')
fill([-1.5;-1.5;-1;-1],[8;10;10;8],'r')%杠杆支点
h1=line(-1.25,10,'color','k','marker','.','erasemode','xor','markersize',40);%杠杆和支点的连接点
hs1=plot([2.5 3.5],[5.3 4.4],'color','r','linewidth',2);%压井嘴口
hs2=plot([2.5 4],[6.8 5.5],'color','r','linewidth',2);
hs3=plot([0.5 0.5],[-5 0],'color','k','linewidth',3);%压井水管壁
hs4=plot([1.5 1.5],[-5 0],'color','k','linewidth',3);
fill([0.5;0.5;1.45;1.45],[-5;0;0;-5],'b')%填充水管里的水
fill([0;0;2;2;0],[0.5;5.8;5.8;0.5;0.5],'b')%填充压井活塞里的水
fill([3;3;9.5;9.5;9;9;3.5;3.5;3],[4;-5;-5;4;4;-4.5;-4.5;4;4],'r')%桶壁
%动态部分的初始化
ti=clock;%clock = [year month day hour minute seconds]
w=pi/3*(ti(6)-fix(ti(6))-0.5);%计算杠杆的角度
hs=plot([-1.25-8*cos(w) -1.25+2.3*cos(w)],[10-8*sin(w) 10+2.3*sin(w)],'color','r','linewidth',4);%确定杠杆的初始位置
h2=line(-1.25+2.3*cos(w),10+2.3*sin(w),'color','c','linestyle','.','erasemode','xor','markersize',30);%杠杆和连杆的交点
z=-4.5+ti(6)*8/60;%计算桶中水的位置
water=fill([3.5 3.5 9 9 3.5],[-4.5 z z -4.5 -4.5],'b');%确定桶中水的初始位置
y=6.8+2*(ti(6)-fix(ti(6))-0.5);%计算压井中水的位置
if(y<6.8)%当水面低于出口上侧
hm=fill([0.5*(5.8-y) 0 2 3.5 4 2.25 0.5*(5.8-y)],[y 5.8 5.8 4.5 5.5+(y-6.8) y y],'b');%压井中水的初始状态
h4=fill([3.5 6-0.5*z 6-0.5*z+y-5.8 4 3.5],[4.5 z z y-1.3 4.5],'b');%设置水柱初始状态
else%当水面高于出口上侧
hm=fill([0.5*(5.8-y) 0 2 3.5 4 2.5 0.35*(y-5.8)+2.5 0.5*(5.8-y)],[y 5.8 5.8 4.5 5.5+(y-6.8) 6.8 y y],'b');%压井中水的初始状态
end
x=3.2+4.4*(ti(6)-fix(ti(6))-0.5);%计算活塞的初始状态
huosai=plot([0 2],[x x],'color','k','linewidth',6);%确定活塞的初始位置
liangan=plot([1 -1.25+2.3*cos(w)],[x+0.1 10+2.3*sin(w)],'color','r','linewidth',4);%确定连杆的初始状态
%动态部分的重置
while 1;
ti=clock;%clock = [year month day hour minute seconds]
w=pi/3*(ti(6)-fix(ti(6))-0.5);%计算连杆的角度
set(hs,'XData',[-1.25-8*cos(w) -1.25+2.3*cos(w)],'YData',[10-8*sin(w) 10+2.3*sin(w)])%重置连杆的位置
set(h2,'xdata',-1.25+2.3*cos(w),'ydata',10+2.3*sin(w));%重置杠杆和连杆的交点
z=-4.5+ti(6)*8/60;%计算桶中水的位置
set(water,'XData',[3.5 3.5 9 9 3.5],'YData',[-4.5 z z -4.5 -4.5])%重置桶中水的位置
y=6.8+2*(ti(6)-fix(ti(6))-0.5);%计算压井中水的位置
if(y<6.8)%当水没有超过压井嘴上口
set(hm,'XData',[0.5*(5.8-y) 0 2 3.5 4 2.25 0.5*(5.8-y)],'YData',[y 5.8 5.8 4.5 5.5+(y-6.8) y y])%重新设置水的位置
set(h4,'XData',[3.5 6-0.5*z 6-0.5*z+y-5.8 4 3.5],'YData',[4.5 z z y-1.3 4.5])%重置水柱
else%当水没有超过压井嘴上口
set(hm,'XData',[0.5*(5.8-y) 0 2 3.5 4 2.5 0.35*(y-5.8)+2.5 0.5*(5.8-y)],'YData',[y 5.8 5.8 4.5 5.5 6.8 y y])%重新设置水的位置
end
x=3.2+4.4*(ti(6)-fix(ti(6))-0.5);%计算活塞的位置
set(huosai,'XData',[0 2],'YData',[x x])%重置活塞的位置
set(liangan,'XData',[1 -1.25+2.3*cos(w)],'YData',[x+0.1 10+2.3*sin(w)])%重置连杆的位置
set(gcf,'doublebuffer','on'); %消振
drawnow;%刷新
pause(0.02)%延时0.09秒
end
四.系统调试过程中出现的主要问题:
1:程序报错--原因是出现语法错误; 如:未定义变量时有??? Error: File: C:/Documents and Settings/Administrator/桌面/新建文件夹/Untitled2.m Line: 8 Column: 60
Missing variable or function.
使用非英文符号时有Error: "End of Input" expected, ";" found.
2:程序无响应--原因是路径错误;如果调用M文件,要使M文件处于当前路径;
3:实际与理论不符--原因是出现逻辑错误;如当活塞向上运动时,水柱要变粗;活塞下降的速度要比活塞上升提水时的速度快。
4:动画变化过快--原因是延时时间变量设置过小;
5:一些书写错误;如Error in ==> C:/Documents and Settings/Administrator/桌面/新建文件夹/Untitled2.m
On line 45 ==> set(hs,'XData',[-1.25-8*cos(w) -1.25+2.3*cos(w)],'YData',[10-8*sin(w) 10+2.3*sin(w)])%重置连杆的位置;
五.系统调试后的效果图:
六.系统运行报告与结论:
经运行基本能够实现设计的要求。
在一些需要的运动的情况都可以通过clock函数来实现,既简单又有效,特别对于周期运动的物体,clock函数更显示出了其优越性。在将秒钟转换成周期函数是要又一定的数学功底和用用一些数学函数(如fix函数)。同时也要将一些现实逻辑关系转化成语言逻辑关系,如本程序在处理压水井水面高度时就运用了if…else…逻辑语言。一切灵感都来自现实生活!
七.作品中的不足:
1,动画中水柱应该是抛物线型,但由于技术有限不能将其实现,因而用直线来代替了。
2,为了使压井更生动,可以在活塞和压井底加上活门,我在这儿省略了。
八.总结:
通过Matlab动画的制作让我学到了很多的东西!看到的matlab功能的强大,有很多东西都可以在matlab平台上运用(例如c语言,vb等)。Matlab动画的制作更像是一次各种知识的大串联!
九.致谢:
在这里我特别感谢康老师在课堂上的讲解和引导,使我对MATLAB语言有强烈的兴趣,从而促使我更进一步的学习MATLAB语言,并将知识应用与实际问题的解决!例如,数学模型的仿真,大量数据和图象的处理等等!
十.参考书目:
1.张平编著《MATLAB基础与应用》北京航空航天大学出版社 2001.1;
2,MATLAB命令大全----网络下载
3,matlab制作时钟程序----网络下载
4,matlab仿真例题----康老师提供