第一篇: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仿真学习心得
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交互式仿真》
《计算机仿真及应用》实验教案
实验六 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 适当地显示仿真所得的位移变化曲线
五、实验小结
第四篇:电子信息MATLAB系统仿真与设计
电子信息系统仿真与设计
课程设计报告
设计课题: 油价变化系统的模型 姓 名:
学 院: 机电与信息工程学院
专 业: 电子信息科学与技术
班 级: 09级 2班
学 号: 日 期 2010-2011第三学期
指导教师: 李光明 张军蕊
山东大学威海分校信息工程学院 建模:
1背景
设某一星期的油价为p,其中n表示年份,它与上一星期的油价、油价升值速率以及新增资源所能满足的个体数目之间的动力学方程由如下的差分方程所描述:
从此差分方程中可以看出,此油价变化系统为一非线性离散系统。如果设油价初始值、油价升值速率、新增资源所能满足的个体数目,要求建立此油价动态变化系统的系统模型,并分析油价在未来100个星期内之间的变化趋势。2 建立油价变化系统的模型
(1)Discrete模块库Unit Delay模块:其主要功能是将输入信号延迟一个采样时间,它是离散系统的差分方程描述以及离散系统仿真的基础。在仿真时只要设置延迟模块的初始值便可计算系统输出。
(2)Discrete模块库Zero-Order Hold模块:其主要功能是对信号进行零阶保持。使用Simulink对离散系统进行仿真时,单位延迟是Discrete模块库中的Unit Delay模块来完成的。对于油价变化系统模型而言,需要将作为Unit Delay模块的输入以得到,然后按照系统的差分方程来建立人口变化系统的模型。
1.05ProductGainScope1zUnit DelayGain1-K-1Constant 系统参数设置
系统模型建立之后,首先需要按照系统的要求设置各个模块的参数,如下所述:(1)增益模块Gain表示油价升值速率,故取值为1.05。
(2)模块Gain1表示新增资源所能满足的个体数目,故取值为1000000。(3)油价初始值设为10$/L(4)Unit Delay模块参数设置。
(5)仿真时间设置:按照系统仿真的要求,设置系统仿真时间范围为0~100。(6)离散求解器与仿真步长设置:对离散系统进行仿真需要使用离散求解器。
实验总结及心得体会 MATLAB是一件很强大的工具,在模拟仿真方面有着不可比拟的优势。不仅可以通过语言脚本可以帮助我们解决很多问题,而且simulink也是十分强大的。通过十分直观的方式直接按放各模块,很明显地显示出各种逻辑关系,方便快捷,思路清晰。在实际应用中。Simulink起到了重要作用。通过对simulink的学习,我发现我们所学的课本知识是很重要的,只要通过理解变通,就很容易解决实际问题。但是,有个前提就是你要有着扎实的理论知识。所以,我们千万不能忽略了课本知识的重要性,不要浮躁,理解透彻。Simulink对我来说是很陌生的一个东西,通过几天的摸索,我渐渐摸到了他的奇妙之处,其实不如我们想象那么难,只要没仔细分析好,它会是我们工作学习的一个强力助手。当然,由于时间短暂,我还需要更多时间的学习,才能彻底掌握这个仿真软件。
附录
1.利用simulink仿真来实现摄氏温度到华氏温度的转换 Tf9Tc32 5
yxy2.设系统微分方程为,试建立系统模型并仿真
y(1)2
3.利用simulink仿真x(t)
11(costcos3tcos5t),取A=1, 2 29258A
-K-ClockGain3cosTrigonometricFunctioncosTrigonometricFunction21/9GainSum ofElements-K-Gain1-K-Gain2Scope-K-Clock1Gain4-K-Clock2Gain5cosTrigonometricFunction1
4.建立如图1所示的仿真模型并进行仿真,改变增益,观察x-y图形变化,并用浮动的scope模块观测各点波形。
1sSine WaveIntegratorXY Graph1SliderGainFloatingScope 图1.题目4
改变增益:
继续增大增益:
5. 有初始状态为0的二阶微分方程x0.5x0.4x2u(t)其中u(t)是单位阶跃函数,试建立系统模型并仿真。
6. 通过构造SIMULINK模型求ycos(t)dt的结果,其中初值分别为y1(0)=0, y2(0)=1
当y1(0)=0时:
当 y1(0)=1时:
7.分析二阶动态电路的零输入响应
图2为典型的二阶动态电路,其零输入响应有过阻尼、临界阻尼和欠阻尼三种情况,已知L=0.5H, C=0.02F, R=1, 2, 3, …, 13, 初始值uc(0)1V,iL(0)0求uc(t)和iL(t)的零输入响应并画出波形。(1用simulink的方法,2用脚本文件的方法)
LRC 图2 题目5 二阶动态电路
(1)用simulink的方法
1sIntegrator50Gain21sIntegrator1Scope-u-K-Gain3AddUnary Minus2Gain1Scope1
(2)用脚本文件的方法 定义函数文件funcforex123.m
function xdot=funcforex123(t,x,flag,R,L,C)xdot=zeros(2,1);
xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);xdot(2)=1/C*x(1);function in=f(t)in=0;脚本文件:
L=0.5;C=0.02;
for R=[1 2 3 4 5 6 7 8 9 10 11 12 13]
[t,x]=ode45('funcforex123',[0 7],[0;1],[],R,L,C);figure(1);plot(t,x(:,1));hold on;
xlabel('timesec');
text(0.9,0.07,'leftarrowi-L(t)');grid;figure(2);plot(t,x(:,2));hold on;
xlabel('timesec');
text(0.5,0.3,'leftarrowu-C(t)');grid;end
电压图:
10.80.60.4leftarrowu-C(t)0.20-0.2-0.4-0.6-0.801234timesec567
电流图:
0.150.1leftarrowi-L(t)0.050-0.05-0.1-0.15-0.201323timesec345673
8.一池中有水2000m,含盐 2 kg,以 6m/ 分 的速率向池中注入浓度为 0.5 kg / m 的3m盐水,又以 4 / 分的速率从池中流出混合后的盐水,问欲使池中盐水浓度达到 0.2 kg / m3,需要多长时间?(1用simlink的方法,2用脚本文件的方法)【附加:试画出浓度vs时间的曲线】
2Constant3ClockGain1-K-Gain2Gain34Gain2ProductAdd1sIntegratorScope
9.任意选择一个待仿真的实际问题,建立模型并分析仿真结果,或者MATLAB Simulink demo里面一个模块进行分析
10.利用Simulink画出以下微分方程组的框图:
dx/dt=-x^2+y,dy/dt=-x-x*y;x(0)=0,y(0)=0 运行结果要求传到工作空间中,并画出相位图(横坐标为x,纵坐标为y)。
11.搭建特定的信号源,建立SIMULINK仿真模型、显示仿真结果。
ClockProduct>=Clock1RelationalOperator0ConstantSwitch 基于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来建立机构的仿真模型,仿真求解机构力学和运动参数,可以把用户从复杂烦琐的数学计算中解放出来,提高了求解速度,保证了求解精度。第五篇:2021基于MATLAB Simulink的平面四连杆机构仿真