《MATLAB/Simulink系统仿真超级学习手册》——2.7 MATLAB编程实例

本节书摘来自异步社区《MATLAB/Simulink系统仿真超级学习手册》一书中的第2章,第2.7节,作者:MATLAB技术联盟 , 石良臣著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.7 MATLAB编程实例

MATLAB/Simulink系统仿真超级学习手册
MATLAB强大的运算功能和图形功能,是实现各领域的编程仿真的有力工具。本节将综合本章所讲的内容介绍MATLAB的一些编程实例,使读者对MATLAB语言的应用有一些基本的了解。

2.7.1 汉诺塔问题
Hanoi(汉诺)塔问题,是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有n个盘子,盘子大小不等,大的在上,小的在下如图2-35所示。
screenshot

现在,要将这n个盘子从A座移到C座,但每次只允许移动一个盘子,且在移动过程中在3个座上都保持大盘在下,小盘在上。在移动过程中可以利用B座。

显然,读者是不大可能直接写出移动盘子的每一个具体步骤的,这里给出该问题的递归解法:

(1)将A上n-1个盘子借助C座先移动到B座上;

(2)把A座上剩下的一个盘子移动到C座上;

(3)将n-1个盘子从B座借助于A座移动到C座上。

上面第(1)步和第(3)步,都是把n-1个盘子从一个座移到另一个座上,采取的办法是一样的,只是座的名字不同而已。

为使之一般化,可以将第(1)步和第(3)步表示为:将“one”座上n-1个盘子移动到“two”座(借助“three”座)。只是在第(1)步和第(3)步中,one、two、three和A、B、C的对应关系不同。

对于第(1)步,对应关系是,one对应A,two对应B,three对应C。对于第(3)步,对应关系是,one对应B,two对应C,three对应A。

因此,可以把上面3个步骤分成两类操作:

(1)将n-1个盘子从一个座移动到另一个座上(n>1);

(2)将1个盘子从一个座上移动到另一个座上。

分别用两个函数实现上面的两类操作,用hanoi函数实现上面第一类操作,用move函数实现上面第二类操作。

函数调用hanoi(n,one,two,three)表示将n个盘子从“one”座移动到“three”座的过程(借助“two”座),函数调用move(x,y)表示将1个盘子从x座移动到y座的过程。x和y是代表A、B、C座之一,根据每次不同情况分别取A、B、C代入。

编写函数文件,输入下面的语句,保存为epHanoi.m。

function epHanoi
% 汉诺塔递归算法
% n是需要移动的盘子个数
% 最后打印出全部移动步骤
n=input('请输入盘子个数:');
disp(['移动',num2str(n),'个盘子的步骤为:'])
(n,'A','B','C')
function (n,one,two,three)
if n==1
  move(one,three);
else
  hanoi(n-1,one,three,two);
  move(one,three);
  hanoi(n-1,two,one,three);
end
function move(x,y)
disp([x,'->',y])

在MATLAB命令窗口输入epHanoi命令,调用函数epHanoi,程序会先提示“请输入盘子个数:”,读者可以任意输入一个整数(如3),按回车键确认后,出现下面的结果。

>> epHanoi
请输入盘子个数:3
移动3个盘子的步骤为:
A->C
A->B
C->B
A->C
B->A
B->C
A->C

在这个例子中move函数并未真正移动盘子,而只是输出了移动盘子的方案。

注意:

(1)函数文件可以没有输入,也可以没有输出;

(2)从这个例子可以看出,MATLAB支持递归运算;

(3)函数文件epHanoi.m的代码中,出现了三个function,第一个为主函数,后两个为子函数,外部函数无法访问这两个子函数,除非将其定义为global全局的。一个函数下的子函数可以互相调用。

MATLAB在自动控制中的应用
【例2-28】已知单位负反馈系统的开环传递函数为

screenshot

画出K=0~∞时的闭环系统根轨迹,并求出临界时的K值及闭环极点。

函数rlocus可以计算单输入单输出开环系统根的位置,进而给出其单位负反馈系统的闭环根轨迹,其基本调用格式为:

rlocus(sys)

其中,sys表示开环系统,一般用函数tf(num,den)来创建。num、den分别表示传递函数的分子、分母,用对应多项式的系数构成的向量表示。

编写脚本文件,输入下面的语句,保存为ep2_28.m。

d1=[0.05 1];
d2=[0.05 0.2 1];
den1=conv(d1,d2);
den=[den1 0];
num=1;
sys=tf(num,den);
rlocus(sys)
rlocfind(sys)

运行脚本文件ep2_28.m。程序执行到rlocus(sys)时,将出现如图2-36所示的根轨迹图。

screenshot

注意:conv(d1,d2)是求向量d1和向量d2的卷积。

