第一篇:Matlab与Simulink仿真学习心得
Matlab与Simulink仿真学习心得
班级:07610 学号:072016 姓名:吕天雄
一 Matlab学习心得体会与编程实践
<1>学习Matlab的心得体会
真正开始接触Matlab是大二上就开始了,到现在已经一年多了,在此之间,Matlab的确为我提供了很多便利。Matlab的确不愧成为是草稿纸上的语言。我们不必去为很简单的显示效果图形去找一些什么其他软件或者研究比较复杂的计算机图形学,一个plot或者别的函数往往就可以得到很满意的效果。
其实最初开始学习matlab的时候感觉这个东西和C没什么两样,但是后来具体到一些 东西,比如信号处理和数学建模上以后才感觉到使用matlab编写程序去验证结果比C要节 省很多时间,而且matlab写东西基本都是按照自己的思路平铺直叙很少去考虑什么函数的 嵌套调用或者指针等等很头疼的东西。
关于matlab的学习,我感觉其实百度和matlab自带的help基本能够解决绝大数问题,而且一些比较好的论坛比如www.xiexiebang.com都会为你产生很大的帮助,关键是在于多动手实践,多思考。但是matlab毕竟只是一个工具,原理和一些基本的编程素质还是必须有的,否则matlab最多也只能是验证一些别人的东西而已,根本帮不上什么忙的。
<2>遇到的一些问题的思考方式与解决办法
最开始用matlab的时候是在大物实验,实验要求去根据测量得到的数据作出图。但是 手动用铅笔去画确实很麻烦,所以用matlab确实可以省去很大的麻烦。但是第一次遇到问 的时候是有关极化坐标下的曲线拟合。
首先是一个物理实验的问题;在做一个关于光的偏振的实验的时候,最后的结果要在一个极化坐标下显示出来;因为数据是离散的,所以显示出来的图像是一个折来折去的一个东东; 然后很自然的想法是对这个曲线进行插值处理。
但是极化坐标下MATLAB并未提供插值处理的函数,interp1这个函数只能在笛卡尔坐标系,也就是直角坐标系下使用。
然后就想到把极坐标的数据转换的直角坐标系下,pol2cart可以实现这个想法,但是随后而来,也就是最后导致整个问题失败的关键也在这里。
pol2cart以后产生的一串数据中出现了重复的数据,那么interp1这个东西也就无能为力了,因为interp1不能处理一串数据中有重复出现的情况。最后的处理办法是把这些数据c os,sin这些东西变换一下后,使其大致规则,然后再用polar画出极坐标下的图形。
接下来这个问题就有点超过我的范围了,可能会有点叙述不清楚。问题可以概要为:人脸网格插值。
这是一个用三角形网格表示的一个人脸模型。需要通过插值使其变得光滑,当然问题的复杂之处在于,插值会改变原本的网格结构。
对于这个问题许多人都给出了解决的办法,当然是一些关于人脸识别技术和运动图像处理的范畴之内的。
主要有两种,第一种是face—ls算法。这种算法是基于RBF(径向插值函数)和loop细分原则的一种算法,当然其精确程度比较差点。但是速度挺好。原理是:基于网格上的点,产生出顶点的迭代函数,从而产生出新的定点,进行细化。然后进行插值。也就是引进新的顶点。分为两个过程内部插值和边缘插值。具体可以去看兰州大学信息工程学院的学报。
第二种也就是基本的老办法RBF。首先解释一下什么叫做径向插值 径向基函数
主要是考虑多维空间的数据插值问题,径向基函数在三维图形的变形中常常被采用,用其来变分三维人脸的时候还应结合人脸的固有特征。确定该方法来实现三维人脸变形是可行的,但要构造好的基函数,以及解这些高维方程的解仍是难点。插值方法:
假设大多数人脸的形状都可以由一个拓扑原型变化得来,那么,通过调整一个一般模型的构造参数可以建立不同的面部模型。但是,这种参数模型仅仅局限于那些构造参数已知的情况,并且对特定人脸参数的调整非常困难。在离散数据的多变量插值问题方面,径向基函数(radial basis function,RBF)插值方法是一个行之有效的工具,所以也适用于类似人脸这样高维曲面的近似或平滑插值。现有的许多方法使用了基于RBF的插值技术,将一般人脸网格变化到特定人脸的形状。这种方法的优点在于:(1)通过插值可以得到丢失的数据点,所以源网格和目标网格不需要相同数目的结点;(2)如果选择了合适的匹配点,数学上可以保证能够将源网格变形到目标网格。
当然我也不是很懂,只是理解了部分。这种方法的关键是找到一个很好的核函数来计算出新的顶点。
最后问题解决的方式是查着了一些图书馆的学报。然后而且在网上找到了部分代码。然后做出来的。这是我校大四一个同学毕设中的一个东西。
其实这个事件最好的解决办法是在3D-MAX中,不过因为没能找到MATLAB与3D-MAX是怎么接口的,所以作罢了。
第三次遇到的问题是我在数学建模课上遇到的一个关于矩阵LU分解的问题:
Matlab作出的结果和手算的结果竟然不一样。
10111
U=1 一个矩阵 A= 经过三角分解为L=10111因为1/为一个极大数 则1—1/可以看成—1/;
设=0.***000000001%10的负24次方
从而L*U=则最后一位1没有了 变成了0
其中L=
U=Matlab 程序为
epusino=0.***000000001;U=[epusino 1;0-1/epusino];L=[1 0;1/epusino 1];L*U ans =
0.***
1.***
1.***
0 而直接用lu函数对矩阵A分解的结果为
A=[epusino 1;1 1] A =
0.0000
1.0000
1.0000
1.0000
>> [L,U]=lu(A)L =
0.0000
1.0000
1.0000
0
U =
0 我们老师当时的解释是这是由于我们所用matlab是破解版的缘故,破解版的计算精度 没正版的高所以导致运算结果的错误,后来我看了一些LU这个函数的help文档 psychologically lower triangular matrix"(i.e.a product of lower triangular and permutation matrices)in L。翻译过来是L是一个心理上的下三角矩阵,其实是下三角矩阵和置换矩阵也就是最后的结论。P*A = L*U.。由此可见这并不是什么精度的问题导致的结果只是LU分解的矩阵意义和书本上的不同而已。
以下是我自己写的一些程序的代码
1:网络随机拓扑图
目的是要生成一个度数随机、权值随机的拓扑图。首先的理解是利用邻接矩阵,先随机生成一个矩阵,该矩阵为一个对称矩阵。然后画出这个矩阵就行了。
随机拓扑图10026516398191 ***0430 ***065
%产生数组A用来存放表示两点之间权值的矩阵A,也就是临接矩阵,那么两点之间权值不为零元素的个数即为该点的度数
DEF=5;%设定一个东东 方便改变随机点的个数 A=rand(DEF,DEF);%产生DEF*DEF的随机矩阵 for i=1:DEF A(i,i)=0%将对角线上的数置为0 end A=10*A;A=floor(A);%向下去整 for i=1:DEF for j=1:i A(j,i)=A(i,j)%将A矩阵变为一个上三角或者下三角矩阵 end end x=100*rand(1,DEF);y=100*rand(1,DEF);%产生10个随机的点 plot(x,y,'r+');
for i=1:DEF a=find(A(i,:)>0)%将A矩阵每行大于0的数的在该行的地址找出来放在a中
for j=1:length(a)
c=num2str(A(i,j));%将A中的权值转化为字符型
if c~='0'%不显示为0的值 因为A矩阵为零代表两点不相连 text((x(i)+x(j))/2,(y(i)+y(j))/2,c,'Fontsize',18);%将权值显示在两点连线中间 end hold on;
line([x(i)x(a(j))],[y(i)y(a(j))]);%连线 end end
title('随机拓扑图');e=num2str(DEF);legend(e);%左上角显示节点的个数 for m=1:DEF A(m,m)=m;f=num2str(A(m,m));hold on;text((x(m)+x(m))/2,(y(m)+y(m))/2,f,'Fontsize',18);%将权值显示在两点连线中间 end 接下来是一个在信息安全课上写的一个关于256色图分层的程序,一副图像有m*n个像素然后每个像素是一个8bit的二进制数据换算为十进制是0-255之间。要做的就是把每bit的信息提取出来。
I=imread('bupt副本.bmp');%读入源图像
I=double(I);%将图像转换为double类型便于MATLAB中的计算 %确定图像的长宽 M=size(I,1);%长 N=size(I,2);%宽 l=M*N;%图像长宽之积 for n=1:8;%剔除每层 for i=1:M
for j=1:N
B=numdec2bin(I(i,j),8);%先将每个像素转换为8位2进制序列
B(n)=[];%删除相应位置的元素
y(i,j)=numbin2dec(B);%将剩下的7个元素转换为10进制数放入y矩阵中
end end
y=uint8(y);%将10进制的矩阵转换为无符号整形
subplot(4,2,9-n);%显示n个图像,每层是相应的剔除该层的结果
imshow(y);%显示这个图像
title(strcat('去除第',num2str(9-n),'层后的结果'));%显示标题 end
附带的两个函数:
function y=numdec2bin(x,n);%从函数将十进制数x转化为n位二进制 y=zeros(1,n);a=x;i=n;while a>0 y(i)=mod(a,2);a=floor(a/2);i=i-1;end function y=numbin2dec(x)%将二进制数转换为十进制数 a=0;lx=length(x);for i=1:lx a=a+x(i)*2^(lx-i);end y=a;
去除第1层后的结果去除第2层后的结果去除第3层后的结果去除第4层后的结果去除第5层后的结果去除第6层后的结果去除第7层后的结果去除第8层后的结果
Matlab的RGB转换为YCbCr之后转换回来和原图不符
这个是做JPEG图像压缩的时候遇到的一个问题,当时的代码是用C写的但是结果不对,后来想到用matlab进行验证结果发现通过公式转换得到的图是错的。
原理:BMP图像压缩为JPEG的第一步是将RGB色彩空间通过这个公式映射到YCbCr空间上。
Y=0.299 R + 0.587 G + 0.114 B Cb =0.3313G + 0.5 B + 128 Cr = 0.5 R0.0813 B + 128 然后再进行量化,DCT,编码等等步骤。JPEG解压时需要将YCbCr空间的图像又转化回来到RGB上。
R = Y + 1.402(Cr0.34414(Cb-128)128)
B = Y + 1.772(Cb-128)
但是通过书上给的公式和网上大部分公式却发现根本转化不会来。下面是写的程序代码以及测试得到的结果图像。
clc,clear;Source=imread('hl.jpg');%读入原始RGB图像
figure(1);subplot(1,2,1);imshow(Source):title('original image');%显示图像 [r c d]=size(Source);%计算图像大小 %------计算红色分量并显示分解图------% R(:,:,1)=Source(:,:,1);R(:,:,2)=zeros(r,c);R(:,:,3)=zeros(r,c);R=uint8(R);whos;figure(2);subplot(1,3,1);imshow(R)title('Red Component');%-------计算绿色分量并显示分解图-------% G(:,:,2)=Source(:,:,2);G(:,:,1)=zeros(r,c);G(:,:,3)=zeros(r,c);G=uint8(G);figure(2);subplot(1,3,2);imshow(G)title('Green Component');%--------计算蓝色分量并显示分解图-------% B(:,:,3)=Source(:,:,3);B(:,:,1)=zeros(r,c);B(:,:,2)=zeros(r,c);B=uint8(B);figure(2);subplot(1,3,3)imshow(B)title('Blue Component');%------------合成-------------% Comp(:,:,1)=R(:,:,1);Comp(:,:,2)=G(:,:,2);Comp(:,:,3)=B(:,:,3);figure(1);subplot(1,2,2);imshow(Comp):title('composition image');Y=0.229*R+0.587*G+0.114*B;Cb=0.5*B-0.1687*R-0.3313*G+128;Cr=0.5*R-0.4187*G-0.0813*B+128;red=Y+1.402*(Cr-128);green=Y-0.34414*(Cb-128)-0.71414*(Cr-128);blue=Y+1.772*(Cb-128);Comp2(:,:,1)=red(:,:,1);Comp2(:,:,2)=green(:,:,2);Comp2(:,:,3)=blue(:,:,3);figure(3);imshow(Comp2);title('RGB转换为YCrCb后又转换为RGB的图像');RD=R(:,:,1)-red(:,:,1);GD=G(:,:,2)-green(:,:,2);BD=B(:,:,3)-blue(:,:,3);figure(4);subplot(1,3,1);imshow(RD);title('红色分量差异');subplot(1,3,2);imshow(GD);title('绿色分量差异');subplot(1,3,3);imshow(BD);title('蓝色分量差异');
然而可以通过figure(4)的图像清楚看到R 和G分量转换后恢复 与以前的差别很大。而且看了一下matlab自带的rgb2ycbcr和ycbcr2rgb并且用了这两个函数测试后图像是一样的。很是不解
实验得到的图为: original imagecomposition image
将源图像分为RGB三个部分。
Red ComponentGreen ComponentBlue Component
将源图像的RGB分量转换到YCbCr上后又转化为RGB得到的三个分量差异的图。
红色分量差异绿色分量差异蓝色分量差异 公式转换的y分量公式转换的cb分量公式转换的Cr分量matlab函数转换的y分量matlab函数转换的Cb分量matlab函数转换的Cr分量
从最后的结果可以看出原图转换到YCbCr空间之后又转化回来得到的图像与原图不符….RGB转换为YCrCb后又转换为RGB的图像
以上只是我自己用Matlab做过的部分问题,还有一些比如场声源定位Music算法仿真,DES加密算法。神经网络滤波器等等,鉴于代码量太大,就不再敖述。二 Simulink学习心得与编程实践
SIMILINK模块库按功能进行分类,包括以下8类子库: Continuous(连续模块)Discrete(离散模块)
Function&Tables(函数和平台模块)Math(数学模块)
Nonlinear(非线性模块)
Signals&Systems(信号和系统模块)Sinks(接收器模块)Sources(输入源模块)
对于simulink来说其实没什么好说的,需要什么就把什么拖到Model里面,连线之后设定参数。不是很麻烦的。但是重要的是对于系统的设计与仿真思想才是最重要的。而且里面的S-Function也是比较好的一个设计,用S-Function可以自定义一些组件,使自己的仿真看上去更加清晰与精简。
Simulink的工作方式:
(1)模块内的参数值首先会送到Matlab中进行计算,得到的参数值会用来当做以后需要调用的参数。
(2)模型系统中的各个层级将被平展开来,每一个子系统将被相应的模块所代替。(3)模块按被处理的顺序排列,此时代数回路结构也被检查出来,此种排列产生一个列表,以确保具有代数回路的模块驱动输入的模块被更新后才更新。
(4)检查块之间的链接,是否每一个块的输出端口与它所连接的模块输入端口有相同的信号宽度。
现在可以准备执行仿真操作,仿真时使用数值迭代求的的结果,每种数值积分模型提供的连续状态的微分能力。
Simulink中的模型都是分级的,因此可以通过自上而下或者自下而上的方式建立模型。定义了一个模型以后,就可以通过Simulink的菜单或者在Matlab的Command中输入命令进行仿真。
关于学习的心得就写到这里了,接下来是一些自己做的仿真。
1:观察一个信号与积分之后的区别,目的是了解Scope的功能和用法。
仿真结果,左边为原始信号,右边为积分后的信号。
用XYGraph看到的对比
Rossler吸引子产生仿真:
Rossler 吸引子产生是服从下面这个方程的 1
212 331
仿真图 (xx)xxaxxbx(xc)xab0.2c5.7
仿真结果
LMS自适应滤波器: 仿真图:
遇到的问题
问题的解决办法:
将Spectrum Scope中的buffer input打勾就行了。
仿真结果图形:
1:Spectrum Scope的输出图形
2:Vector Scope的输出结果
3:Scope的输出结果图形
第二篇:Matlab与Simulink系统仿真学习心得 马楠
Matlab与Simulink系统仿真学习心得
班级:07610
学号:072019
姓名:马楠
第一部分:Matlab学习心得以及实践
Matlab是迄今为止我所见到过的功能最为强大实用范围宽广的软件。的确Matlab适用于教学,航天,网络仿真等等。而且提供了很多功能强大的工具箱,并且最为突出的是它自带的很全面细致的帮助文档,无论你是初学者还是老手都会惊叹于此,你也不必去花很多时间去熟悉那些繁杂的命令,并且很容易通过这些帮助文档得到关于这些函数最精准的用法。
Matlab是一个建立在矩阵操作上的软件,我想要想真正懂得并理解Matlab与一般的语言比如C或者java的区别,那么你就应该真正理解矩阵的思想。而且要熟悉Matlab对矩阵存储的方式(在下文中我会详细解释与之相关的内容),这样对提高你的代码执行效率与易懂性都有很大的帮助。
但是Matlab究竟应该怎么定位呢?一个编程软件,一个数学工具,一个工具箱,一个开发引擎,一个仿真工具,一个虚拟现实软件…… 的确要精准的说出Matlab的作用很难,或许去定义这个东西到底是用来干什么的并不重要,It is just a tool。
关于Matlab的学习方法,我想与别的语言有很大不同,对于汇编或者C,我们应当很注重底层的一些操作,比如栈或者队列存储数据的方式,int或者double类型转换的时候产生的数据丢失,或者指针方面很头疼的一些东西,但是对于Matlab你根本不必去注重这些东西,也不必去清除的记得那个函数的具体调用方式,那个函数的内容与结构等等。你需要的只是相当用一个笔记本写下你一步一步实现目标的步骤而已。一种草稿纸式的语言。你所学的东西很大部分都是为你要做的目标来服务的,也许这就是当初面向对象式语言产生的原因,但是Matlab就是这种语言的一个代表。
好了,就说到这里了,接下来是我自己学习中对Matlab的一些应用中所遇到的问题以及思考方式和解决办法。离散信号卷积:
N1=input('N1=');%输入N1 N2=input('N2=');%输入N2 k1=0:(N1-1);%定义序列f1的对应序号向量 k2=0:(N2-1);% 序列f2的对应序号向量 f1=ones(1,N1);%f1为阶跃序列 f2=0.5*k2;%f2为斜坡序列
[f,k]=dconv(f1,f2,k1,k2)%求离散卷积
其中dconv函数的代码为:
function [f,k]=dconv(f1,f2,k1,k2)
%The function of compute f=f1*f2 % f: 卷积和序列f(k)对应的非零样值向量 % k:
序列f(k)的对应序号向量 % f1: 序列f1(k)非零样值向量 % f2: 序列f2(k)的非零样值向量 % k1: 序列f1(k)的对应序号向量 % k2: 序列f2(k)的对应序号向量 f=conv(f1,f2)
%计算序列f1与f2的卷积和f k0=k1(1)+k2(1);
%计算序列f非零样值的起点位置 k3=length(f1)+length(f2)-2;
%计算卷积和f的非零样值的宽度
k=k0:k0+k3
%确定卷积和f非零样值的序号向量 subplot(2,2,1)stem(k1,f1)title('f1(k)')xlabel('k')ylabel('f1(k)')subplot(2,2,2)
%在子图1绘序列f1(k)时域波形图
stem(k2,f2)
%在图2绘序列f2(k)时波形图 title('f2(k)')xlabel('k')ylabel('f2(k)')subplot(2,2,3)stem(k,f);
%在子图3绘序列f(k)的波形图 title('f(k)f1(k)与f2(k)的卷积和f(k)')xlabel('k')ylabel('f(k)')h=get(gca,'position');
h(3)=2.5*h(3);set(gca,'position',h)%将第三个子图的横坐标范围扩为原来的2.5倍一次物理实验中的数据处理,关于非线性电阻。
x=[12.042 11.844 11.644 11.444 11.244 11.043 10.843 10.645 10.447 10.240 10.054 9.843 9.640 9.447 8.950 8.448 7.946 7.441 6.940 6.444 5.942 5.446 4.946 4.445 3.944 3.447 2.942 2.442 2.246 2.045 1.846 1.643 1.464 1.252 1.038 0.849 0.642 0.448 0.208 0 ];y=[0.601 0.915 1.349 1.742 2.152 2.572 2.994 3.414 3.840 4.285 4.678 4.612 4.526 4.447 4.246 4.043 3.846 3.635 3.433 3.232 3.028 2.827 2.625 2.442 2.220 2.018 1.814 1.614 1.535 1.455 1.376 1.235 1.101 0.950 0.791 0.642 0.491 0.341 0.158 0.001]
p1=polyfit(x(1:11),y(1:11),1);p2=polyfit(x(11:31),y(11:31),1);p3=polyfit(x(31:end),y(31:end),1);Y1=vpa(poly2sym(p1,'x'),6)Y2=vpa(poly2sym(p2,'x'),6)Y3=vpa(poly2sym(p3,'x'),6)
x1=min(x(1:11)):0.1:max(x(1:11));x2=min(x(11:31)):0.1:max(x(11:31));x3=min(x(31:end)):0.1:max(x(31:end));y1=polyval(p1,x1);y2=polyval(p2,x2);y3=polyval(p3,x3);
plot(x,y,'o',x1,y1,x2,y2,x3,y3);xlabel('电压值U/v');ylabel('电流值I/mA');title('非线性电阻伏安特性曲线');grid on 54.543.532.521.510.5002468101214
3:三维立体图形灯光效果 [x,y]=meshgrid(-8:0.5:8);R=sqrt(x.^2+y.^2)+eps;z=sin(R)./R;surf(x,y,z,'FaceColor','interp','EdgeColor','none','FaceLighting','phong');axis tight;daspect([5 5 1]);camlight left view(-50,30)
10.80.60.40.204-0.2-8-6-4-202468-8-6-4-20268
4:地形模拟:
A=[ 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 20 0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.4 0.3 0.2 0.3 0.2 0.1 0.2 0.2 0.4 0.3 0.2 0.2 0.2 0.2 19 0.3 0.2 0.2 0.2 0.2 0.4 0.3 0.3 0.3 0.3 0.4 0.2 0.2 0.2 0.2 0.4 0.4 0.4 0.3 0.2 0.2 18 0.2 0.3 0.3 0.2 0.3 1 0.4 0.5 0.3 0.3 0.3 0.3 0.2 0.2 0.2 0.6 0.5 0.4 0.4 0.2 0.2 17 0.2 0.2 0.4 0.2 1 1.1 0.9 0.4 0.3 0.3 0.5 0.3 0.2 0.2 0.2 0.7 0.3 0.6 0.6 0.3 0.4 16 0.2 0.2 0.9 0.7 1 1 1 0.7 0.5 0.3 0.2 0.2 0.2 0.6 0.2 0.8 0.7 0.9 0.5 0.5 0.4 15 0.2 0.3 1 1 1 1.2 1 1.1 0.8 0.3 0.2 0.2 0.2 0.5 0.3 0.6 0.6 0.8 0.7 0.6 0.5 14 0.2 0.4 1 1 1.1 1.1 1.1 1.1 0.6 0.3 0.4 0.4 0.2 0.7 0.5 0.9 0.7 0.4 0.9 0.8 0.3 13 0.2 0.2 0.9 1.1 1.2 1.2 1.1 1.1 0.6 0.3 0.5 0.3 0.2 0.4 0.3 0.7 1 0.7 1.2 0.8 0.4 12 0.2 0.3 0.4 0.9 1.1 1 1.1 1.1 0.7 0.4 0.4 0.4 0.3 0.5 0.5 0.8 1.1 0.8 1.1 0.9 0.3 11 0.3 0.3 0.5 1.2 1.2 1.1 1 1.2 0.9 0.5 0.6 0.4 0.6 0.6 0.3 0.6 1.2 0.8 1 0.8 0.5 10 0.3 0.5 0.9 1.1 1.1 1 1.2 1 0.8 0.7 0.5 0.6 0.4 0.5 0.4 1 1.3 0.9 0.9 1 0.8 9 0.3 0.5 0.6 1.1 1.2 1 1 1.1 0.9 0.4 0.4 0.5 0.5 0.8 0.6 0.9 1 0.5 0.8 0.8 0.9 8 0.4 0.5 0.4 1 1.1 1.2 1 0.9 0.7 0.5 0.6 0.3 0.6 0.4 0.6 1 1 0.6 0.9 1 0.7 7 0.3 0.5 0.8 1.1 1.1 1 0.8 0.7 0.7 0.4 0.5 0.4 0.4 0.5 0.4 1.1 1.3 0.7 1 0.7 0.6 6 0.3 0.5 0.9 1.1 1 0.7 0.7 0.4 0.6 0.4 0.4 0.3 0.5 0.5 0.3 0.9 1.2 0.8 1 0.8 0.4 5 0.2 0.3 0.6 0.9 0.8 0.8 0.6 0.3 0.4 0.5 0.4 0.5 0.4 0.2 0.5 0.5 1.3 0.6 1 0.9 0.3 4 0.2 0.3 0.3 0.7 0.6 0.6 0.4 0.2 0.3 0.5 0.8 0.8 0.3 0.2 0.2 0.8 1.3 0.9 0.8 0.8 0.4 3 0.2 0.3 0.3 0.6 0.3 0.4 0.3 0.2 0.2 0.3 0.6 0.4 0.3 0.2 0.4 0.3 0.8 0.6 0.7 0.4 0.4 2 0.2 0.3 0.4 0.4 0.2 0.2 0.2 0.3 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.5 0.7 0.4 0.4 0.3 0.3 1 0.2 0.2 0.3 0.2 0.2 0.3 0.2 0.2 0.2 0.2 0.2 0.1 0.2 0.4 0.3 0.6 0.5 0.3 0.3 0.3 0.2 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.7 0.4 0.2 0.4 0.5 0.3];z=A(2:end,2:end)[x,y]=meshgrid(0:20,20:-1:0);surf(x,y,z)xlabel('x')[X,Y]=meshgrid(0:0.3:20,20:-0.3:0);Z=interp2(x,y,z,X,Y,'spline')figure surf(X,Y,Z)1.41.210.80.60.40.2020******161820x
1.41.210.80.60.40.20-0.220******161820
第二部分:Simulink学习心得以及实践
Simulink是Matlab最重要的组件之一,它提供一个动态系统建模、仿真和综合分析的集成环境。在该环境中,无需大量书写程序,而只需要通过简单直观的鼠标操作,就可构造出复杂的系统。Simulink具有适应面广、结构和流程清晰及仿真精细、贴近实际、效率高、灵活等优点,并基于以上优点Simulink已被广泛应用于控制理论和数字信号处理的复杂仿真和设计。同时有大量的第三方软件和硬件可应用于或被要求应用于Simulink。
最开始的仿真是没有图形化输入的,所谓模型化图形输入是指SIMULINK提供了一些按功能分类的基本的系统模块,用户只需要知道这些模块的输入输出及模块的功能,而不必考察模块内部是如何实现的,通过对这些基本模块的调用,再将它们连接起来就可以构成所需要的系统模型(以.mdl文件进行存取),进而进行仿真与分析。
现在来想其实要用Simulink去仿真一个系统不是很麻烦,只是实现一些拖拽或者参数设置什么的,但是要真正的去设计完善一个系统的确需要很多知识以及精力。我们必须了解这个系统的每一个步骤以及需要什么样的组件与之匹配。而且在仿真出现错误之后去分析也是很麻烦的一件事情,我们必须有对系统详细的分析和充分了解以及对Simulink每个组件充分的了解才能真正找到错误所在并且修正。所以学好计算机仿真重在理论知识。
接下来是一些自己做的Simulink仿真。
1:阶跃信号的积分 仿真图
仿真结果:
房屋产热的一个实例
该问题是模拟一个户外条件下一所房屋能够产生的热量的例子
这是仿真结果图
第三篇:MATLAB实验六《SIMULINK交互式仿真》
《计算机仿真及应用》实验教案
实验六 SIMULINK交互式仿真
一、实验目的
1、熟悉SIMULINK交互式仿真集成环境。
2、掌握连续时间系统建模的方法。
二、实验主要仪器与设备
装配有MATLAB7.6软件的计算机
三、预习要求
做实验前必须认真复习第七章SIMULINK交互式仿真集成环境。
四、实验内容及实验步骤
示的SIMULINK模块库浏览器。
《计算机仿真及应用》实验教案
图7.2 SIMULINK模块库浏览器
4、开启空白(新建)模型窗
单机Simulink模块库浏览器工具条上的图标“去的)。
5、从模块库复制所需模块到空白(新建)模型窗(见图7.3)
把连续模块子库中的积分器
”;或在选择下拉菜单项{File:
New},引出如图7.3所示的空白模型窗(注:窗中的模块是后一个步骤复制进
《计算机仿真及应用》实验教案
7.3 制进库模块的新建模型窗
6、新建模型窗中的模型再复制
在该新建模型窗中,可以通过再复制,产生建模所需的2个积分模块和2个增益 模块。具体操作方法是:按住[Ctrl]键,用鼠标“点亮并拖拉”积分模块
见一个所需的增益模块,可采用类似方法获得。
7、模块连接线的形成方法随信号起始端位置不同而不同,具体如下。
起始端位于模块输出口的信号线生成法。使光标靠近模块输出口;待光标变 为“单线十字叉”时,按下鼠标左键;移动十字叉,拖出一根“虚连线”;光标 与另一个模块输出口靠近到一定程度,单十字叉变为双十字叉;放开鼠标左键,”虚连线”便变为带箭头的信号连线。
起始端位于其他信号线上的信号线生成法。使光标置于已经存在的其他信号线 之上;按下鼠标右键,光标变为“单线十字叉”;运动鼠标,引出”虚连线”;当 鼠标与待连接模块输入口靠得足够近,单十字叉变为双十字叉;放开鼠标右键,“虚连线”便变为带箭头的信号连线。
双击相应的信号线,给信号线作标注,如x’’,x’,x等。
《计算机仿真及应用》实验教案
图7.4
已构建完成的新建模型窗
8、根据理论数学模型设置模块参数
为使构造的Simulink模型与理论数学模型一致,须对模块进行如下参数设置。
设置增益模块
《计算机仿真及应用》实验教案
修改求和模块输入口的代数符号:双击求和模块,引出如图7.1-6所示的参数设置窗; 把符号列表栏中的默认符号(++)修改成代数符号(--);单击【OK】键,完成设置;
图7.6 改变输出入口符号的求和模块参数设置窗
据初始位移x(0)=0.05m对积分模块
《计算机仿真及应用》实验教案
图7.7 实现初始化位移0.05设置的Integrator1设置窗
9仿真运行参数采用默认解算器“ode45”、默认“变步长”和默认仿真终止时间10.10把新建模型保存为exm070101.mdl.11试运行,以便发现问题加以改善。
双击
”仿真启动键,使该模型运行;在示波器上呈现
图7.8 坐标范围设置不当时的信号
《计算机仿真及应用》实验教案
单击Scope显示窗上的纵坐标范围自动设置图标“”,示波器显示窗改变为图7.9所
示。在显示窗中,可以看到位移x(t)的变化曲线。同时可以发现:纵坐标的适当范 围大致在【-0.06,0.06】;仿真时间取【0,5】即可;显示的曲线不够光滑。
图7.9 采用轴自动设置功能的信号显示
12、据试运行结果,进行仿真参数的再设置
示波器纵坐标设置:用鼠标单击示波器的黑色显示屏,在弹出菜单中选择Axes Properties,引出纵坐标设置对话窗7.10所示;把纵坐标的下限、上限分别设置为(-0.06)和(+0.06);单 击【OK】,完成设置。
示波器时间显示范围的修改:单击示波器的参数设置图标“
”,引出示波器参数设置窗;
在General卡片的Axes区的Time range栏中,填写5或auto;单击【OK】,完成设置。
图7.10 对显示屏的纵坐标范围进行设置
7.11 对示波器时间显示范围的设置
·仿真终止时间最简捷的修改方法:在exam070101模型窗“仿真终止时 间”栏“
”中的默认值10改变为5。
《计算机仿真及应用》实验教案
·显示曲线的光滑化设置:选中exam070101模型窗的下拉菜单项SimulationConfiguration Parameters,引出仿真参数配置窗,如图7.12所示;再在该窗左侧的选择栏中,选中Data Import/Export项,与之相应的参数设置栏便出现在窗口的右侧;把右半窗下方Save options 区中Refine factor栏中的默认值1改为5;单击OK,完成设置。
7.12 通过仿真参数配置窗设置输出光滑因子
《计算机仿真及应用》实验教案
完成以上修改后的模型窗如图7.13所示。再运行exam070101,可得比较满意的位移变化曲线(见图7.14所示)。顺便指出:模型运行后,在模块输出口的信号线上会出现double字样。这 表示该信号是采用“双精度”类型数据运算。如果用户不希望这类标识出现,那么应取消对下 拉菜单项FormatPort signal DisplaysPort Data Types的勾选。
图7.13
仿真参数调整运行后的exam070101模型
在模型窗中,x’’,x’,x等信号名称是模型创建者根据需要写入的。标识信号名称的操作方法 是:用鼠标双击信号附近的适当位置后,就会出现一个虚线框,该虚线框中允许输入任何 文字。
13、仿真结果显示
原本比较稀疏的解计算器数据,经设定的“光滑因子”下的插值,增加了用于描绘曲线的 数据点数,因此使示波器显示出更为光滑的曲线,如图7.14所示。
《计算机仿真及应用》实验教案
图7.14 适当地显示仿真所得的位移变化曲线
五、实验小结
第四篇:2021基于MATLAB Simulink的平面四连杆机构仿真
基于MATLAB
Simulink的平面四连杆机构仿真
基于MATLAB/Simulink的平面四连杆机构仿真
一、题目及自由度分析
如图1所示,该平面四杆机构中有三根运动的均质钢杆,其中有两根钢杆的一端与接地点连接,第三根杆就与这两根杆剩下的端点连接起来,两个接地点就可认为是第四杆,机构中相关尺寸如图2所示。
计算结构自由度,三个运动杆被限制到平面内运动,因此每个杆都有两个移动和一个转动,即在考虑约束之前,自由度为:
3×(2+1)=9
但是由于每个杆都受到约束,所以并不是每个自由度都是独立的。在二维状态下,刚体间的连接或者刚体与接地点的连接就会增加两个约束。这样就会使得刚体其中一端不能够作为独立的自由运动点,而是要受到邻近刚体的约束。该题中有四个刚体--刚体或刚体—接地点的连接,这就隐含8个约束。
那么最后的自由度为9-8=1.虽然有四个转动自由度,但是,其中三个都是非独立的,只要确定其中一个,就可确定其余三个。
二、模型建立及参数设置
1应用MATLAB/Simulink建立初始模型
2在初始模型的基础上添加Joint
Sensor模块
3依题意设置相关参数
⑴配置Ground模块
由图2可得系统的基本尺寸为:
①固定构件长86.7厘米
②Ground_1表示接地点,在World
CS坐标轴原点右边43.3cm处
③Ground_2表示接地点,在World
CS坐标轴原点左边43.4cm处
④最下端的铰处于X-Z平面内原点以上4cm
图5Ground_1模块参数设置图6Ground_2模块参数设置
4配置Joint模块
三个没有接地的联杆都是在X-Y平面内的,所以Revolute轴必须是Z轴。
⑴依次打开Revolute参数对话框,保持默认值,即Axis
of
rotation[x
y
z]默认设置为[001],Reference
csys都是WORLD。
图7Revolute坐标设置
⑵根据连接情况依次设置Revolute参数对话框中的Connection
parameters参数
图8Revolute模块参数对话框Connection
parameters参数
图9Revolute模块参数对话框Connection
parameters参数
图10Revolute模块参数对话框Connection
parameters参数
图11Revolute模块参数对话框Connection
parameters参数5配置Body模块
本题中Body模块(即Bar)定位方式不是直接相对于WORLD坐标系统,而是采用相对坐标形式,Bar1的CS1相对于Ground_1,Bar2的CS1相对于Bar1,以此类推。
以下为每个Body模块的详细参数设置,其中包括质量(Mass)、惯性矩(Inertia)、重心坐标原点、CS1坐标原点、CS2坐标原点和重心的方向。
图12Bar1的模块参数设置
图13Bar2的模块参数设置
图14Bar3的模块参数设置三、检测运动,运行模型
图15仿真结果动画显示
图16Revolute2和Revolute3的转角时程曲线
三、小结
目前较为主流的动力学仿真软件是Adams,但鉴于本人对该软件接触较少,且MATLAB也具有该功能,故本题采用Simulink中的SimMechanics工具箱对平面四杆机构进行建模仿真,并利用其可视化窗口进行系统运动可视化。
通过仿真结果可以看到,使用已有的计算机仿真软件包Matlab/Simulink来建立机构的仿真模型,仿真求解机构力学和运动参数,可以把用户从复杂烦琐的数学计算中解放出来,提高了求解速度,保证了求解精度。
第五篇:MATLAB与控制系统仿真实验报告
《MATLAB与控制系统仿真》
实验报告
2013-2014学年 第 1 学期
专业: 班级: 学号: 姓名:
实验三 MATLAB图形系统一、实验目的:
1.掌握绘制二维图形的常用函数。2.掌握绘制三维图形的常用函数。3.熟悉利用图形对象进行绘图操作的方法。4.掌握绘制图形的辅助操作。
二、实验原理:
1,二维数据曲线图
(1)绘制单根二维曲线 plot(x,y);(2)绘制多根二维曲线 plot(x,y)当x是向量,y是有一维与x同维的矩阵时,则绘制多根不同颜色的曲线。当x,y是同维矩阵时,则以x,y对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。(3)含有多个输入参数的plot函数 plot(x1,y1,x2,y2,…,xn,yn)(4)具有两个纵坐标标度的图形 plotyy(x1,y1,x2,y2)2,图形标注与坐标控制 1)title(图形名称); 2)xlabel(x轴说明)3)ylabel(y轴说明)4)text(x,y图形说明)5)legend(图例1,图例2,…)
6)axis([xmin xmax ymin ymax zmin zmax])3, 图形窗口的分割 subplot(m,n,p)4,三维曲线
plot3(x1,y1,z1,选项1,x2,y2,选项2,…,xn,yn,zn,选项n)5,三维曲面
mesh(x,y,z,c)与surf(x,y,z,c)。一般情况下,x,y,z是维数相同的矩阵。X,y是网格坐标矩阵,z是网格点上的高度矩阵,c用于指定在不同高度下的颜色范围。6,图像处理
1)imread和imwrite函数 这两个函数分别用于将图象文件读入matlab工作空间,以及将图象数据和色图数据一起写入一定格式的图象文件。
2)image和imagesc函数 这两个函数用于图象显示。为了保证图象的显示效果,一般还应使用colormap函数设置图象色图。
三、实验仪器和设备:
计算机一台(带有MATLAB6.5以上的软件环境)。
四、预习要求:
1.复习二维与三维图形的绘图函数。2.复习图形辅助操作。
五、实验内容及步骤:
1,设y[0.53sinx]cosx,在x=0~2π区间取101点,绘制函数曲线。21x
2,已知y1=x2,y2=cos(2x),y3=y1*y2,完成下列操作:
(1)在同一坐标系下用不同的颜色和线型绘制三条曲线;
(2)分别用条形图、阶梯图、杆图和填充图绘制三条曲线。
3,已知
x,x02e y1In(x1x2),x02在-5<=x<=5区间绘制函数曲线。
4,绘制函数的曲面图和等高线
zcosxcosyex2y24
其中x的21个值均匀分布在[-5,5]范围,y的31个值均匀分布在[0,10],要求使用subplot(2,1,1)和subplot(2,1,2)将产生的曲面图和登高图画在同一个窗口上。
5.画出函数
zx2y2sin(xy)的曲面及等高线图。
x2y21绘制平面曲线,并分析参数a对其形状的影响。6.根据2a25a2
四、心得体会:
通过这次实验我能熟练掌握二维和三维图以及其他特殊图形的制作,弄清楚了基本的图形操作规则,大大加深了我对matlab的兴趣。
实验二 MATLAB程序设计
一、实验目的
1.掌握利用if语句实现选择结构的方法。
2.掌握利用switch语句实现多分支选择结构的方法。3.掌握利用for语句实现循环结构的方法。4.掌握利用while语句实现循环结构的方法。
二、实验设备及条件
计算机一台(带有MATLAB6.5以上的软件环境)。
三、实验内容
1.编写求解方程ax2bxc0的根的函数(这个方程不一定为一元二次方程,因a、b、c的不同取值而定),这里应根据a、b、c的不同取值分别处理,有输入参数提示,当a0,b0,c~0时应提示“为恒不等式!”。并输入几组典型值加以检验。
clear,clc a=input('请输入一个数a=');b=input('请输入一个数b=');c=input('请输入一个数c=');m=b^2-4*a*c;if a==0
if b==0
'为恒不等式'
end end
m=b^2-4*a*c;if m>0
x1=(-b+sqrt(m))/(2*a)
x2=(-b-sqrt(m))/(2*a)elseif m==0
x=(-b)/(2*a)else
'不存在正实根' end
2.输入一个百分制成绩,要求输出成绩等级A+、A、B、C、D、E。其中100分为A+,90分~99分为A,80分~89分为B,70分~79分为C,60分~69分为D,60分以下为E。
要求:(1)用switch语句实现。
(2)输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。
clear,clc for k=1:10
a(k)={89+k};b(k)={79+k};
c(k)={69+k};d(k)={59+k};end A=cell(3,6);A(1,:)={'a','b','c','d','e','f'};A(2,:)={85,76,95,100,40,65};for k=1:6
switch A{2,k}
case 100
r='A+';
case a
r='A';
case b
r='B';
case c
r='C';
case d
r='D';
otherwise
r='E';
end
A(3,k)={r};end A A =
'a'
'b'
'c'
[85]
[76]
[95]
'B'
'C'
'A'
'd'
'e'
[100]
[40]
'A+'
'E'
'f' [65] 'D'
3.利用for循环语句编写计算n!的函数程序,取n分别为-89、0、3、5、10验证其正确性(输入n为负数时输出出错信息)。
clear,clc n=input('请输入一个正数n=');if n<0
'输入错误' elseif n==0
'n!=0' elseif n==1
'n!=1' else
y=1;
for i=1:1:n
y=y*i;
i=i+1;
end
y end 请输入一个正数n=-89
ans =输入错误 请输入一个正数n=0
ans =n!=0 请输入一个正数n=1
ans =n!=1 请输入一个正数n=3
y =6 请输入一个正数n=10
y =3628800
四、实验心得体会:
通过本次实验课,我能熟练运用for循环语句,switch条件语句以及if条件语句的新用法,和在C中的区别。尽管如此,但是在实验中依然容易把for循环跟C语言中的for语句弄混,最后经过不懈努力下,终于弄明白了两者之间的差别,使我能更好的运用这些指令语句。