Matlab实现振动弹簧的实时动画论文.docx
《Matlab实现振动弹簧的实时动画论文.docx》由会员分享,可在线阅读,更多相关《Matlab实现振动弹簧的实时动画论文.docx(26页珍藏版)》请在冰豆网上搜索。
Matlab实现振动弹簧的实时动画论文
Matlab实现振动弹簧的实时动画
摘要:
Matlab是当前应用最广泛的科学与工程计算软件之一,本次课设将Matlab引入到图形学动画设计.本次课设主要可分为两大步骤:
一、应用Matlab对弹簧振子进行建模;二、应用Matlab实现弹簧振动的实时动画。
其中建模部分包括对天花板的建模、对连接直线的建模、对弹簧的建模、对振动小球的建模。
模拟弹簧振动的过程主要包括:
①更新小球和弹簧的位置。
②更新水平线的位置和长度。
③实时地画出弹簧高度与时间的关系曲线。
关键字:
Matlab,振动弹簧,建模,实时动画
指导老师签字:
目录
1绪论1
1.1matlab基本功能介绍1
1.2matlab的动画制作2
2振动弹簧的实时动画4
2.1程序功能分析4
2.2弹簧振子的matlab建模6
2.2.1天花板的建模7
2.2.2直线的建模8
2.2.3弹簧的建模9
2.2.4球的建模10
2.2.5利用set函数返回句柄值改变来当前坐标轴11
2.3弹簧振动的实时动画13
2.3.1弹簧振子简谐振动的物理模型13
2.3.2利用matlab实现弹簧的实时振动14
2.4调试结果19
3设计总结23
参考文献24
致谢25
附录-弹簧阻尼振动程序26
Matlab实现振动弹簧的实时动画
1绪论
1.1matlab基本功能介绍
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
图1-1matlab开发界面
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且mathwork也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用。
1.2matlab的动画制作
常见的动画都是将离散的静态图形连续播放或快速变化并利用人眼的视觉暂留性来造成一种的感官上的连续化态效果。
市面上流行甚广的FLASH等动画制作软件,都是基于这一原理,将现成图形图像进行处理和变化来制作动画的。
Matlab是基于矩阵运算的工程科学计算软件,它不能简单的依靠图形图像的可视化编来制作动画,而是将矩阵、逻辑、函数等底层元素的变化通过图形外现来达到动画效果。
在Matlab中,每一个图形元素就是一个对象,每个对象都有一个相应的唯一的标识符(句柄),并且每个对象都有一组可以根据需要进行调整的属性,对象的属性反映了对象的特征,通过设置、修改这些属性,用户可以灵活地改变、调整图形对象显示的方式。
Matlab句柄图形的这一基本思想就是它实现动画功能的基本方法和重要原则。
在Matlab中常用set语句来修改句柄图形对象的属性。
基本语法为:
set(H,‘PropertyName’,PropertyValue),其中H为图形句柄,PropertyName为属性名称,PropertyValue为属性值,Matlab中允许在一个语句中对同一图形句柄的多个不同属性值进行设置。
在Matlab绘图中常用line函数来定义动画的基本变化元素,基本语法为:
line(x,y,z),其中x、y、z为坐标点数据。
函数line句柄常用的属性有:
Color(颜色)、XData(x轴数据)、YData(y轴数据)、ZData(z轴数据)、EraseMode(擦除模式)、LineStyle(线型)、Marker(点型)、MarkerSize(点尺寸)、Visible(可视性)等等。
其中EraseMode是制作动画时非常关键的一个属性,其擦除属性的设置主要有四个可选值:
(1)“normal”,缺省值,计算整个画面的数据,重画整个图形,这种模式产生的图形最准确,但是速度最慢;
(2)“back2ground将旧对象的颜色变为背景颜色,实现擦除,这种模式将损坏被擦除对象下面的对象,但新对象会正确着色;(3)“none”,不做任何擦除;(4)“xor”,只画与屏幕颜色不一致的新对象点,只擦除与屏幕颜色不一致的原对象点,该方式不损坏被擦除对象下面的对象。
我们用line函数绘出运动点,在循环体内结合set函数巧妙地设置line句柄的擦除属性,就能制作出令人惊异的动画效果了。
在Matlab中实现动画还有一个很有用的函数:
rotate,其功能是实现句柄图形的旋转,基本语法为:
rotate(H,[xyz],alpha),其中[xyz]为旋转中心轴,alpha为旋转角度。
用rotate函数实现动画时常配合getframe函数使用,它可以在循环体中“拍”到句柄图形,然后在循环体外以movie函数将获得的图形回放,这种方式有点像将照相机抓拍的若干照片连动放映而成的动画。
在动画设计中,如何产生动画,方法比较多,常用的手法有:
改变图形中的某一参数,以产生一组动画;对某一三维图形,不断改变其观察视角,获得一组画面;对三维图形进行旋转,也可以得到一组动画;在MATLAB中,不断对图形色彩进行变幻,也可以产生不同的动画效果。
2振动弹簧的实时动画
2.1程序功能分析
以下是利用matlab实现振动弹簧的事实动画的程序。
rectangle('position',[12,8.5,2,0.3],'FaceColor',[0.5,0.3,0.4]);
axis([0,15,-1,10]);
%画顶板
holdon
plot([13,13],[7,8.5],'r','linewidth',2);
%画直线
y=2:
.2:
7;
M=length(y);
x=12+mod(1:
M,2)*2;
x
(1)=13;
x(end-3:
end)=13;
D=plot(x,y);
%弹簧
C=0:
.1:
2*pi;r=0.35;
t1=r*sin(C);
F1=fill(13+r*cos(C),2+t1,'r');
%球
set(gca,'ytick',[0:
2:
9]);
set(gca,'yticklabels',num2str([-1:
3]'));
plot([0,15],[3.3,3.3],'black');
H1=plot([0,13],[3.3,3.3],'y');
%句柄[黄线]
Q=plot(0,3.8,'color','r');
%运动曲线;
td=[];yd=[];
T=0;
text(2,9,'理想中的弹簧振子简谐振动','fontsize',16);
set(gcf,'doublebuffer','on');
whileT<12;
pause(0.2);
Dy=(3/2-1/2*sin(pi*T))*1/2;
Y=-(y-2)*Dy+7;
Yf=Y(end)+t1;
td=[td,T];yd=[yd,Y(end)];
set(D,'ydata',Y);
set(F1,'ydata',Yf,'facecolor',rand(1,3));
set(H1,'xdata',[T,13],'ydata',[Y(end),Y(end)]);
set(Q,'xdata',td,'ydata',yd);
T=T+0.1;
end
程序功能介绍:
模拟弹簧振子简谐运动的过程,同时画出相应圆球质心随时间变化的曲线。
上面的程序为模拟弹簧振子的简谐振动,若要模拟弹簧阻尼振动过程的程序,可见附录。
2.2弹簧振子的matlab建模
图2-1弹簧振子建模图
上图所示的图形即为在matlab环境下的弹簧振子的建模图形。
实现程序为:
rectangle('position',[12,8.5,2,0.3],'FaceColor',[0.5,0.3,0.4]);
axis([0,15,-1,10]);
%画顶板
holdon
plot([13,13],[7,8.5],'r','linewidth',2);
%画直线
y=2:
.2:
7;
M=length(y);
x=12+mod(1:
M,2)*2;
x
(1)=13;
x(end-3:
end)=13;
D=plot(x,y);
%弹簧
C=0:
.1:
2*pi;r=0.35;
t1=r*sin(C);
F1=fill(13+r*cos(C),2+t1,'r');
%球
set(gca,'ytick',[0:
2:
9]);
set(gca,'yticklabels',num2str([-1:
3]'));
plot([0,15],[3.3,3.3],'black');
下面分步介绍它的建模过程。
2.2.1天花板的建模
图2-2天花板建模图
如上图所示,为在matlab环境下天花板的建模图形。
实现程序为:
rectangle('position',[12,8.5,2,0.3],'FaceColor',[0.5,0.3,0.4]);
程序功能介绍:
rectangle的功能就是画一个矩形,12,8.5为矩形的一个点,他的长和宽分别为2、0.3。
'FaceColor',[0.5,0.3,0.4]是用来设置它的颜色的。
2.2.2直线的建模
图2-3直线的建模图
如上图所示,为在matlab下的直线建模图形。
实现程序为:
plot([13,13],[7,8.5],'r','linewidth',2)
程序功能介绍:
plot是一个常用的画图函数,[13,13],[7,8.5]确定的直线的位置,'r'设置直线颜色为红色。
linewidth',2,直线的粗细设置。
2.2.3弹簧的建模
图2-4弹簧的建模图
如上图所示,为在matlab环境下弹簧的建模图形。
实现程序为:
y=2:
.2:
7;
M=length(y);
x=12+mod(1:
M,2)*2;
x
(1)=13;
x(end-3:
end)=13;
D=plot(x,y);
程序功能介绍:
y=2:
.2:
7,2到7之间0.2为步长生成向量。
M=length(y),M=y向量的长度。
length为求向量长度的函数。
M=26。
x=12+mod(1:
M,2)*2,生成1412这样的重复数据26个。
mod(x,y)为x模除y。
mod(1:
:
26,2)ans=1010等26个。
x
(1)=13,令初始值为13。
x(end-3:
end)=13,令最后4个数为13。
D=plot(x,y),画出该图。
Plot函数介绍:
plot(X,Y)绘制所有由Xn和Yn数据对定义的曲线。
如果仅Xn或者仅Yn是一个矩阵,plot函数绘制向量对矩阵的行或者列的曲线图,取决于是向量的行还是列的尺寸与矩阵相匹配。
2.2.4球的建模
图2-5球的建模图
如上图所示,为在matlab环境下球的建模图形。
实现程序为:
C=0:
.1:
2*pi;r=0.35;
t1=r*sin(C);
F1=fill(13+r*cos(C),2+t1,'r');
程序功能介绍:
C=0:
.1:
2*pi;r=0.35,0到2之间0.1步长生成向量,r=0.35.t1=r*sin(C),返回r乘以C中每个元素的正弦值的值。
F1=fill(13+r*cos(C),2+t1,'r'),画出多边形小球。
Fill函数介绍;函数fill用于创建彩色的多边形。
格式;fill(X,Y,C)从X和Y中的数据出发创建填充的多边形,顶点颜色为C。
C十一哥向量或者矩阵,它是指向色图的指标。
如果C是一个行向量,则length(C)必须等于size(X,2)和size(Y,2);如果C是一个列向量,则length(C)必须等于size(X,1)和size(Y,1)。
如果有必要,fill将通过最后一个顶点与第一个顶点连接来封闭多边形。
2.2.5利用set函数返回句柄值改变来当前坐标轴
通过上几步的建模我们可以得到如下所示的图形
图2-6未重新设置轴建模图
为下一步实时动画做好准备我们需要重新设定一下坐标。
在matlab中可以利用set函数返回句柄值改变来当前坐标轴。
得到如下所示的图形。
图2-7设置后建模图
图2-8初步设置轴的建模图
实现程序为:
set(gca,'ytick',[0:
2:
9]);
set(gca,'yticklabels',num2str([-1:
3]'));
plot([0,15],[3.3,3.3],'black');
程序功能介绍:
gca未返回当前axes对象的句柄值,ytick为控制Y轴坐标刻度记号的位置,即控制坐标轴上刻度记号的位置以及每隔多少值会到下一个刻度记号的位置,同时还需配合yticklabel属性来调整。
set(gca,'ytick',[0:
2:
9]);将坐标轴从0开始以2为间隔到9设置Y坐标。
而下一句程序set(gca,'yticklabels',num2str([-1:
3]'))就是通过yticklabel来改变Y轴属性,即由0、2、4、6、8变为-1、0、1、2、3。
上面是对Y轴的设置。
对平衡位置轴的设置为:
plot([0,15],[3.3,3.3],'black'),plot为画直线的常用函数[0,15],[3.3,3.3]定义了平衡位置轴的位置。
'black',定义平衡位置轴的颜色为黑。
2.3弹簧振动的实时动画
2.3.1弹簧振子简谐振动的物理模型
图2-9弹簧振子的简谐振动
现在我们来定量地分析上图所示的弹簧振子的小振幅自由振动。
设弹簧的劲度系数为k,小球的质量为m,忽略各种阻力,取平衡位置O为坐标原点,x坐标轴指向右为正。
小球位置坐标为x时,所受弹性回复力Fx可表示为:
Fx=-kx(1.1)
根据牛顿定律,小球的M的运动微分方程为:
通常将上式改写成
(1.2)
其中
(1.3)
微分方程(1.2)的通解为
(1.4)
式(1.4)就是小球M的运动学方程。
式中A和
是两个积分常数,他们的物理意义和确定方法将在后面讨论。
将式(1.4)对时间求一阶和二阶导数,得到小球运动速度和加速度
(1.5)
(1.6)
因
,故令
,则解(1.4)还可以写成
(1.7)
即微分方程(1.4)的解即可写成遇险函数的形式,也可以写成正弦函数形式。
从解(1.4)看出,弹簧振子运动时,坐标x(即相对平衡未知的位移)按余弦(或正弦)函数规律随时间变化。
因此,只在线性弹性回复力作用下的弹簧振子运动是谐振动。
式(1.5)、(1.6)表明,作谐振动物体的速度和加速度也是按余弦或正弦函数规律随时间变化的。
见下图,从式(1.2)看出,作谐振动物体的加速度大小总是与其位移大小成正比,二者符号相反,这一结论被视为谐振动的运动学特征。
图2-10简谐运动曲线
2.3.2利用matlab实现弹簧的实时振动
由2.3.1节可知弹簧振动是的变化主要表现在弹簧和小球的位置随时间的变化,而且小球的位移是按正弦规律变化的。
据此我们先设计一个算法。
现用流程图表示如下:
图2-11流程图
Matlab是通过以下程序实现弹簧振动的实时动画的:
rectangle('position',[12,8.5,2,0.3],'FaceColor',[0.5,0.3,0.4]);
axis([0,15,-1,10]);
%画顶板
holdon
plot([13,13],[7,8.5],'r','linewidth',2);
%画直线
y=2:
.2:
7;
M=length(y);
x=12+mod(1:
M,2)*2;
x
(1)=13;
x(end-3:
end)=13;
D=plot(x,y);
%弹簧
C=0:
.1:
2*pi;r=0.35;
t1=r*sin(C);
F1=fill(13+r*cos(C),2+t1,'r');
%球
set(gca,'ytick',[0:
2:
9]);
set(gca,'yticklabels',num2str([-1:
3]'));
plot([0,15],[3.3,3.3],'black');
H1=plot([0,13],[3.3,3.3],'y');
%句柄[黄线]
Q=plot(0,3.8,'color','r');
%运动曲线;
td=[];yd=[];
T=0;
text(2,9,'理想中的弹簧振子简谐振动','fontsize',16);
set(gcf,'doublebuffer','on');
whileT<12;
pause(0.2);
Dy=(3/2-1/2*sin(pi*T))*1/2;
Y=-(y-2)*Dy+7;
Yf=Y(end)+t1;
td=[td,T];yd=[yd,Y(end)];
set(D,'ydata',Y);
set(F1,'ydata',Yf,'facecolor',rand(1,3));
set(H1,'xdata',[T,13],'ydata',[Y(end),Y(end)]);
set(Q,'xdata',td,'ydata',yd);
T=T+0.1;
End
该程序的建模部分已经在前面介绍过了,现介绍实现振动的部分。
在此之前先做一些准备工作。
即为以下程序段:
H1=plot([0,13],[3.3,3.3],'y');
%句柄[黄线]
Q=plot(0,3.8,'color','r');
%运动曲线;
td=[];yd=[];
T=0;
text(2,9,'理想中的弹簧振子简谐振动','fontsize',16);
set(gcf,'doublebuffer','on');
程序功能介绍:
H1=plot([0,13],[3.3,3.3],'y'),画句柄线。
位置为[0,13],[3.3,3.3],颜色为黄色。
td=[];记录时间的变量,yd=[],记录y轴位置的变量。
T=0;设置初始时的时间值。
text(2,9,'理想中的弹簧振子简谐振动','fontsize',16);添加标注文字。
位置为(2,9),标注为‘理想中的弹簧振子简谐振动’字符串大小为16号字体。
set(gcf,'doublebuffer','on');启动双缓存,设置渲染效果。
通过上面的可得到如下图所示的界面。
图2-12弹簧振子振动前的图形
模拟弹簧振子简谐振动的过程包括以下内容:
①更新小球和弹簧的位置。
②更新水平线的位置和长度。
③实时地画出弹簧高度与时间的关系曲线。
以上几点将在下面程序介绍中解释。
该弹簧振子的振动是通过一个while循环语句来实现的。
程序语句为:
whileT<12;
pause(0.2);
Dy=(3/2-1/2*sin(pi*T))*1/2;
Y=-(y-2)*Dy+7;
Yf=Y(end)+t1;
td=[td,T];yd=[yd,Y(end)];
set(D,'ydata',Y);
set(F1,'ydata',Yf,'facecolor',rand(1,3));
set(H1,'xdata',[T,13],'ydata',[Y(end),Y(end)]);
set(Q,'xdata',td,'ydata',yd);
T=T+0.1;
End
程序功能介绍:
pause(0.2);暂停一下,显示动画效果。
Dy=(3/2-1/2*sin(pi*T))*1/2;计算T时刻弹簧对平衡位置的位移。
Y=-(y-2)*Dy+7;计算弹簧的纵坐标数值。
Yf=Y(end)+t1;计算圆球的纵坐标数值。
td=[td,T];yd=[yd,Y(end)];更新运动曲线的数据。
set(D,'ydata',Y);更新弹簧的位置数据。
set(F1,'ydata',Yf,'facecolor',rand(1,3)),更新圆球的位置数据。
rand(m,n)函数是返回一个m*n的随机矩阵,这里用来改变小球的颜色。
set(H1,'xdata',[T,13],'ydata',[Y(end),Y(end)]),更新跟踪黄线的数据。
这里句柄黄线的主要作用为将振动弹簧的位移以运动曲线的形式变现出来,以便我们跟好的了解弹簧振子的简谐振动。
set(Q,'xdata',td,'ydata',yd),更新曲线的数据。
T=T+0.1;更新时间。
2.4调试结果
观察T=0、3、6、9、12的调试图形。
图2-13T=0的图形
图2-14T=3时的图形
图2-15T=6时的图形
图2-16T=9时的图形
图2-17T=12时的图形
3设计总结
本次设计实现了设计要求,实现了利用matlab实现振动弹簧的实时动画,同时画出相应圆球质心随时间变化的曲线。
通过此次课程设计,让我对matlab软件的应用有了更多的了解,对一些基本matlab函数的功能及算法有了一定的掌握。
在学习的过程中,对matlab软件功能强大深有体会。
参考文献
[1]徐东艳.MATLAB函数库查询辞典.中国铁道出版社.2005.
[2]苏金明.MATLAB实用教程.电子工业出版社.2008.
[3]李丽.MATLAB工程计算及应用.人民邮电出版社.2001.
[4]蔡旭辉.MATLAB基础与应用教程.人民邮电出版社.2009.
[5]周建兴.MATLAB从入门到精通.人民邮电出版社.2008.
[6]张铮.MATLAB程序设计与实例应用.中国铁道出版社.2003.
致谢
在本次设计的整个过程中,得到了敖老师和同学的大力帮助,借此机会向他们表示诚挚的感谢。
感谢在百忙之中对我的论文进行评审并提出宝贵意见的老师们。
附录-弹簧阻尼振动程序
下面来模拟弹簧振子在阻尼力的作用下进行阻尼运动的过程,同时画出相应圆球质心随时间变化的曲线。
相应的MATLAB程序如下:
closeall;clear;clc;
rectangle('position',[12,8,2,0.3],'FaceColor',[0.1,0.3,0.4]);axis([0,15,-1,10]);holdon;%设置坐标轴范围
plot([13,13],[7,8],'r','linewidth',2);%画与弹簧连接的线
y=2:
.2:
7;%得到弹簧对应的纵坐标数据
M=length(y);%获取数据的长度
x=12+mod(1:
M,2)*2;