为了计算K临界值和此时的闭环极点,在根轨迹绘制完成(执行函数rlocus)后,再执行rlocfind命令。

程序执行rlocfind(sys)语句后,图形窗口Figure 1上将产生一个跟随鼠标移动的十字形指针,选中轨迹与虚轴的焦点位置单击鼠标左键,MATLAB命令窗口中就会显示出闭环根以及参数K的值。例2-28中,所求临界值K=3.49。

函数roots可以用于求多项式的根,在MATLAB命令窗口输入roots([den1,3.49]),求得闭环极点为s1=-19.7878、s2=-4.2244、s3=0.0061+4.0866j和s4=0.0061-4.0866j。

MATLAB在电力信号分析处理中的应用
【例2-29】利用函数生成一组数据用以模拟电力现场测量数据,并利用MATLAB编程实现其频谱分析。其中

screenshot

在信号x中加入随机信号,用以模拟信号噪声。

编写脚本文件,输入下面的语句,保存为ep2_29.m。

clear
fs=500;t=0:1/fs:0.2;
f1=50;f2=200;
x=2*sin(2*pi*f1*t)+cos(2*pi*f2*t);
subplot(4,1,1);plot(x)
title('f1(50Hz)\f2(200Hz)的正弦信号,初相0')
xlabel('序列(n)')
grid on
number=512;
y=fft(x,number);
n=0:length(y)-1;
f=fs*n/length(y);
subplot(4,1,2);plot(f,abs(y))
title('f1\f2的正弦信号的FFT(512点)')
xlabel('频率Hz')
grid on
x=x+randn(1,length(x));
subplot(4,1,3);plot(x)
title('f1\f2的正弦信号(含随机噪声)')
xlabel('序列(n)')
grid on
y=fft(x,number);
n=0:length(y)-1;
f=fs*n/length(y);
subplot(4,1,4);plot(f,abs(y))
title('f1\f2的正弦信号(含随机噪声)的FFT(512点)')
xlabel('频率Hz')
grid on

运行脚本文件ep2_29.m,运行结果如图2-37所示。

screenshot

注意:

(1)在脚本文件开头处加入clear命令,是为了清除之前存留在工作空间中的变量和数据,避免与之后新定义或要使用的变量发生混乱;

(2)函数randn可以产生一个服从标准分布的随机矩阵。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Matlab/Simulink系统是当今工程和科研领域最普遍使用的仿真工具,因为它提供了广泛的工具箱和应用程序接口,使得工程师和研究人员可以快速建立复杂的模型和应用程序。超级学习手册是一本Matlab/Simulink系统仿真的指南,它旨在向读者提供Matlab/Simulink系统仿真的完整概念和实践。 这本超级学习手册包括了Matlab/Simulink系统Matlab/Simulink应用程序接口的所有基础知识。手册开始介绍了Matlab编程环境和Simulink的基本概念,然后涵盖了各种Matlab工具箱,例如信号处理工具箱、优化工具箱和控制系统工具箱。此外,手册还涵盖了使用Matlab/Simulink系统进行数据可视化和分析的方法以及Matlab/Simulink与其它软件和硬件工具集成的方法。 手册的最后一部分重点介绍了Matlab/Simulink系统仿真的实践应用。这部分包括了各种应用程序,例如机器学习、无人驾驶汽车控制、机器人控制和嵌入式系统设计等。 总之,Matlab/Simulink系统仿真超级学习手册是一本理解和应用Matlab/Simulink系统仿真的优质指南。它不仅适用于工程师和研究人员,还适用于任何对Matlab/Simulink系统仿真有兴趣的人。 ### 回答2: Matlab/Simulink是一套广泛应用于工程科学领域的软件,其主要用途是进行建模、仿真和分析。与传统的编程语言不同,Matlab/Simulink实现了可视化建模,使得用户能够通过拖拽模块来设计系统及其输入输出。 Matlab/Simulink仿真能力也十分强大,用户能够在仿真过程中进行各种实验,如调整参数、检查系统的动态响应、预测系统的行为等等。Matlab/Simulink还提供了丰富的分析和数据处理工具,如曲线拟合,频谱分析等等。 对于初学者来说,Matlab/Simulink系统仿真超级学习手册是一个非常有用的资源。该手册包含了大量的教程、示例和提示,帮助用户快速掌握工具的使用和基本概念。对于有经验的用户来说,该手册也是一个不错的参考资料,可以帮助他们进一步深入了解系统建模和仿真。 总而言之,Matlab/Simulink系统仿真超级学习手册是一个非常实用的资源,它可以帮助用户理解和应用Matlab/Simulink系统,并且深入了解系统仿真的原理和方法。这种深度认识可以使工程师和科学家更好地设计和开发系统,并更好地解决实际的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值