第一篇:电子信息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 课程编号:216317 课程名称:MATLAB及系统仿真 学分:2学分 总 学 时:32学时其中授课学时:20学时上机学时:12学时 先修课程:C语言、线性代数、信号与系统、通信原理 开课部门:计算机与通信学院 课程内容: 本课程要求学生掌握:MATLAB基本语句结构,矩阵的基本运算,控制语句,M文件和M函数的编写与调用,绘图功能,数学函数库的调用,SIMULINK仿真。通过本课程的学习,学生应能够在MATLAB环境下解决常见的数学问题和工程问题,并且能利用MATLAB软件对通信系统里的各种调制和解调过程进行仿真分析。 选课对象:通信工程,计算机科学与技术、电子信息技术 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与控制系统仿真》 实验报告 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语句弄混,最后经过不懈努力下,终于弄明白了两者之间的差别,使我能更好的运用这些指令语句。 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及系统仿真》2010年课程简介
第三篇:Matlab与Simulink系统仿真学习心得 马楠
第四篇:MATLAB与控制系统仿真实验报告
第五篇:Matlab与Simulink仿真学习心得