You are on page 1of 167

MATLAB基础及工程应用

卜王辉
机械与能源工程学院
MATLAB的历史与发展
MATLAB是matrix和laboratory两个词的组合,意
为矩阵实验室
1977年,美国新墨西哥大学计算机科学系主任
Cleve Moler为了减轻学生编程的负担,用
FORTRAN编写了最早的MATLAB

2012年10月18日下
午,Cleve Moler
在同济大学嘉定校
区报告
MATLAB的历史与发展
1984年合作成立了MathWorks公司,把MATLAB
推向市场(内核采用C语言编写)
为科学研究、工程设计的众多科学领域提供了较好
的解决方案(科学计算、可视化、专业工具箱)
成为国际控制界的标准计算软件

1965 1997
MATLAB的历史与发展
版本 建造编号 发布时间
MATLAB
MATLAB 1.0 1984
MATLAB 2 1986 Simulink
MATLAB 3 1987
Stateflow
MATLAB 3.5 1990
MATLAB 4 1992 Statistics Toolbox
MATLAB 4.2c R7 1994
Curve Fitting Toolbox
MATLAB 5.0 R8 1996
MATLAB 5.1 R9 1997 Symbolic Math Toolbox
MATLAB 5.1.1 R9.1 1997
Control System Toolbox
MATLAB 5.2 R10 1998
MATLAB 5.2.1 R10.1 1998 Optimization Toolbox
MATLAB 5.3 R11 1999
Signal Processing Toolbox
MATLAB 5.3.1 R11.1 1999
MATLAB 6.0 R12 2000 DSP System Toolbox
MATLAB 6.1 R12.1 2001
Image Processing Toolbox
MATLAB 6.5 R13 2002
MATLAB 6.5.1 R13SP1 2003 Data Acquisition Toolbox
MATLAB 6.5.2 R13SP2 2003
MATLAB 7 R14 2004 Instrument Control Toolbox
MATLAB 7.1 R14SP3 2005 Bioinformatics Toolbox
MATLAB 7.2 R2006a 2006
MATLAB 7.3 R2006b 2006 SimMechanics
MATLAB 7.14 R2012a 2012.3.1 Simscape
MATLAB 8.0
MATLAB 8.1
R2012b
R2013a
2012.9.11
2013.3.7 机械学院购买的
MATLAB版本 MATLAB工具箱
MATLAB能做什么?

2012年10月18日下午,MATLAB创始人Cleve Moler教授
在同济大学嘉定校区报告
课程内容
本课程涉及到MATLAB基础知识以及在工程实践中
的应用,是一门综合性课程。将计算机编程技术与
工程实践结合,培养运用现代化的技术工具来分析
和设计工程项目的能力,提高综合运用多种学科知
识的实践能力。

机构动力学分析 控制 信号图像处理

编程基础 数值和符号计算
课程内容
课程内容

C
θA θC
A
课程内容
课程内容
琴诗
苏轼(宋)

若言琴上有琴声,放在匣中何不鸣?
若言声在指头上,何不于君指上听?
参考资料
MATLAB帮助文档
图书馆中MATLAB书籍

《MATLAB基础与机械工程
应用》
科学出版社,2015年6月
参考资料
平时课堂和课后练习,期末大作业
上课请带笔记本电脑,安装MATLAB 2014a

提交作业:2000bu@tongji.edu.cn
课件下载:同济邮箱网络硬盘更多查看站内
用户共享请输入要查看的用户名:2000bu
参考资料
正版MATLAB激活码获取:

Email:MatlabLecture@163.com

1、学生姓名和学号
2、计算机网卡物理地址(ipconfig /all)
3、MATLAB版本号(例如 2014a)
4、操作系统类型(WINDOWS、LINUX、MAC)
MATLAB编程基础
编程环境
窗口的布置、当前文件夹的设置
工作空间
命令历史
MATLAB编程基础
变量类型、变量名
保留字(ans、clc、clear、i、j、rand、if等等)

>> clear
>> a=(1+sqrt(5))/2
>> a=3+4i
>> a=abs(3+4i)
>> a=a^2
>> b='Hello World'

分号的作用
MATLAB编程基础
数组(Array)、矩阵(Matrix)、向量(Vector)

>> A=[1,2,3,4,5,6]
>> A=[1;2;3;4;5;6]
>> A=2:2:10
>> A = rand(8,1)
>> A=[1 2 3; 4 5 6]
>> A=rand(3,5)

>> a=A(2,2)
>> B=A(1,:)
>> C=A(:,2)
>> D=A(:,[1 3])
MATLAB编程基础
数组(Array)、矩阵(Matrix)、向量(Vector)

>> A(3,3)=6
>> A(:,1)=8

>> A=[1 2;3 4]


>> a=2
>> A+a
>> A-a
>> a*A
>> A/a
MATLAB编程基础
数组(Array)、矩阵(Matrix)、向量(Vector)

>> clear
>> clc
>> A=[1 2;4 6]
>> B=[1 2;3 4]
>> A+B
>> A-B
>> A.*B
>> A./B
>> A.\B
MATLAB编程基础
数组(Array)、矩阵(Matrix)、向量(Vector)

>> clear
>> A=[1 2;4 6]
>> B=[1 2;3 4]
>> A*B
>> A/B
>> A\B

>> A.^2
>> A^2
MATLAB编程基础
数组(Array)、矩阵(Matrix)、向量(Vector)

>> A1=[1 2;3 4];


>> A2=[1 2;3 6];
>> A3=[1 2;3 4;5 6];
>> inv1=inv(A1)
>> inv2=inv(A2)
>> inv3=inv(A3)
>> tA1=A1’
>> tA2=A2’
>> tA3=A3’
MATLAB编程基础
脚本 .m 文件
脚本的命名和运行
脚本的注释

分支语句:if elseif else switch case otherwise


循环语句:for while break
以randi为例
MATLAB编程基础
for k=1:1:10 k=1;
p=randi(100) while k<=10
if p<34 p=randi(100)
s='small' if p<34
elseif p>66 s='small'
s='large' elseif p>66
else s='large'
s='medium' else
end s='medium'
end
if k>5 & p>66
k if k>5 & p>66
break k
end break
end end
k=k+1;
end
MATLAB绘图
向量、绘图
[X,Y] = meshgrid(-2:.2:2);
x = 0:pi/100:2*pi; Z = X .* exp(-X.^2 - Y.^2);
y = sin(x);
plot(x,y)
subplot(2,1,1)
xlabel('x')
surf(X,Y,Z)
ylabel('sin(x)')
subplot(2,1,2)
title('Plot of the Sine Function')
mesh(X,Y,Z)
plot(x,y,'r--')

x = 0:pi/100:2*pi; t=0:pi/50:10*pi;
y = sin(x); st=sin(t);
plot(x,y) ct=cos(t);
figure
hold on plot3(st,ct,t)

y2 = cos(x);
plot(x,y2,'r:') axis equal
legend('sin','cos')
MATLAB绘图
用正弦信号合成方波信号
信号可以在时间域中描述,也可以在频率域中描述。将信号的时域描述通过数学
处理变换为频域描述的过程称为信号的频谱分析。频谱包括幅值谱、相位谱、功
率谱、幅值谱密度、功率谱密度等。
根据傅里叶级数原理,任何周期信号都可以分解为一系列正弦信号的叠加。例如
时域方波信号f(t)可以表达为:

4A 1
f (t )  
 n1 2n  1
sin  2n  1 t

其中ω是方波频率,A是方波幅值,n是谐
波阶次。通过叠加正弦信号来合成波形时,
所包含的谐波分量越多,合成波形越接近
于理想波形。但在间断点附近,即使合成
波形包含无穷多谐波分量,合成波形仍会
与理想波形有偏差,这称为吉布斯现象
(Gibbs现象),如图10.1所示的方波信号
在间断点处存在吉布斯现象。吉布斯现象
是由于傅里叶级数展开式在间断点临域不
能均匀收敛。
MATLAB绘图
用正弦信号合成方波信号
以下MATLAB脚本程序采用正弦信号的叠加来合成频率2Hz、幅值为5的方波:
t = 0:0.0001:1; %方波时域长度1秒
w = 2*pi*2; %方波频率2Hz
A = 5; %方波幅值为5
subplot(2,1,1);
for n = 1:5 %采用5组正弦波形
plot(t, 4*A/pi*1/(2*n-1)*sin((2*n-1)*w*t));
hold on;
end
title('5组正弦信号');
subplot(2,1,2);
sum = 0;
for n = 1:5
sum = sum + 4*A/pi*1/(2*n-1)*sin((2*n-1)*w*t);
end
plot(t, sum);
title('合成的方波信号');
MATLAB编程基础
函数 .m 文件
函数的命名和输入输出参数
函数的调用
注释,help

function K=temperature(F)
%华氏温度和开尔文温度的转换
K=(5/9)*(F-32)+273.15;
end

>> K=temperature(100)
MATLAB编程基础
function myDrawing function DrawStar(x0, y0, size, color)
figure x1 = x0;
hold on y1 = y0 + size;
axis equal x2 = x0 + size * cos(2/5 * 2*pi + pi/2);
DrawStar(10,10,5,'b'); y2 = y0 + size * sin(2/5 * 2*pi + pi/2);
DrawStar(23,10,5,'b'); x3 = x0 + size * cos(-1/5 * 2*pi + pi/2);
DrawStar(40,10,10,'r'); y3 = y0 + size * sin(-1/5 * 2*pi + pi/2);
DrawStar(58,10,5,'b'); x4 = x0 + size * cos(1/5 * 2*pi + pi/2);
y4 = y0 + size * sin(1/5 * 2*pi + pi/2);
DrawStar(70,10,5,'b');
x5 = x0 + size * cos(-2/5 * 2*pi + pi/2);
end
y5 = y0 + size * sin(-2/5 * 2*pi + pi/2);
plot([x1,x2,x3,x4,x5,x1],[y1,y2,y3,y4,y5,y1],color)
end

figure
theta=[0.5*pi:0.8*pi:4.5*pi];
r=ones(1,6);
polar(theta,r,'r')
MATLAB编程基础
function [Mc,msg]=MyMultiply(Ma,Mb,flag)
function y = func(x) [MaRow,MaCol]=size(Ma);
if x<-10 | x>10 [MbRow,MbCol]=size(Mb);
y=x; if MaCol~=MbRow
msg='Cannot Be Multiplied';
elseif x>=-10 & x<0 Mc=-1;
y=2*x-1; else
elseif x==0 msg='OK';
switch flag
y=0; case 1
elseif x~=1
y=sin(x); case 2
else case 3
y=1;
end otherwise
end
end
练习作业:实现两矩阵相乘的三种方法(三重循环、两重循
环、直接计算)【.m文件名修改为A+学号】
MATLAB符号计算
使用syms命令创建符号对象
syms var1 var2 … varN % 创建了var1、var2、……varN共N个符号变量
>> clear
>> syms x y % 定义符号变量,注意变量之间是空格,不能是逗号
>> a = x + y % 变量a也将成为符号变量

用syms命令创建符号函数的语法格式如下:
syms f(arg1, arg2, …, argN)
% 创建符号函数f,输入参数arg1, …, argN也是符号变量
例如,以下语句将创建符号函数f(x, y),并实例化,进而代入数值:
>> clear
>> syms f(x, y) % 定义符号函数
>> f(x, y) = x + 2*y; % 实例化
>> f(1, 2) % 输出结果5
以上这组语句等价于以下这组语句:
>> clear
>> syms x, y % 定义符号变量
>> f(x, y) = x + 2*y; % 实例化
>> f(1, 2) % 输出结果5
MATLAB符号计算
使用syms命令创建符号对象
以下语句将创建符号矩阵,进而代入数值:
>> clear
>> syms x
>> f(x) = [x, x^2; x^3, x^4];
>> f(2) % 输出结果[2, 4; 8, 16]

使用sym命令创建符号数字
var = sym(‘Num’) % 创建了符号数字var,其数值为Num
例如,以下语句将创建符号数字2,并计算其平方根:
>> clear
>> a = sym(2); % 也可以写作a = sym(‘2’)
>> sqrt(a) % 输出结果2^(1/2),而不是数值计算结果1.4142

以下语句将生成符号表达式,而不只是一个数字:
>> clear
>> phi = sym(‘1 + sqrt(5)’);
>> f = phi^2 - phi -1; % 返回值为(5^(1/2) + 1)^2 - 5^(1/2) - 2,而不是6.2361
MATLAB符号计算
化简符号表达式
MATLAB提供了用simplify命令化简符号表达式的方法,例如:
>> clear
>> phi = sym(‘(1 + sqrt(5)) / 2’);
>> f = phi^2 - phi -1 % f为(5^(1/2)/2 + 1/2)^2 - 5^(1/2)/2 - 3/2
>> simplify(f) % 返回值为0

MATLAB提供了用expand命令展开符号表达式的方法,例如:
>> clear
>> syms x
>> f = (x^2 -1)*(x^4 + x^3 + x^2 + x +1)*(x^4 – x^3 + x^2 – x +1);
>> expand(f) % 返回值为x^10-1

MATLAB提供了用factor命令进行符号表达式因式分解的方法,例如:
>> clear
>> syms x
>> g = x^3 +6*x^2 + 11*x + 6;
>> factor(g) % 返回值为(x + 3)*(x + 2)*(x + 1)
MATLAB符号计算
符号表达式的变量替代
MATLAB提供了用subs命令单变量符号表达式变量替代的方法,例如:
>> clear
>> syms x
>> f = 2*x^2 - 3*x + 1;
>> subs(f, 1/3) % 返回值为2/9,注意符号替代之后f并没有改变

MATLAB提供了用subs命令多变量符号表达式变量替代的方法,例如:
>> clear
>> syms x y
>> f = x^2*y + 5*x*sqrt(y);
>> subs(f, x, 3) % 将变量x用3替换,返回值为9*y + 15*y^(1/2)
>> subs(f, y, x) % 将变量y用x替换,返回值为x^3 + 5*x*(3/2)
>> subs(f, {x, y}, {3, 2}) % 将x用3替换,y用2替换,返回值为15*2^(1/2) + 18
MATLAB符号计算
符号表达式的变量替代
MATLAB提供了将矩阵代入符号表达式的方法,这相当于将矩阵的每个元素分别
代入符号表达式,从而形成一个新的矩阵,例如:
>> clear
>> syms x
>> f = x^3 - 15*x^2 - 24*x + 350;
>> A = [1 2 3; 4 5 6];
>> subs(f, A) % 返回值为[312, 250, 170; 78, -20, -118]

MATLAB提供了替代符号矩阵中元素的方法,例如:
>> clear
>> syms a b c s t
>> A = [a b c; c a b; b c a];
>> A(2, 1) = t % 返回值为[a b c; t a b; b c a],修改了矩阵A的元素
>> B = subs(A, b, s) % 返回值为[a s c; t a s; s c a],矩阵A的元素没有变化
MATLAB符号计算
符号表达式的微积分
MATLAB提供了用diff命令进行一元函数微分的方法,例如:
>> clear
>> syms x
>> f = sin(x)^2;
>> diff(f) % 返回值为2*cos(x)*sin(x)
MATLAB提供了用diff命令进行多元函数偏微分的方法,例如:
>> clear
>> syms x y
>> f = sin(x)^2 + cos(y)^2;
>> diff(f, y) % 对y求1阶偏微分,返回值为-2*cos(y)*sin(y)
以下语句将计算函数f(x, y)对变量y的2阶偏导数并赋值,并计算f的混合偏导数:
>> clear
>> syms x y
>> f(x, y) = x^3*y^3;
>> d2fy = diff(f, y, 2) % 2阶偏导数为6*x^3*y
>> syms a
>> d2fy(a + 1, a) % 返回值为6*a*(a+1)^3
>> dfxy = diff(diff(f, y), x) % 混合偏导数,返回值为9*x^2*y^2
MATLAB符号计算
符号表达式的微积分
MATLAB提供了用int命令进行一元函数不定积分的方法,例如:
>> clear
>> syms x
>> f = sin(x)^2;
>> int(f) % 返回值为x/2 – sin(2*x)/4

MATLAB提供了用int命令进行多元函数不定积分的方法,例如:
>> clear
>> syms x y n
>> f = x^n + y^n;
>> int(f, y) % 返回值为x^n*y + (y*y^n)/(n+1)
>> int(f, n) % 返回值为x^n/log(x) + y^n/log(y)

MATLAB提供了用int命令进行一元函数定积分的方法,例如:
>> clear
>> syms x
>> int(2*x, 0, 1) % 返回值为1
>> int(2*x, [0, 1]) % 返回值为1
MATLAB符号计算
求解符号方程
MATLAB提供了用solve命令来求解一元代数方程的方法,例如:
>> clear
>> syms x
>> solve(x^2-1) % 返回值为1和-1
>> solve(x^2 + 4*x +1 == 0) % 返回值为3^(1/2) – 2和-3^(1/2) – 2
>> solve(x^2 == 2*x - 4) % 返回值为3^(1/2)*i + 1和1 - 3^(1/2)*i
>> syms a b c
>> solve(a*x + b*x == c, x) % 返回值为c/(a + b)
>> solve(a*x + b*x == c, a) % 返回值为(c - b*x)/x

MATLAB提供了用solve命令来求解多元代数方程组的方法,例如:
>> clear
>> syms x y
>> [a, b] = solve(x + y ==1, x - 11*y == 5) % 返回值为a=4/3,b=-1/3
>> syms x y
>> [a, b] = solve(x + y ==1, x - 11*y == 5, y, x) % 返回值为a=-1/3,b=4/3
MATLAB符号计算
求解符号方程
MATLAB提供了用dsolve命令来求解一元微分方程的方法,例如:
>> clear
>> syms a x(t)
>> dsolve(diff(x) == -a*x) % 返回值为C5*exp(-a*t)
>> syms f(t)
>> dsolve(diff(f) == f + sin(t)) % 返回值为C7*exp(t) - sin(t)/2 - cos(t)/2

以下微分方程有初始条件y(0)==b:
>> clear
>> syms a b y(t)
>> dsolve(diff(y) == a*y, y(0)==b) % 返回值为b*exp(a*t)

以下2阶微分方程有初始条件y(0)==1和边界条件Dy(pi/a)==0:
>> clear
>> syms a y(t)
>> Dy = diff(y);
>> dsolve(diff(y, 2) == -a*y, y(0)==1, Dy(pi/a)==0)
上式返回值为exp(-a*t*i)/2 + exp(a*t*i)/2,其中i表示虚数。
MATLAB符号计算
求解符号方程
MATLAB提供了用dsolve命令来求解二元常微分方程的方法,例如:
>> clear
>> syms x(t) y(t)
>> [x, y] = dsolve(diff(x) == y, diff(y) == -x)
上式返回值为x=C19*cos(t) + C18*sin(t),y=C18*cos(t) - C19*sin(t)。
MATLAB符号计算
符号表达式绘图
MATLAB提供了用ezplot命令来绘制显函数的符号表达式曲线的方法,例如:
>> clear
>> syms x
>> ezplot(x^3 - 6*x^2 + 11*x -6)
>> grid on % 显示网格
MATLAB符号计算
符号表达式绘图
MATLAB提供了用ezplot命令来绘制隐函数的符号表达式曲线的方法,例如:
>> clear
>> syms x y
>> ezplot((x^2 + y^2)^4 == (x^2 - y^2)^2, [-1, 1])
>> grid on % 显示网格
>> axis equal % 使得x轴和y轴刻度相同
MATLAB符号计算
符号表达式绘图
MATLAB提供了用ezplot3命令来绘制符号参数方程描述的3维曲线的方法,例如:
>> clear
>> syms t
>> ezplot3(t^2*sin(10*t), t^2*cos(10*t), t)
MATLAB符号计算
符号表达式绘图
MATLAB提供了用ezsurf命令来绘制符号表达式曲面的方法,例如:
>> clear
>> syms x y
>> ezsurf(x^2 + y^2)
MATLAB符号计算
使用MuPAD记事本
MATLAB提供了一种更强的符号计算工具——MuPAD记事本

MuPAD记事本的工具条按钮可以在MATLAB主窗口的应用程序标签页中找到。单
击这个工具条按钮,启动MuPAD界面
MATLAB符号计算
MuPAD语法基础
MuPAD的语法与MATLAB有较大差异。变量赋值符号为:=,例如:
a := 1
当不需要输出结果时,在语句后面加上冒号:,而不是分号,例如:
a := 1:
若变量赋值后再取消赋值,可以采用delete命令,例如:
delete a

当几条语句写在同一行时,语句之间加分号;,若不需要输出结果,则语句之间加
冒号:,例如:
b:= 2 ; c:= 3
b:=2 : c:= 3 :
若只是换行,但不想立即输出结果,则同时按键盘Shift键和回车键。需要注意,
此时多条语句中间每条语句后面都要加上分号或冒号。
MuPAD的所有变量不需要事先声明,都是符号变量,例如:
y := exp(2*x)
MATLAB符号计算
MuPAD语法基础
创建数组需要用matrix命令,比如以下语句创建3行1列的列向量:
A := matrix([1, 2, 3])
以下两条语句等价,都是创建1行3列的行向量:
B := matrix(1, 3, [1, 2, 3])
B := matrix([[1, 2, 3]])
以下语句创建3行2列的数组:
C := matrix( [[1, 2], [3, 4], [5, 6]] );
MATLAB符号计算
MuPAD语法基础
MuPAD中分支判断语句采用if elif else end_if的格式,注意条件语句中等号用=
符号,而不是==符号,例如:
x:=2:
y:=1:
if x<0 or y<0 then
y:=y-1;
x:=x-1;
print(x,y)
elif x=0 and y=0 then
y:=1;
x:=1;
print(x,y)
else
y:=y+1;
x:=x+1;
print(x,y)
end_if
MATLAB符号计算
MuPAD语法基础
MuPAD采用for end_for循环语句,例如:
x:=1:
for i from 1 to 5 do
x:=x*i;
end_for
MuPAD采用while end_while循环语句,例如:
i:=2;
while i<16 do
i:=i^2;
print(i);
end_while
MuPAD采用repeat until end_repeat循环语句,例如:
i:=2;
repeat
i:=i^2;
print(i);
until i>=16 end_repeat
MATLAB符号计算
MuPAD语法基础
MuPAD采用->符号创建函数,例如创建f(x) = x2的函数:
f := x->x^2
创建函数后就可以调用,例如f(1),f(x),f(sin(x))。
MuPAD还可以创建多元函数,例如创建g(x, y) = x2 + y3的函数:
g := (x,y) -> x^2 + y^3
创建函数后就可以调用,例如g(5, 2), g(x, 2*x), g(a, b)。

MuPAD通过-->符号来计算函数中表达式结果,注意以下两条语句的区别:
f1 := x -> int(x^2,x)
f2 := x --> int(x^2,x)
MuPAD函数可以传入参数,例如以下这条函数有参数a:
fa := x -> x^2 + a
调用这条函数时,若x=2,可以输入fa(2),也可以再传递参数a的值fa(2) | a=10。

MuPAD的保留变量与MATLAB的保留变量有区别,例如圆周率MuPAD用PI表示,
MATLAB用pi表示;虚数MuPAD用I表示,MATLAB用i或j表示。
MATLAB符号计算
MuPAD微积分运算
MuPAD用diff命令微分数学表达式,例如:
f := y^2 + 4*x*y
diff(f, x)
diff(f, y)
diff(f, x, y)

MuPAD用D命令或’命令微分函数,例如:
f := x -> x^2 + 4*x
D(f)
f'
f ' (a)
D(sin)
sin’
sin’(a)
MATLAB符号计算
MuPAD微积分运算
MuPAD采用int命令计算不定积分,例如:
int((cos(x)^3), x)
MuPAD采用int命令并指定积分上限和下限来计算定积分,例如:
int((cos(x)^3), x = 0..PI/4)

如果MuPAD不能计算出积分的封闭解,可以采用float命令计算定积分数值解,例
如:
p := int(sin(x^2)^2, x = -1..1)
float(p)
MATLAB符号计算
MuPAD矩阵运算
MuPAD计算矩阵A与矩阵B相乘的命令为A*B,其中A矩阵的列数需要等于B矩阵
的行数,例如:
A := matrix([[1, 2, 3], [4, 5, 6]]);
B := matrix([[1, 2], [3, 4], [5, 6]]);
C := A*B

MuPAD计算方阵的行列式的命令是det,例如,方阵C的行列式为:
det(C)
MuPAD计算方阵的逆矩阵的命令是斜杠符号/,例如,方阵C的逆矩阵为:
1/C
MATLAB符号计算
MuPAD符号表达式化简
MuPAD采用simplify和Simplify命令化简表达式,其中simplify命令不做深层化简,
化简速度较快,而Simplify命令做深层化简,化简速度较慢。例如:
simplify((x^2 - 2*x + 1)*(x^3 + x^2 + x + 1)/(x - 1))
Simplify((x^2 - 2*x + 1)*(x^3 + x^2 + x + 1)/(x - 1))

MuPAD采用expand命令进行多项式展开,例如:
expand((x - 1)*(x^2 + 1)*(x^2 + x + 1))

MuPAD采用factor命令进行多项式因式分解,例如:
factor(x^5 + x^3 - x^2 - 1)
MATLAB符号计算
MuPAD解方程和解不等式
MuPAD采用solve命令求解代数方程,例如:
solve(x^5 + 4*x^4 + 3*x^3 = 0, x)
solve(a*x^2 + b*x + c = 0, x)

若需要指定符号参数的取值范围,可以采用assuming命令,例如:
solve(a*x^2 + b*x + c = 0, x) assuming a>0
solve(x^4 - 1 = 0, x) assuming x>0
solve(x^4 - 1 = 0, x) assuming x in R_
solve(x^4 - a = 0, x) assuming a=10 and x in R_
下面这条语句求解代数方程组:
solve([x^2 + y^2 = a, x^2 - y^2 = b],[x, y])
MuPAD采用ode命令求解常微分方程,例如:
eq := ode(x^2*diff(y(x), x, x) + 2*x*diff(y(x), x) + x, y(x))
solve(eq)
MuPAD采用solve命令求解不等式,例如:
solve(x^4 >= 5, x)
solve(x^4 >= 5, x) assuming x in R_
solve(x^4 >= 5, x) assuming x > 0
MATLAB符号计算
MuPAD绘图
MuPAD采用plot命令绘制二维图形,例如下条语句所绘图形如图所示:
plot(sin(3*x)*cos(x))

y
0.8

0.6

0.4

0.2

-5 -4 -3 -2 -1 1 2 3 4 5
-0.2 x

-0.4

-0.6

-0.8
MATLAB符号计算
MuPAD绘图
MuPAD采用plot加上#3D命令绘制三维图形,例如下条语句所绘图形如图所示:
plot(sqrt(x^2 + y^2), #3D)

4
z

0
4
2
0 4
2
y -2 0
-2
-4 -4 x
MATLAB符号计算
MuPAD绘图
多个函数图形可以绘制在同一幅图中,例如下条语句所绘图形如图所示:
plot(sin(x), cot(x))

y
3

-5 -4 -3 -2 -1 1 2 3 4 5
x
-1

-2

-3
MATLAB符号计算
MuPAD绘图
绘制图形时可以指定函数的定义域,例如下条语句所绘图形如图所示:
plot(cos(x^3)*exp(x), x = 2..4)

y
50

40

30

20

10

0
2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0
-10 x
-20

-30

-40

-50
MATLAB符号计算
MuPAD绘图
MuPAD采用plot和piecewise命令绘制分段函数,例如下条语句所绘图形如图所示:
plot(piecewise([x<-2, (-x)^(1/2)], [x>-2 and x<2, 1], [x>2, -x]))

y
2

-5 -4 -3 -2 -1 1 2 3 4 5
x
-1

-2

-3

-4

-5
Simulink在机构学中的应用
机构位置分析
以曲柄滑块机构为例进行机构运动学分析和动力学分析。曲柄滑块机构如图所示,
曲柄AB杆长1m,连杆BC杆长4m,滑块移动方向穿过点A。曲柄滑块机构的原动
件可以是滑块,比如发动机的活塞是原动件;更常见到的情况,曲柄滑块机构的
原动件是曲柄,曲柄由电机带动。这里,我们以曲柄作为机构的原动件。
B

C
θA θC
A

为了进行机构位置分析,需要写出机构位置方程。因为曲柄滑块机构是平面四杆
机构,所以在平面内分别沿着水平方向和竖直方向写出机构位置方程:
LAB * cos(thetaA) + LBC * cos(thetaC) == LAC
LAB * sin(thetaA) == LBC * sin(thetaC)
其中,LAB、LBC表示曲柄和连杆的杆长,LAC是滑块到点A的距离,thetaA即θA,
thetaC即θC。
利用MATLAB符号计算可以获得滑块位置LAC与曲柄转角θA之间的关系。具体
MATLAB程序如下:
Simulink在机构学中的应用
机构位置分析
syms LAB LBC LAC thetaA thetaC
e1 = LAB * cos(thetaA) + LBC * cos(thetaC) == LAC;
%方程中LAC和thetaC是未知数
e2 = LAB * sin(thetaA) == LBC * sin(thetaC);
[LAC thetaC] = solve(e1, e2, LAC, thetaC)
B

C
θA θC
A

上述程序运行后可以获得:
LAC = LBC*(1 - (LAB^2*sin(thetaA)^2)/LBC^2)^(1/2) + LAB*cos(thetaA)
thetaC = asin((LAB*sin(thetaA))/LBC)
可以绘制出LAC与θA之间的函数图象。具体MATLAB程序如下:
Simulink在机构学中的应用
机构位置分析
thetaA = 0:0.1:2*pi; % thetaA从0变化到2*pi,增量为0.1弧度
LAB = 1; % 曲柄杆长1m
LBC = 4; % 连杆杆长4m
LAC = LBC * (1 - (LAB^2 * sin(thetaA).^2) / LBC^2).^(1/2) + LAB * cos(thetaA);
%注意此时thetaA不是数字,而是数组,对数组中各元素的幂运算要加点号,即.^
plot(thetaA*180/pi, LAC); % 横坐标thetaA转换为角度值
xlabel(‘\ThetaA (Degree)’); % \Theta将生成字符θ
ylabel(‘LAC (m)’);
上述程序运行后可以获得LAC与θA之间的函数图象如图所示。
Simulink在机构学中的应用
机构速度仿真
机构速度分析与位置分析相比,涉及到时间变量。把位置方程中的运动参数表达
为时间变量t的函数,然后将位置方程对时间变量求导数,即可获得速度方程。具
体MATLAB程序如下:
syms LAB LBC LAC(t) thetaA(t) thetaC(t)
e1 = LAB * cos(thetaA(t)) + LBC * cos(thetaC(t)) == LAC(t);
e2 = LAB * sin(thetaA(t)) == LBC * sin(thetaC(t));
e3 = diff(e1, t)
e4 = diff(e2, t)
上述程序运行结果经过修改,可以得到以下速度方程:

e3 = - LAB * sin(thetaA) * thetaAdt – LBC * sin(thetaC) * thetaCdt == LACdt;


e4 = LAB * cos(thetaA) * thetaAdt == LBC * cos(thetaC) * thetaCdt;
其中,thetaAdt、thetaCdt、LACdt分别表示曲柄角速度、连杆角速度、滑块速度。
进一步解出连杆角速度、滑块速度:
Simulink在机构学中的应用
机构速度仿真
syms LAB LBC LAC thetaA thetaC
syms thetaAdt thetaCdt LACdt
e3 = - LAB * sin(thetaA) * thetaAdt – LBC * sin(thetaC) * thetaCdt == LACdt;
e4 = LAB * cos(thetaA) * thetaAdt == LBC * cos(thetaC) * thetaCdt;
[thetaCdt, LACdt] = solve(e3, e4, thetaCdt, LACdt)
上述程序运行后可以获得:
thetaCdt = (LAB * thetaAdt * cos(thetaA)) / (LBC * cos(thetaC))
LACdt = - (LAB * thetaAdt * (cos(thetaA) * sin(thetaC) + cos(thetaC) *
sin(thetaA))) / cos(thetaC)

进入Simulink环境,构建曲柄滑块机构速度仿真模型。新建仿真模型,调入
Simulink / User-Defined Functions / MATLAB Function模块。在仿真模型中双击
模块图标,在弹出的.m文件中填写下列程序:
Simulink在机构学中的应用
机构速度仿真
function [thetaCdt, LACdt] = fcn(thetaA, thetaC, thetaAdt)
LAB=1;
LBC=4;
thetaCdt = (LAB * thetaAdt * cos(thetaA)) / (LBC * cos(thetaC));
LACdt = - (LAB * thetaAdt * (cos(thetaA) * sin(thetaC) + cos(thetaC) *
sin(thetaA))) / cos(thetaC);
end
关闭.m文件编辑器后,仿真模型中MATLAB Function模块的图标上出现3个输入
端(thetaA、thetaC、thetaAdt),2个输出端(thetaCdt、LACdt)。
Simulink在机构学中的应用
机构速度仿真
然后调入Simulink / Commonly Used Blocks / Integrator模块,需要3个积分器模
块,用于将速度或角速度变量积分为位移或角位移变量。双击积分器模块图标,
设置积分器的初始条件。需要注意的是,初始时刻曲柄和连杆都处于水平位置,
此时滑块到点A的距离等于曲柄与连杆的长度之和,因此将滑块速度积分为滑块
位移的积分器(图中的Integrator1),初始条件应该设置为5(曲柄长度1m,连
杆长度4m);其余2个积分器(图中的Integrator2和Integrator)的初始条件设置
为0。

假设曲柄做匀速圆周运动,且每秒钟转动半圈(即角速度为pi rad/s),则调入
Simulink / Commonly Used Blocks / Constant模块,双击模块图标,将数值改为
pi,并将该模块与MATLAB Function模块的thetaAdt输入端口相连。

最后调入Simulink / Commonly Used Blocks / Scope模块,通过示波器观察滑块


的位移变化情况。最终构建的曲柄滑块机构速度仿真模型如图所示。示波器的输
出如图所示,横坐标为时间,纵坐标为滑块位移。
Simulink在机构学中的应用
机构速度仿真
Simulink在机构学中的应用
机构加速度仿真
在机构速度仿真中,我们假设曲柄做匀速圆周运动,但启动阶段曲柄在电机带动
下由静止状态开始运动,曲柄转速并不恒定。现在讨论曲柄做匀加速圆周运动时
的机构仿真。把位置方程中的运动参数表达为时间变量t的函数,然后将位置方程
对时间变量求二阶导数(即把速度方程再次对时间变量求导数),即可获得加速
度方程。具体MATLAB程序如下:
syms LAB LBC LAC(t) thetaA(t) thetaC(t)
e1 = LAB * cos(thetaA(t)) + LBC * cos(thetaC(t)) == LAC(t);
e2 = LAB * sin(thetaA(t)) == LBC * sin(thetaC(t));
e3 = diff(e1, t); % 速度方程
e4 = diff(e2, t); % 速度方程
e5 = diff(e3, t) % 加速度方程
e6 = diff(e4, t) % 加速度方程

上述程序运行结果经过修改,可以得到以下加速度方程:
Simulink在机构学中的应用
机构加速度仿真
e5 = - LAB * cos(thetaA) * thetaAdt^2 – LBC * cos(thetaC) * thetaCdt^2 – LAB *
sin(thetaA) * thetaAdtdt – LBC * sin(thetaC) * thetaCdtdt == LACdtdt;
e6 = LAB * cos(thetaA) * thetaAdtdt – LAB * sin(thetaA) * thetaAdt^2 == LBC *
cos(thetaC) * thetaCdtdt – LBC * sin(thetaC) * thetaCdt^2;
其中,thetaAdt、thetaCdt、LACdt分别表示曲柄角速度、连杆角速度、滑块速度,
thetaAdtdt、thetaCdtdt、LACdtdt分别表示曲柄角加速度、连杆角加速度、滑块
加速度。进一步解出连杆角加速度、滑块加速度:
syms LAB LBC LAC thetaA thetaC
syms thetaAdt thetaCdt LACdt
syms thetaAdtdt thetaCdtdt LACdtdt
e5 = - LAB * cos(thetaA) * thetaAdt^2 – LBC * cos(thetaC) * thetaCdt^2 – LAB *
sin(thetaA) * thetaAdtdt – LBC * sin(thetaC) * thetaCdtdt == LACdtdt;
e6 = LAB * cos(thetaA) * thetaAdtdt – LAB * sin(thetaA) * thetaAdt^2 == LBC *
cos(thetaC) * thetaCdtdt – LBC * sin(thetaC) * thetaCdt^2;
[thetaCdtdt, LACdtdt] = solve(e5, e6, thetaCdtdt, LACdtdt)

上述程序运行后可以获得:
Simulink在机构学中的应用
机构加速度仿真
thetaCdtdt = (- LAB * sin(thetaA) * thetaAdt^2 + LBC * sin(thetaC) * thetaCdt^2 +
LAB * thetaAdtdt * cos(thetaA)) / (LBC * cos(thetaC));
LACdtdt = - (LBC * thetaCdt^2 * cos(thetaC)^2 + LBC * thetaCdt^2 *
sin(thetaC)^2 + LAB * thetaAdt^2 * cos(thetaA) * cos(thetaC) – LAB * thetaAdt^2
* sin(thetaA) * sin(thetaC) + LAB * thetaAdtdt * cos(thetaA) * sin(thetaC) + LAB *
thetaAdtdt * cos(thetaC) * sin(thetaA)) / cos(thetaC);
进入Simulink环境,构建曲柄滑块机构加速度仿真模型。新建仿真模型,调入
Simulink / User-Defined Functions / MATLAB Function模块。在仿真模型中双击
模块图标,在弹出的.m文件中填写下列程序:
function [thetaCdtdt, LACdtdt] = fcn(thetaA, thetaC, thetaAdt, thetaCdt, thetaAdtdt)
LAB=1;
LBC=4;
thetaCdtdt = (- LAB * sin(thetaA) * thetaAdt^2 + LBC * sin(thetaC) * thetaCdt^2 +
LAB * thetaAdtdt * cos(thetaA)) / (LBC * cos(thetaC));
LACdtdt = - (LBC * thetaCdt^2 * cos(thetaC)^2 + LBC * thetaCdt^2 * sin(thetaC)^2
+ LAB * thetaAdt^2 * cos(thetaA) * cos(thetaC) - LAB * thetaAdt^2 * sin(thetaA) *
sin(thetaC) + LAB * thetaAdtdt * cos(thetaA) * sin(thetaC) + LAB * thetaAdtdt *
cos(thetaC) * sin(thetaA)) / cos(thetaC);
Simulink在机构学中的应用
机构加速度仿真
关闭.m文件编辑器后,仿真模型中MATLAB Function模块的图标上出现5个输入
端(thetaA、thetaC、thetaAdt、thetaCdt、thetaAdtdt),2个输出端
(thetaCdtdt、LACdtdt)。

然后调入Simulink / Commonly Used Blocks / Integrator模块,需要6个积分器模


块,一方面用于将加速度或角加速度变量积分为速度或角速度变量,另方面用于
将速度或角速度变量积分为位移或角位移变量。双击积分器模块图标,设置积分
器的初始条件。需要注意的是,初始时刻机构处于静止状态,且曲柄和连杆都处
于水平位置,此时滑块到点A的距离等于曲柄与连杆的长度之和,因此将滑块速
度积分为滑块位移的积分器(图8.5中的Integrator1),初始条件应该设置为5
(曲柄长度1m,连杆长度4m);其余5个积分器(图8.5中的Integrator3、
Integrator4、Integrator5、Integrator2和Integrator)的初始条件设置为0。

假设曲柄做匀加速圆周运动,角加速度为pi/4 rad/s2,则调入Simulink /
Commonly Used Blocks / Constant模块,双击模块图标,将数值改为pi/4,并将
该模块与MATLAB Function模块的thetaAdtdt输入端口相连。
Simulink在机构学中的应用
机构加速度仿真
最后调入Simulink / Commonly Used Blocks / Scope模块,通过示波器观察滑块
的位移变化情况。最终构建的曲柄滑块机构加速度仿真模型如图8.5所示。示波器
的输出如图8.6所示,横坐标为时间,纵坐标为滑块位移。
Simulink在机构学中的应用
机构加速度仿真
如果希望曲柄转速在达到pi rad/s时,曲柄由匀加速圆周运动改为匀速圆周运动,
则需要再增加一个加速度切换模块。当曲柄转速小于pi rad/s时,选择pi/4 rad/s-2
的加速度;当曲柄转速达到pi rad/s时,选择加速度为0。调入Simulink /
Commonly Used Blocks / Switch模块,在仿真模型中双击模块图标,在阈值一栏
中填入pi。所构建的曲柄滑块机构加速度切换仿真模型如图8.7所示。示波器的输
出如图8.8所示,横坐标为时间,纵坐标为滑块位移。
Simulink在机构学中的应用
机构加速度仿真
若通过示波器观察thetaA的变化情况,会发现随着时间的推移,thetaA不断增大。
而通常应该将thetaA的范围限定在-pi到pi之间,因此需要再增加一个Simulink /
User-Defined Functions / MATLAB Function模块。在仿真模型中双击MATLAB
Function1模块图标,在弹出的.m文件中填写下列程序:
function y = fcn(u)
n = round(u / (2 * pi)); % 函数round作用是四舍五入
y = u - n * 2 * pi;
end
这样构建的曲柄滑块机构加速度仿真模型如图8.9所示。示波器Scope1的输出
(即thetaA的变化情况)如图8.10所示,横坐标为时间,纵坐标为曲柄转角。可
以看出,此时thetaA的范围被限定在了-pi到pi之间。
Simulink在机构学中的应用
机构加速度仿真
为了检查仿真模型的正确性,可以采用相容性验证技术。理论上,积分器获得的
thetaA、thetaC和LAC应该满足8.1节中的位置方程;实际上,由于数值积分的误
差,积分器获得的thetaA、thetaC和LAC与实际值相比有微小误差。如图8.11所示,
再调入一个Simulink / User-Defined Functions / MATLAB Function模块,在仿真
模型中双击MATLAB Function2模块图标,在弹出的.m文件中填写下列程序:
function err = fcn(thetaA, thetaC, LAC)
LAB=1;
LBC=4;
errX = LAB * cos(thetaA) + LBC * cos(thetaC) - LAC; % 水平方向的位置误差
errY = LAB * sin(thetaA) - LBC * sin(thetaC); % 竖直方向的位置误差
err = sqrt(errX^2 + errY^2); % 总体位置误差
end
Simulink在机构学中的应用
机构加速度仿真
通过示波器Scope2观察总体位置误差的变化情况,如图8.12所示,横坐标为时间,
纵坐标为误差值。可以看出,仿真3秒内误差很小;仿真10秒时总体位置误差小
于0.02m。
Simulink在机构学中的应用
机构加速度仿真
如果相容性验证发现初始时刻有较大误差,则说明仿真模型不正确或者初始条件
设置错误。如果发现误差随时间急剧扩大,说明仿真求解器算法不太合适,需要
在Simulation菜单的Model Configuration Parameters子菜单(如图8.13所示)弹
出的窗口中选择合适的求解器算法,如图8.14所示。
Simulink在机构学中的应用
机构动力学仿真
机构动力学分析需要对杆件进行受力分析,曲柄滑块机构各杆件的受力情况如图
8.15所示。根据牛顿—欧拉方程,曲柄和连杆可以列出沿水平方向和沿竖直方向
的力平衡方程,以及绕质心的力矩平衡方程,滑块可以列出沿水平方向和沿竖直
方向的力平衡方程。共有8个方程:

eq1x = m1 * a1x == F01x – F21x;


B
eq1y = m1 * a1y == F01y – F21y – G1;
eq1z = I1 * α1 == (F21x + F01x) * L1 / 2 * θA θC
C

sin(thetaA) – (F21y + F01y) * L1 / 2 * A

cos(thetaA) – T01;
F21y
eq2x = m2 * a2x == F21x – F32x; F21x
B
F21x F03y
eq2y = m2 * a2y == F21y + F32y – G2; F 01y F21y B
F32y C
eq2z = I2 * α2 == (F32y – F21y) * T01
G1
F01x F32x F03x F32x
G2
L2 / 2 * cos(thetaC) – (F21x + F32x) * A C F32y

L2 / 2 * sin(thetaC); G3

eq3x = m3 * a3x == F32x – F03x;


eq3y = 0 == F03y – F32y – G3;
Simulink在机构学中的应用
机构动力学仿真
其中,m1、m2、m3分别是曲柄、连杆、滑块的质量,G1、G2、G3分别是曲柄、
连杆、滑块的重力,a1x、a2x、a3x分别是曲柄、连杆、滑块在水平方向的质心
加速度,a1y、a2y分别是曲柄、连杆在竖直方向的质心加速度,L1、L2分别是曲
柄、连杆的杆长,α1、α2分别是曲柄、连杆的质心角加速度,I1、I2分别是曲柄、
连杆的质心转动惯量。因此有:
G1 = m1 * g;
G2 = m2 * g;
G3 = m3 * g;
I1 = 1/12 * m1 * L1^2;
I2 = 1/12 * m2 * L2^2;
上述8个方程,可以求解8个未知数。对于动力学反问题,作用在滑块上的外载荷
F03x是已知条件,机构运动状态也是已知条件,因此可以求解7个副反力分量以
及驱动力矩T01;对于动力学正问题,作用在滑块上的外载荷F03x是已知条件,
驱动力矩T01也是已知条件,因此可以求解7个副反力分量以及构件的运动加速度。
如果不关心作用在滑块上的竖直支承力F03y,则方程eq3y可以不用考虑,这样机
构共有7个方程。对于动力学反问题,利用MATLAB符号计算,可以求解出6个副
反力分量以及驱动力矩T01:
Simulink在机构学中的应用
机构动力学仿真
F01x = F03x + a1x * m1 + a2x * m2 + a3x * m3;

F21x = F03x + a2x * m2 + a3x * m3;

F01y = -(2 * I2 * alpha2 – 2 * G1 * L2 * cos(thetaC) - G2 * L2 * cos(thetaC) + 2 *


F03x * L2 * sin(thetaC) – 2 * L2 * a1y * m1 * cos(thetaC) - L2 * a2y * m2 *
cos(thetaC) + L2 * a2x * m2 * sin(thetaC) + 2 * L2 * a3x * m3 * sin(thetaC)) / (2 *
L2 * cos(thetaC));

F21y = - (2 * I2 * alpha2 - G2 * L2 * cos(thetaC) + 2 * F03x * L2 * sin(thetaC) -


L2 * a2y * m2 * cos(thetaC) + L2 * a2x * m2 * sin(thetaC) + 2 * L2 * a3x * m3 *
sin(thetaC)) / (2 * L2 * cos(thetaC));

F32x = F03x + a3x * m3;

F32y = (2 * I2 * alpha2 + G2 * L2 * cos(thetaC) + 2 * F03x * L2 * sin(thetaC) + L2


* a2y * m2 * cos(thetaC) + L2 * a2x * m2 * sin(thetaC) + 2 * L2 * a3x * m3 *
sin(thetaC)) / (2 * L2 * cos(thetaC));
Simulink在机构学中的应用
机构动力学仿真
T01 = (2 * I2 * L1 * alpha2 * cos(thetaA) – 2 * I1 * L2 * alpha1 * cos(thetaC) - G1
* L1 * L2 * cos(thetaA) * cos(thetaC) - G2 * L1 * L2 * cos(thetaA) * cos(thetaC) +
2 * F03x * L1 * L2 * cos(thetaA) * sin(thetaC) + 2 * F03x * L1 * L2 * cos(thetaC) *
sin(thetaA) - L1 * L2 * a1y * m1 * cos(thetaA) * cos(thetaC) - L1 *L2 *a2y * m2 *
cos(thetaA) * cos(thetaC) + L1 * L2 * a1x * m1 * cos(thetaC) * sin(thetaA) + L1 *
L2 * a2x * m2 * cos(thetaA) * sin(thetaC) + 2 * L1 * L2 * a2x * m2 * cos(thetaC) *
sin(thetaA) + 2 * L1 * L2 * a3x * m3 * cos(thetaA) * sin(thetaC) + 2 * L1 * L2 *
a3x * m3 * cos(thetaC) * sin(thetaA)) / (2 * L2 * cos(thetaC));
根据杆件质心位移方程的二阶导数,可以获得杆件质心加速度的表达式:
a1x = - (L1 * cos(thetaA) * thetaAdt^2) / 2 - (L1 * sin(thetaA) * thetaAdtdt) / 2;
a1y = (L1 * cos(thetaA) * thetaAdtdt) / 2 - (L1 * sin(thetaA) * thetaAdt^2) / 2;
a2x = - L1 * cos(thetaA) * thetaAdt^2 - (L2 * cos(thetaC) * thetaCdt^2) / 2 - L1 *
sin(thetaA) * thetaAdtdt - (L2 * sin(thetaC) * thetaCdtdt) / 2;
a2y = (L2 * cos(thetaC) * thetaCdtdt) / 2 - (L2 * sin(thetaC) * thetaCdt^2) / 2;
a3x = LACdtdt;
显然,杆件质心的角加速度的表达式即:
alpha1 = thetaAdtdt;
alpha2 = thetaCdtdt;
Simulink在机构学中的应用
机构动力学仿真
设曲柄质量m1=2kg,连杆质量m2=4kg,滑块质量m3=10kg。L1=1m,L2=4m。
假设外载荷F03x=0。则在8.2节机构加速度仿真模型的基础上,构建机构反向动
力学模型,如图8.16所示。
Simulink在机构学中的应用
机构动力学仿真
新调入Simulink / User-Defined Functions / MATLAB Function模块,在仿真模型
中双击MATLAB Function3模块图标,在弹出的.m文件中填写下列程序:
function [F01x, F01y, F21x, F21y, F32x, F32y, T01] = fcn(thetaA, thetaC,
thetaAdt, thetaCdt, thetaAdtdt, thetaCdtdt, LACdtdt)
L1=1;
L2=4;
m1=2;
m2=8;
m3=10;
g=9.8;
G1 = m1 * g;
G2 = m2 * g;
I1 = 1/12 * m1 * L1^2;
I2 = 1/12 * m2 * L2^2;
F03x=0;
a1x = - (L1 * cos(thetaA) * thetaAdt^2) / 2 - (L1 * sin(thetaA) * thetaAdtdt) / 2;
a1y = (L1 * cos(thetaA) * thetaAdtdt) / 2 - (L1 * sin(thetaA) * thetaAdt^2) / 2;
alpha1 = thetaAdtdt;
Simulink在机构学中的应用
机构动力学仿真
a2x = - L1 * cos(thetaA) * thetaAdt^2 - (L2 * cos(thetaC) * thetaCdt^2) / 2 - L1 *
sin(thetaA) * thetaAdtdt - (L2 * sin(thetaC) * thetaCdtdt) / 2;
a2y = (L2 * cos(thetaC) * thetaCdtdt) / 2 - (L2 * sin(thetaC) * thetaCdt^2) / 2;
alpha2 = thetaCdtdt;
a3x = LACdtdt;
F01x = F03x + a1x * m1 + a2x * m2 + a3x * m3;
F21x = F03x + a2x * m2 + a3x * m3;
F01y = -(2 * I2 * alpha2 – 2 * G1 * L2 * cos(thetaC) - G2 * L2 * cos(thetaC) + 2 *
F03x * L2 * sin(thetaC) – 2 * L2 * a1y * m1 * cos(thetaC) - L2 * a2y * m2 *
cos(thetaC) + L2 * a2x * m2 * sin(thetaC) + 2 * L2 * a3x * m3 * sin(thetaC)) / (2 *
L2 * cos(thetaC));
F21y = - (2 * I2 * alpha2 - G2 * L2 * cos(thetaC) + 2 * F03x * L2 * sin(thetaC) -
L2 * a2y * m2 * cos(thetaC) + L2 * a2x * m2 * sin(thetaC) + 2 * L2 * a3x * m3 *
sin(thetaC)) / (2 * L2 * cos(thetaC));
F32x = F03x + a3x * m3;
F32y = (2 * I2 * alpha2 + G2 * L2 * cos(thetaC) + 2 * F03x * L2 * sin(thetaC) + L2
* a2y * m2 * cos(thetaC) + L2 * a2x * m2 * sin(thetaC) + 2 * L2 * a3x * m3 *
sin(thetaC)) / (2 * L2 * cos(thetaC));
Simulink在机构学中的应用
机构动力学仿真
T01 = (2 * I2 * L1 * alpha2 * cos(thetaA) – 2 * I1 * L2 * alpha1 * cos(thetaC) - G1
* L1 * L2 * cos(thetaA) * cos(thetaC) - G2 * L1 * L2 * cos(thetaA) * cos(thetaC) +
2 * F03x * L1 * L2 * cos(thetaA) * sin(thetaC) + 2 * F03x * L1 * L2 * cos(thetaC) *
sin(thetaA) - L1 * L2 * a1y * m1 * cos(thetaA) * cos(thetaC) - L1 *L2 *a2y * m2 *
cos(thetaA) * cos(thetaC) + L1 * L2 * a1x * m1 * cos(thetaC) * sin(thetaA) + L1 *
L2 * a2x * m2 * cos(thetaA) * sin(thetaC) + 2 * L1 * L2 * a2x * m2 * cos(thetaC) *
sin(thetaA) + 2 * L1 * L2 * a3x * m3 * cos(thetaA) * sin(thetaC) + 2 * L1 * L2 *
a3x * m3 * cos(thetaC) * sin(thetaA)) / (2 * L2 * cos(thetaC));
end
新调入Simulink / Commonly Used Blocks / Mux模块,在仿真模型中双击模块图
标,将输入端口数目改为6。示波器Scope3描述了6种副反力分量的变化情况,如
图8.17所示,横坐标为时间,纵坐标为副反力分量的大小。示波器Scope4描述了
驱动扭矩T01的变化情况,横坐标为时间,纵坐标为驱动扭矩的大小。
Simulink在机构学中的应用
机构动力学仿真
对于动力学正问题,利用MATLAB符号计算,可以求解出6个副反力分量以及机构
加速度。需要注意的是,Simulink不能求解含有代数环的仿真模型,因此需要在
机构反向动力学模型的基础上,把运动学模块和动力学模块合并在一个MATLAB
Function模块中,如图8.19所示构建机构正向动力学仿真模型。假设外载荷
F03x=0,曲柄施加恒定的驱动扭矩T01=13Nm。

练习作业:建
作废
立曲柄滑块机
构正向动力学
Simulink模型
【Simulink文
件名修改为B+
作废
学号】
Simulink在机构学中的应用
机构动力学仿真
在机构正向动力学仿真模型中双击MATLAB Function3模块图标,在弹出的.m文
件中填写下列程序:
function [thetaAdtdt, thetaCdtdt, LACdtdt, F01x, F01y, F21x, F21y, F32x, F32y] =
fcn(thetaAdt, thetaCdt, thetaA, thetaC, T01)
L1=1;
L2=4;
m1=2;
m2=8;
m3=10;
g=9.8;
G1 = m1 * g;
G2 = m2 * g;
I1 = 1/12 * m1 * L1^2;
I2 = 1/12 * m2 * L2^2;
F03x=0;
% 这儿需要填写thetaAdtdt, thetaCdtdt, LACdtdt, F01x, F01y, F21x, F21y, F32x,
F32y的表达式
end
Simulink在机构学中的应用
机构动力学仿真
其中,thetaAdtdt, F01x, F01y, F21x, F21y, F32x, F32y的表达式可以通过
MATLAB符号计算获得:
syms F01x F21x F01y F21y F32x F32y T01 F03x m1 m2 m3 a1x a1y a2x a2y
a3x G1 G2 thetaA thetaC I1 I2 L1 L2 thetaAdt thetaAdtdt thetaCdt thetaCdtdt
LACdtdt
LAB=L1;
LBC=L2;
thetaCdtdt = (- LAB * sin(thetaA) * thetaAdt^2 + LBC * sin(thetaC) * thetaCdt^2 +
LAB * thetaAdtdt * cos(thetaA)) / (LBC * cos(thetaC));
LACdtdt = - (LBC * thetaCdt^2 * cos(thetaC)^2 + LBC * thetaCdt^2 *
sin(thetaC)^2 + LAB * thetaAdt^2 * cos(thetaA) * cos(thetaC) - LAB * thetaAdt^2
* sin(thetaA) * sin(thetaC) + LAB * thetaAdtdt * cos(thetaA) * sin(thetaC) + LAB *
thetaAdtdt * cos(thetaC) * sin(thetaA)) / cos(thetaC);
a1x = - (L1 * cos(thetaA) * thetaAdt^2) / 2 - (L1 * sin(thetaA) * thetaAdtdt) / 2;
a1y = (L1 * cos(thetaA) * thetaAdtdt) / 2 - (L1 * sin(thetaA) * thetaAdt^2) / 2;
a2x = - L1 * cos(thetaA) * thetaAdt^2 - (L2 * cos(thetaC) * thetaCdt^2) / 2 - L1 *
sin(thetaA) * thetaAdtdt - (L2 * sin(thetaC) * thetaCdtdt) / 2;
a2y = (L2 * cos(thetaC) * thetaCdtdt) / 2 - (L2 * sin(thetaC) * thetaCdt^2) / 2;
Simulink在机构学中的应用
机构动力学仿真
a3x = LACdtdt;
alpha1 = thetaAdtdt;
alpha2 = thetaCdtdt;
eq1x = m1 * a1x == F01x - F21x;
eq1y = m1 * a1y == F01y - F21y - G1;
eq1z = I1 * alpha1 == (F21x + F01x) * L1 / 2 * sin(thetaA) - (F21y + F01y) * L1 /
2 * cos(thetaA) - T01;
eq2x = m2 * a2x == F21x - F32x;
eq2y = m2 * a2y == F21y + F32y - G2;
eq2z = I2 * alpha2 == (F32y - F21y) * L2 / 2 * cos(thetaC) - (F21x + F32x) * L2 /
2 * sin(thetaC);
eq3x = m3 * a3x == F32x - F03x;
[F01x, F21x, F01y, F21y, F32x, F32y, thetaAdtdt] = solve(eq1x, eq1y, eq1z, eq2x,
eq2y, eq2z, eq3x, F01x, F21x, F01y, F21y, F32x, F32y, thetaAdtdt)

把所获得的thetaAdtdt的正向动力学的符号解代入thetaCdtdt, LACdtdt的表达式:
Simulink在机构学中的应用
机构动力学仿真
thetaCdtdt = (- LAB * sin(thetaA) * thetaAdt^2 + LBC * sin(thetaC) * thetaCdt^2 +
LAB * thetaAdtdt * cos(thetaA)) / (LBC * cos(thetaC));
LACdtdt = - (LBC * thetaCdt^2 * cos(thetaC)^2 + LBC * thetaCdt^2 *
sin(thetaC)^2 + LAB * thetaAdt^2 * cos(thetaA) * cos(thetaC) - LAB * thetaAdt^2
* sin(thetaA) * sin(thetaC) + LAB * thetaAdtdt * cos(thetaA) * sin(thetaC) + LAB *
thetaAdtdt * cos(thetaC) * sin(thetaA)) / cos(thetaC);
即可获得thetaCdtdt, LACdtdt的正向动力学的符号解。示波器Scope描述了滑块位
置随时间的变化情况,如图8.20所示,横坐标为时间,纵坐标为滑块位置。示波
器Scope1描述了曲柄转角随时间的变化情况,如图8.21所示,横坐标为时间,纵
坐标为曲柄转角。示波器Scope3描述了6种副反力分量的变化情况,如图8.22所
示,横坐标为时间,纵坐标为副反力分量的大小。示波器Scope4描述了曲柄转速
的变化情况,如图8.23所示,横坐标为时间,纵坐标为曲柄转速,转速负值说明
曲柄顺时针转动(即与施加的驱动扭矩T01方向一致)。
Simulink在机构学中的应用
机构速度控制仿真
在上一节图8.19曲柄滑块机构正向动力学仿真模型中,曲柄受到恒定的驱动力矩,
因此曲柄转速不断增大,如图8.23所示。如果希望曲柄转速保持在某个转速附近,
则需要进行机构的速度控制。控制的基本思想是利用反馈,将转速的实际测量值
与期望值作比较,并将二者的差值作为控制器的输入,进而实时控制曲柄的驱动
力矩,达到调节曲柄转速的目的。

图8.24是构建的曲柄滑块机构速度反馈控制的模型,其中期望的参考转速是
Constant模块设定的pi rad/s,从thetaAdt端口引出了速度反馈,速度反馈与比较
器的负号端口连接。考虑到图8.15中驱动力矩的正方向与曲柄转速的正方向不一
致,因此Gain增益模块中填入了负值-20。示波器Scope描述了滑块位置随时间的
变化情况,如图8.25所示,横坐标为时间,纵坐标为滑块位置。示波器Scope1描
述了曲柄转角随时间的变化情况,如图8.26所示,横坐标为时间,纵坐标为曲柄
转角。示波器Scope3描述了6种副反力分量的变化情况,如图8.27所示,横坐标
为时间,纵坐标为副反力分量的大小。示波器Scope4描述了曲柄转速的变化情况,
如图8.28所示,横坐标为时间,纵坐标为曲柄转速。
Simulink在机构学中的应用
机构速度控制仿真
Simulink在机构学中的应用
机构速度控制仿真
在图8.24所示的机构速度反馈控制模型中,控制器只是一个简单的增益模块,因
而控制的效果不太理想,从图8.28可以看出实际转速偏离期望转速较多。实际上,
Simulink提供了功能更强的PID控制器模块,其中P表示位置参数,I表示积分参数,
D表示微分参数。构建曲柄滑块机构速度PID控制模型,如图8.29所示。当模型中
PID控制器的参数设置为P=-20(这里P参数与图8.24中Gain增益模块的参数一
致),I=-10,D=-25时,示波器Scope描述了滑块位置随时间的变化情况,如图
8.30所示,横坐标为时间,纵坐标为滑块位置。示波器Scope1描述了曲柄转角随
时间的变化情况,如图8.31所示,横坐标为时间,纵坐标为曲柄转角。示波器
Scope3描述了6种副反力分量的变化情况,如图8.32所示,横坐标为时间,纵坐
标为副反力分量的大小。示波器Scope4描述了曲柄转速的变化情况,如图8.33所
示,横坐标为时间,纵坐标为曲柄转速。对于图8.33和图8.28可以发现,PID控制
的效果比单纯采用放大增益的效果好。
Simulink在机构学中的应用
机构速度控制仿真
Simulink在机构学中的应用
控制系统计算机辅助设计的常用工具
Simulink在机构学中的应用
含电机模型的机构速度控制仿真
曲柄滑块机构中,作为原动件的曲柄由电机及减速器带动,本节研究带有直流电
机和减速器的机构速度控制仿真。直流电机电枢回路的电压平衡方程为:
dia
u  em  ia Ra  La
dt
电机的力矩平衡方程为(考虑到图8.15中驱动力矩的正方向与曲柄转速的正方向
不一致,因此下式等号右边取了负号):
T  KT ia   J  f 
直流电机的反动电势方程为(考虑到图8.15中驱动力矩的正方向与曲柄转速的正
方向不一致,因此下式等号右边取了负号):
em   Ke
其中,u为电枢电压,ia为电枢电流,Ra和La为电枢回路的电阻和电感(直流电机
电枢电感La可忽略),KT为力矩系数,J为负载和转子折算到电机轴的等效转动惯
量,f为阻尼系数(系统机械阻尼很小,f可忽略),Ke为反电动势常数。

根据上述微分方程,可以获得直流电机的电枢电压与转速之间的系统框图如图
8.34所示。
Simulink在机构学中的应用
含电机模型的机构速度控制仿真

设直流电机中KT=0.6,Ke=0.6,Ra=1,J=2.5。在直流电机模型的基础上,引入
速度反馈,并加上PID控制器,则构建了直流电机速度控制仿真模型,如图8.35所
示。考虑到图8.15中驱动力矩的正方向与曲柄转速的正方向不一致,因此PID控制
器前面加了-1模块,等效转动惯量J前也加了负号。
Simulink在机构学中的应用
含电机模型的机构速度控制仿真
当把直流电机模型添加到曲柄滑
块机构模型中时,需要注意图
8.34中1/(-Js)模块将被曲柄滑块
动力学模型替代。另外,电机与
曲柄之间应该有减速器,减速器
一方面降低电机输出转速,另方
面增加电机输出转矩,因此KT
模块与曲柄滑块动力学模型的
T01端口之间应该增加含有减速
比和传动效率的减速器模块(图
8.36中的reducer模块,若减速
器的减速比为n=30,效率η=0.8,
则减速器模块增益为n*η = 24),
Ke模块与thetaAdt端口之间应该
增加减速比模块(图8.36中的
red模块,减速比为n=30)。带
有直流电机的曲柄滑块机构速度
控制模型如图8.36所示。
Simulink在机构学中的应用
含电机模型的机构速度控制仿真
对速度控制模型施加比例积分控制,即PID控制器参数中,参数D=0。当PID控制
器参数P=8、I=12时,电机转速的变化情况如图8.37所示;曲柄转速的变化情况
如图8.38所示。当PID控制器参数P=40、I=60时,电机转速的变化情况如图8.39
所示;曲柄转速的变化情况如图8.40所示。当PID控制器参数P=80、I=120时,电
机转速的变化情况如图8.41所示;曲柄转速的变化情况如图8.42所示。
Simulink在机构学中的应用
含电机模型的机构速度控制仿真
对比图8.37—8.42可以看出,PID控制器参数设置得大,转速控制的效果更好,但
参数设置得大也意味着控制需要消耗更多的能量。还可以看出,若不考虑具体机
构模型,只针对电机模型,那么转速控制经过短暂的瞬态过程可以达到理想的期
望转速;而由于实际机构的非线性模型,转速控制最终在期望值附近上下波动。
对比图8.33和图8.38可以发现,不含电机模型的曲柄转速PID控制的转速波动较大,
带有电机和减速器模型的PID控制效果更好,这是因为减速器模型的减速比将实
际机构的时变转动惯量折算到电机转轴时,大大削弱了时变转动惯量的非线性效
果。
Simulink在机构学中的应用
控制系统的半实物仿真
从控制的角度看,Simulink控制仿真模型可以分为两部分,一部分是控制器(比
如图8.36中的PID控制器),另一部分是被控对象(比如图8.36中的电机和曲柄滑
块机构)。MATLAB仿真可以与实物结合起来,称为半实物仿真(也称为硬件在
环仿真,Hardware-in-the-loop,HIL仿真)。有两种类型的半实物仿真:一种是
控制器为实物,被控对象为Simulink模型,比如用于导弹发射控制仿真;另一种
是控制器为Simulink模型,被控对象为实物,这在MATLAB半实物仿真中最常用。

实物
SimMechanics机械系统仿真
SimMechanics简介
上一章介绍了Simulink在机构学中的应用,机构仿真模型是通过MATLAB代码描
述的一系列运动学代数方程和动力学微分方程,通过示波器模块观察到曲柄、滑
块等构件的位移、速度、加速度以及受力情况。对工程应用而言,上一章介绍的
方法有两点不足,一是仿真结果由示波器中曲线表达,不够直观;二是仿真模型
的构建需要列写大量的运动学和动力学方程,难度较大。本章介绍MATLAB用于
机构仿真的最新平台SimMechanics。SimMechanics可以构建机构的三维模型,
非常直观;更重要的是,它封装了底层的运动学代数方程和动力学微分方程,将
设计人员从繁重的力学分析中解脱出来。

SimMechanics为工业机器人、建筑机械、飞行器、车辆等机械系统提供了多体动
力学仿真平台。在MATLAB主界面中点击“Simulink库”按钮,弹出“Simulink
Library Browser”,SimMechanics属于Simscape组件之一。SimMechanics平台
包括第一代建模环境和第二代建模环境,本章主要介绍第二代建模环境。

下面通过实例来介绍SimMechanics仿真平台中的常用模块。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
曲柄滑块机构的初始时刻位置以及各坐标系初始时刻的位置和方向如图9.2所示,
其中绝对坐标系x0y0的原点放置在驱动曲柄旋转的转动副处,曲柄局部坐标系x1y1
与曲柄质心固结,连杆局部坐标系x2y2与连杆质心固结,滑块局部坐标系x3y3与滑
块质心固结。在机构运动过程中,除了绝对坐标系x0y0固定不动,曲柄局部坐标
系x1y1、连杆局部坐标系x2y2、滑块局部坐标系x3y3都会在绝对坐标系x0y0中运动。
y0 y1 y2 y3
绝对
x0 x1 x2 x3
坐标系

曲柄 连杆 滑块

在SimMechanics平台中调入Solid模块建立曲柄模型,设置Solid模块Shape属性
为Brick,曲柄长度1m,宽0.2m,高0.1m,因此在Dimensions中填入[1 0.2 0.1]。
再调入Solid模块建立连杆模型,设置Solid模块Shape属性为Brick,连杆长度4m,
宽0.2m,高0.1m,因此在Dimensions中填入[4 0.2 0.1]。再调入Solid模块建立滑
块模型,设置Solid模块Shape属性为Brick,滑块长度0.5m,宽0.4m,高0.3m,
因此在Dimensions中填入[0.5 0.4 0.3]。每个杆件的颜色可以在Solid模块Graphic
/ Visual Properties / Color属性中修改。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
在SimMechanics平台中调入3个转动副和1个移动副。因为曲柄长度1m,所以转
动副1至曲柄质心的坐标变换为沿x轴平移0.5m,调入Rigid Transform模块,将名
称修改为“转动副1至曲柄质心”,如图9.3所示设置“转动副1至曲柄质心”刚体
坐标变换。把转动副1模块的F端口与“转动副1至曲柄质心”刚体坐标变换模块
的B端口相连,把“转动副1至曲柄质心”刚体坐标变换模块的F端口与曲柄Solid
模块相连。再调入Rigid Transform模块,将名称修改为“曲柄质心至转动副2”,
如图9.3所示设置“曲柄质心至转动副2”刚体坐标变换。把曲柄Solid模块与“曲
柄质心至转动副2”刚体坐标变换模块的B端口相连,把“曲柄质心至转动副2”
刚体坐标变换模块的F端口转动副2模块的B端口相连。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
因为连杆长度4m,所以转动副2至连杆质心的坐标变换为沿x轴平移2m,调入
Rigid Transform模块,将名称修改为“转动副2至连杆质心”,如图9.4所示设置
“转动副2至连杆质心”刚体坐标变换。把转动副2模块的F端口与“转动副2至连
杆质心”刚体坐标变换模块的B端口相连,把“转动副2至连杆质心”刚体坐标变
换模块的F端口与连杆Solid模块相连。再调入Rigid Transform模块,将名称修改
为“连杆质心至转动副3”,如图9.4所示设置“连杆质心至转动副3”刚体坐标变
换。把连杆Solid模块与“连杆质心至转动副3”刚体坐标变换模块的B端口相连,
把“连杆质心至转动副3”刚体坐标变换模块的F端口与转动副3模块的B端口相连。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
因为滑块的质心恰好位于转动副3,因此直接把转动副3模块的F端口与滑块Solid
模块相连。需要注意的是,SimMechanics中移动副只能沿着z轴平移,因此在滑
块Solid模块与运动副模块之间需要一个刚体坐标变换模块。调入Rigid Transform
模块,将名称修改为“滑块至移动副”,如图9.5所示设置“滑块至移动副”刚体
坐标变换。把滑块Solid模块与“滑块至移动副”刚体坐标变换模块的B端口相连,
把“滑块至移动副”刚体坐标变换模块的F端口与移动副的B端口相连。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
因为曲柄滑块机构是闭式运动链机构,因此需要把滑块的移动副与机架连接。调
入Rigid Transform模块,将名称修改为“移动副至World Frame”,如图9.6所示
设置“移动副至World Frame”刚体坐标变换。需要注意的是,当坐标变换既有
旋转变换又有平移变换时,SimMechanics是先将坐标系原点平移,然后再绕新的
坐标原点旋转,因此图9.6中Translation属性中标准轴为+z轴,平移量为-5m;
Rotation属性中标准轴为+y轴,旋转量为-90°。把移动副的F端口与“移动副至
World Frame”刚体坐标变换模块的B端口相连,把“移动副至World Frame”刚
体坐标变换模块的F端口与转动副1的B端口相连。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
在SimMechanics平台中调入World Frame模块、Mechanism Configuration模块、
Solver Configuration模块,分别把World Frame模块、Mechanism Configuration
模块、Solver Configuration模块与转动副1的B端口相连。将Mechanism
Configuration模块Gravity属性设置为[0 -9.80665 0],即重力加速度沿着绝对坐标
系的y轴负方向。从Simulink平台中调入Constant模块,修改Constant数值为500,
再调入Simulink-PS Converter模块,把Constant模块与Simulink-PS Converter模
块的输入端口相连。双击转动副1模块,如图9.7所示,修改Actuation属性的
Torque为Provided by Input,即转动副1由输入力矩驱动;勾选Sensing属性的
Velocity项目,即输出转动副1的转速。将Simulink-PS Converter模块的输出端口
与转动副1模块的t端口相连,即对曲柄施加500Nm的驱动力矩。调入PS–
Simulink Converter模块,再从Simulink平台中调入示波器模块,把转动副1的w端
口与PS–Simulink Converter模块的输入端口相连,把PS–Simulink Converter模
块的输出端口与示波器模块相连。
为了观察滑块在绝对坐标系中的位移变化情况,在SimMechanics平台中调入
Transform Sensor模块,如图9.8所示勾选Transform Sensor模块Translation属性
的X项目。把Transform Sensor模块的B端口与World Frame模块相连,把
Transform Sensor模块的F端口与滑块Solid模块相连,把Transform Sensor模块
的X端口与另一个PS–Simulink Converter模块的输入端口相连,进而通过
Simulink平台中的示波器模块观察滑块位移。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真

进一步设置移动副的Sensing属性,勾选Velocity项目,从而能够观察滑块的运动
速度。最终构建的曲柄滑块机构的SimMechanics模型如图9.9所示。运行仿真程
序后,可以直观地看到曲柄滑块机构的三维模型,如图9.10所示。仿真10秒时间
内,滑块位移如图9.11所示,滑块速度如图9.12所示,曲柄转速如图9.13所示。
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
SimMechanics机械系统仿真
曲柄滑块机构SimMechanics仿真
与前一章8.6节类似,可以把带减速器的直流电机模型和PID控制器增加到曲柄滑
块机构的SimMechanics模型中,如图9.14所示。当PID控制器参数P=160,I=240,
D=0时,仿真10秒时间内,滑块位移如图9.15所示,滑块速度如图9.16所示,曲
柄转速如图9.17所示。对比图9.17和图9.13可以看出,PID控制器使曲柄转速控制
在pi rad/s附近。
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
两自由度机器人操作臂的初始时刻位置以及各坐标系初始时刻的位置和方向如图
9.18所示,其中绝对坐标系x0y0的原点放置在基座的转动副处,杆件1局部坐标系
x1y1与杆件1质心固结,杆件2局部坐标系x2y2与杆件2质心固结,末端执行器局部
坐标系xEyE与末端执行器几何中心固结。在机器人运动过程中,除了绝对坐标系
x0y0固定不动,杆件1局部坐标系x1y1、杆件2局部坐标系x2y2、末端执行器局部坐
标系xEyE都会在绝对坐标系x0y0中运动。
y0 y1 y2 yE
绝对
x0 x1 x2 xE
坐标系

杆件1 杆件2 末端
夹持器

在SimMechanics平台中调入Solid模块建立杆件1模型,设置Solid模块Shape属性
为Brick,杆件1长度1m,宽0.1m,高0.1m,因此在Dimensions中填入[1 0.1 0.1]。
再调入Solid模块建立杆件2模型,设置Solid模块Shape属性为Brick,杆件2长度
0.5m,宽0.1m,高0.1m,因此在Dimensions中填入[0.5 0.1 0.1]。每个杆件的颜
色可以在Solid模块Graphic / Visual Properties / Color属性中修改。
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
在SimMechanics平台中调入2个转动副。因为杆件1长度1m,所以转动副1至杆件
1质心的坐标变换为沿x轴平移0.5m,调入Rigid Transform模块,将名称修改为
“转动副1至杆件1质心”,如图9.19所示设置“转动副1至杆件1质心”刚体坐标
变换。把转动副1模块的F端口与“转动副1至杆件1质心”刚体坐标变换模块的B
端口相连,把“转动副1至杆件1质心”刚体坐标变换模块的F端口与杆件1的Solid
模块相连。再调入Rigid Transform模块,将名称修改为“杆件1质心至转动副2”,
如图9.19所示设置“杆件1质心至转动副2”刚体坐标变换。把杆件1的Solid模块
与“杆件1质心至转动副2”刚体坐标变换模块的B端口相连,把“杆件1质心至转
动副2”刚体坐标变换模块的F端口转动副2模块的B端口相连。
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
因为杆件2长度0.5m,所以转动副2至杆件2质心的坐标变换为沿x轴平移0.25m,
调入Rigid Transform模块,将名称修改为“转动副2至杆件2质心”,如图9.20所
示设置“转动副2至杆件2质心”刚体坐标变换。把转动副2模块的F端口与“转动
副2至杆件2质心”刚体坐标变换模块的B端口相连,把“转动副2至杆件2质心”
刚体坐标变换模块的F端口与杆件2的Solid模块相连。再调入Rigid Transform模块,
将名称修改为“杆件2质心至末端”,如图9.20所示设置“杆件2质心至末端”刚
体坐标变换。把杆件2的Solid模块与“杆件2质心至末端”刚体坐标变换模块的B
端口相连。需要注意的是,机器人机构是开式运动链,因此不能把“杆件2质心至
末端”刚体坐标变换模块的F端口与转动副1模块的B端口相连,这里“杆件2质心
至末端”刚体坐标变换模块的F端口暂时悬空。
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
在SimMechanics平台中调入World Frame模块、Mechanism Configuration模块、
Solver Configuration模块,分别把World Frame模块、Mechanism Configuration
模块、Solver Configuration模块与转动副1的B端口相连。将Mechanism
Configuration模块Gravity属性设置为[0 0 -9.80665],即重力加速度沿着绝对坐标
系的z轴负方向。本节介绍的两自由度机器人在绝对坐标系的xy平面内运动,因此
机器人不受重力的影响。

机器人的运动控制比一般机构复杂很多,这是因为人们期望机器人末端执行器到
达指定位置,这里的期望位置通常在任务空间中描述(绝对坐标系中描述),而
机器人控制器需要计算出机器人各关节的转动角度,这里的关节转角是在关节空
间中描述的。把机器人末端执行器位置映射为机器人各关节转角,称为机器人运
动学反解,可以通过MATLAB符号计算实现。需要注意的是,机器人的关节转角
由驱动电机控制,因此关节转角是相邻两杆件的相对角度,比如杆件1相对于绝对
坐标系x轴的夹角是q1,杆件2相对于杆件1的夹角是q2,那么杆件2相对于绝对坐
标系x轴的夹角是q1 + q2。若L1和L2表示机器人杆件1和杆件2的长度,q1和q2表
示机器人关节1和关节2的转角,x和y表示机器人末端执行器的指定位置,则
MATLAB符号计算程序如下:
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
syms L1 L2 q1 q2 x y
eqn1 = x == L1 * cos(q1) + L2 * cos(q1 + q2);
eqn2 = y == L1 * sin(q1) + L2 * sin(q1 + q2);
[q1, q2] = solve(eqn1, eqn2, q1, q2)
进而从Simulink平台中调入MATLAB Function模块,双击模块图标,填写以下机
器人运动学反解程序:
function [q1,q2] = fcn(x,y)
L1=1;
L2=0.5;
q1 = 2*atan((2*L1*y + (L1^2*((- L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2)*(L1^2 + 2*L1*L2 + L2^2 -
x^2 - y^2))^(1/2))/(- L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2) + (L2^2*((- L1^2 + 2*L1*L2 - L2^2 + x^2
+ y^2)*(L1^2 + 2*L1*L2 + L2^2 - x^2 - y^2))^(1/2))/(- L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2) - (x^2*((-
L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2)*(L1^2 + 2*L1*L2 + L2^2 - x^2 - y^2))^(1/2))/(- L1^2 + 2*L1*L2
- L2^2 + x^2 + y^2) - (y^2*((- L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2)*(L1^2 + 2*L1*L2 + L2^2 - x^2 -
y^2))^(1/2))/(- L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2) - (2*L1*L2*((- L1^2 + 2*L1*L2 - L2^2 + x^2 +
y^2)*(L1^2 + 2*L1*L2 + L2^2 - x^2 - y^2))^(1/2))/(- L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2))/(L1^2 +
2*L1*x - L2^2 + x^2 + y^2));
q2 = 2*atan(((- L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2)*(L1^2 + 2*L1*L2 + L2^2 - x^2 - y^2))^(1/2)/(-
L1^2 + 2*L1*L2 - L2^2 + x^2 + y^2));
end
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
从Simulink平台中调入2个Constant模块,将名称修改为“x坐标”和“y坐标”,修改
Constant数值为0.5和1,即期望机器人末端执行器到达(0.5m, 1m)坐标点位置。从Simulink
平台中调入2组PID Controller模块、Sum比较器模块、Simulink-PS Converter模块和PS–
Simulink Converter模块,从而构建机器人两个关节的控制器。分别双击2个转动副模块,如
图9.21所示,修改Actuation属性的Torque为Provided by Input,即转动副由输入力矩驱动;
勾选Sensing属性的Position项目,即输出转动副的角位移;另外,为了增强机械臂控制的
稳定性,需要设置关节的阻尼系数Damping Coefficient。把转动副的q端口与PS–Simulink
Converter模块的输入端口相连,把PS–Simulink Converter模块的输出端口与Sum比较器模
块的负号输入端口相连。分别将MATLAB Function模块的q1输出端口和q2输出端口与两个
Sum比较器模块的正号输入端口相连。将Sum比较器模块的输出端口与PID Controller模块
的输入端口相连,将PID Controller模块的输出端口与Simulink-PS Converter模块的输入端
口相连,将Simulink-PS Converter模块的输出端口与转动副的t端口相连,从而对转动副施
加驱动力矩。
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
为了观察机器人末端执行器在绝对坐标系中的运动情况,在SimMechanics平台中
调入Transform Sensor模块,如图9.22所示勾选Transform Sensor模块
Translation属性的X项目和Y项目。把Transform Sensor模块的B端口与World
Frame模块相连,把Transform Sensor模块的F端口与“杆件2质心至末端”刚体
坐标变换模块的F端口相连,把Transform Sensor模块的X端口和Y端口分别与2个
PS–Simulink Converter模块的输入端口相连,进而通过Simulink平台中的Scope
示波器模块观察机器人末端执行器的x坐标和y坐标随时间的变化情况,并通过
Simulink平台中的XY Graph模块观察机器人末端执行器的运动轨迹。
SimMechanics机械系统仿真
两自由度机器人SimMechanics仿真
最终构建的两自由度机器人的SimMechanics模型如图9.23所示。运行仿真程序后,
可以看到两自由度机器人的简易三维模型,如图9.24所示。仿真10秒时间内,机
器人末端执行器的x坐标和y坐标随时间的变化情况如图9.25所示,机器人末端执
行器的运动路径如图9.26所示。
SimMechanics机械系统仿真
三自由度机器人点位控制与连续轨迹控制
机器人操作臂的运动控制可以分为点位控制(P2P控制)和连续轨迹控制(CP控
制)两类。在上一节中介绍的控制方式就是点位控制,它只关心机器人末端执行
器到达指定的目标位置,不关心末端执行器从当前位置到目标位置的路径,图
9.26描述了点位控制的两自由度机器人末端执行器的运动路径。连续轨迹控制要
求机器人末端执行器按照指定路径运动,比如直线运动、圆弧运动,而且要求末
端执行器在运动路径上各点的运动速度满足要求。运动路径是几何学概念,运动
轨迹不仅是几何学概念,而且包含了速度和加速度信息。
本节将把两自由度机器人的简易三维模型扩展为三自由度机器人的较复杂的三维
模型,如图9.27所示。构建三自由度机器人的SimMechanics模型。
SimMechanics机械系统仿真
三自由度机器人点位控制与连续轨迹控制
对于平面三自由度机器人,可以要求末端执行器以指定的姿态(与绝对坐标系x轴
的夹角为theta),到达指定的目标位置(绝对坐标系中(x, y)坐标值)。因此需要
在MALTAB Function模块中进行机器人运动学反解。需要注意的是,机器人的关
节转角由驱动电机控制,因此关节转角是相邻两杆件的相对角度,比如连杆1相对
于绝对坐标系x轴的夹角是q1,连杆2相对于连杆1的夹角是q2,那么连杆2相对于
绝对坐标系x轴的夹角是q1 + q2,而连杆3相对于连杆2的夹角是q3,则连杆3相对
于绝对坐标系x轴的夹角是q1 + q2 + q3。

与机器人关节控制器相关的各模块的参数设
置:关节1的PID控制器模块的参数设置为
P=25、I=15、D=20,关节2的PID控制器模
块的参数设置为P=20、I=10、D=15,关节3
的PID控制器模块的参数设置为P=15、I=5、
D=10。
SimMechanics机械系统仿真
三自由度机器人点位控制与连续轨迹控制
假设三自由度机器人的杆长为:
L1 = 0.6; % 连杆1的长度0.6m
L2 = 0.5; % 连杆2的长度0.5m
L3 = 0.2+0.025; % 连杆3的长度0.2米,末端执行器几何中心长度0.025m
运行程序后,通过XY Graph模块观察到机器人末端执行器的运动路径如图9.54所
示。可以看出,尽管末端执行器到达了x=0.7、y=0.7、theta=pi/4的目标位置,但
运动路径比较杂乱。这种只关心目标位置,不关心运动路径的控制方式称为点位
控制。
SimMechanics机械系统仿真
三自由度机器人点位控制与连续轨迹控制
如果不仅要求机器人末端执行器以期望的姿态到达期望的位置,还要求末端执行
器在运动过程中以期望的速度沿着期望的路径运动,这种控制方式称为连续轨迹
控制。构建三自由度机器人末端执行器沿直线运动的SimMechanics模型。
SimMechanics机械系统仿真
三自由度机器人点位控制与连续轨迹控制
若要求机器人在5秒内匀速地从初始位置沿直线运动到x=0.7、y=0.7、theta=pi/4
的目标位置,则从Simulink平台中调入Clock时钟模块,再调入3个Fcn函数模块,
分别表示x、y、theta与时间变量u之间的函数关系:
x = 1.325 + (0.7 – 1.325) / 5 * u % 其中1.325是末端执行器初始时刻的x坐标
y = 0.7 / 5 * u % 其中5是指5秒到达指定位置
theta = pi /4 /5 * u % 其中 pi / 4是机器人在目标位置处的姿态
SimMechanics机械系统仿真
三自由度机器人点位控制与连续轨迹控制
图9.55中Switch模块是为了使机器人在5秒以后停留在5秒时的x=0.7、y=0.7、
theta=pi/4的目标位置。关节1的PID控制器模块的参数设置为P=120、I=60、
D=80,关节2的PID控制器模块的参数设置为P=60、I=30、D=40,关节3的PID控
制器模块的参数设置为P=30、I=15、D=20。运行程序后,通过XY Graph模块观
察到机器人末端执行器的运动路径如图9.56所示。对比图9.56与图9.54可以看出,
连续轨迹控制避免了点位控制造成的运动路径杂乱的状况。图9.56中,初始阶段
和末尾阶段的运动路径不是直线,这是由于初始和末尾阶段处机器人运动速度发
生突变,末端执行器受到机器人惯性力影响而不能沿直线运动。这也说明,为了
取得较好的轨迹跟踪效果,机器人连续轨迹控制不能采用简单的PID控制,而要
设计更好的控制算法。
从控制的角度看,机器人点位控制,属于控制理论中的镇定问题;机器人连续轨
迹控制,属于控制理论中的跟踪问题。机器人的目标位置或运动轨迹可以在任务
空间中描述,也可以通过反向运动学映射到关节空间中描述。在工业应用中,为
了使机器人能够精确地跟踪期望路径,通常将期望路径离散为若干路径点,使机
器人在相邻路径点之间做插补运动。
SimMechanics机械系统仿真
SimMechanics平台与CAD软件关联
SimMechanics平台的优势在于机械系统的动力学仿真和控制系统分析,但目前
SimMechanics平台的三维建模能力相对于专业CAD软件来说比较薄弱。MATLAB
提供了SimMechanics Link插件,可以将Solidworks、Creo、Inventor软件中的装
配体模型导入SimMechanics平台。本节介绍Solidworks软件与SimMechanics平
台关联的方法。首先需要在
https://www.mathworks.cn/products/simmechanics/download_smlink.html网站中
下载与MATLAB版本对应的SimMechanics Link插件的安装文件(例如
smlink.r2014a.win64.zip)以及install_addon.m文件,并将这两个文件放入
MATLAB的当前工作文件夹中。在MATLAB命令窗口运行安装插件的命令:
>> install_addon('smlink.r2014a.win64.zip')
待MATLAB提示插件安装成功后,再运行命令将插件与Solidworks关联:
>> smlink_linksw
运行Solidworks软件,在“工具”菜单的“插件”子菜单中,勾选
“SimMechanics Link”项目。这样在Solidworks主菜单中会增加
“SimMechanics Link”菜单。在“SimMechanics Link”菜单的“Export”子菜
单中选择“SimMechanics Second Generation”,就可以把Solidworks装配体文
件导出为一个XML文件(对应于装配体)和若干个STL文件(对应于零件)。
SimMechanics机械系统仿真
SimMechanics平台与CAD软件关联
例如,在Solidworks平台中建立如图9.57所示的六自由度KUKA机器人的三维模型,
有1个装配体文件和7个零件文件,那么将导出1个XML文件(KukaRobot.xml)和
7个STL文件。然后在MATLAB命令窗口中运行以下smimport命令,MATLAB将读
取相应的XML文件和STL文件,并自动构建KUKA机器人的SimMechanics模型,
如图9.58所示。
>> smimport(‘KukaRobot.xml’)
SimMechanics机械系统仿真
SimMechanics平台与CAD软件关联
图9.58中,Joint0_1_RIGID、Joint1_1_RIGID、Joint2_1_RIGID、
Joint3_1_RIGID、Joint4_1_RIGID、Joint5_1_RIGID、Joint6_1_RIGID模块都是
封装模块,双击封装模块图标可以进入模块内部,例如Joint1_1_RIGID模块的内
部结构如图9.59所示。其中Solid模块参数情况如图9.60所示,Transform模块参数
情况如图9.61所示,Transform1模块参数情况如图9.62所示。这些模块参数都是
MATLAB通过读取XML文件和STL文件自动生成的。图9.58中,6个转动副是
MATLAB根据Solidworks装配体文件中的轴孔配合约束而自动识别出的。
Solidworks装配体文件中作为固定件的零件(图9.58中的Joint0_1_RIGID模块)
将与SimMechanics模型中的World Frame模块固连。
为了构建完整的六自由度KUKA机器人仿真模型,需要对MATLAB自动构建的
SimMechanics模型作修改。把重力加速度方向改为-z轴方向,即在Mechanism
Configuration模块中将Gravity属性修改为[0 0 -9.81]。再按照本章前几节介绍的方
法,为机器人的6个转动副添加驱动力矩和控制器,从而建立完整的KUKA机器人
SimMechanics模型。
SimMechanics机械系统仿真
SimMechanics平台与CAD软件关联
Mathematica符号计算
MATLAB / MuPad 符号计算的不足之处
对于3自由度平面机械臂位置反解问题,若L1、L2、L3表示机器人连杆1、连杆2、
连杆3(从转动副3的轴线到末端执行器的几何中心)的长度,q1、q2、q3表示机
器人关节1、关节2、关节3的转角,x和y表示机器人末端执行器的指定位置,
theta表示机器人末端执行器的指定姿态,则MATLAB符号计算程序如下:
syms L1 L2 L3 q1 q2 q3 x y theta
eqn1 = x == L1 * cos(q1) + L2 * cos(q1 + q2) + L3 * cos(theta);
eqn2 = y == L1 * sin(q1) + L2 * sin(q1 + q2) + L3 * sin(theta);
eqn3 = theta == q1 + q2 + q3;
[q1, q2, q3] = solve(eqn1, eqn2, eqn3, q1, q2, q3)

需要注意的是,上述程序在MATLAB或者MuPad中都不容易求解。需要对方程做
些改动,便于MATLAB求解:
syms q1 q2 q3 L1 L2 L3 x y theta
syms u v
eqn1 = L1 * cos(q1) + L2 * cos(q1 + q2) == u; %其中u为x - L3 * cos(theta)
eqn2 = L1 * sin(q1) + L2 * sin(q1 + q2) == v; %其中v为y - L3 * sin(theta)
[q1, q2] = solve(eqn1, eqn2, q1, q2)
Mathematica符号计算
使用Mathematica软件
eqn1=xL1*Cos[q1]+L2*Cos[q1+q2]+L3*Cos[theta];
eqn2=yL1*Sin[q1]+L2*Sin[q1+q2]+L3*Sin[theta];
eqn3=thetaq1+q2+q3;
Solve[{eqn1,eqn2,eqn3},{q1,q2,q3}]

Mathematica语法特点:
1、系统自带函数的首字母大写,如Cos、Sin、Solve
2、函数的输入参数用中括号[],而不是小括号()
3、乘号可以用空格代替,比如用L1 Cos[q1]代替L1*Cos[q1]
4、数组用大括号{},而不是中括号[]
5、Solve函数的输入参数分为两组,第一组是方程,第二组是未知数

Mathematica软件的符号计算功能十分强大,很容易自学,帮助文档十分全面。
MATLAB在数字信号处理中的应用
信号的生成和运算
信号可以分为连续时间信号(也称为模拟信号)和离散时间信号(包括时间离散
而幅值连续的采样信号和时间离散而幅值量化的数字信号)两大类。模拟信号在
时间和幅值上都连续变化,包括确定信号、周期信号、能量信号等。数字信号在
某些不连续的时间点上有信号值,而在其它时间点上没有定义。
严格来说,MATLAB不能处理模拟信号。在MATLAB中,通过信号在足够小的时
间间隔的采样值来近似地表达模拟信号。常用的模拟信号有直流信号、正弦信号、
阶跃信号等。下文用f(t)表示模拟信号,其中t表示时间变量。
MATLAB生成直流信号f(t) = 5的程序如下:
>> t = 0:0.01:10; %时间10秒,采样时间间隔0.01秒
>> f = 5;
>> plot(t, f, ‘r’);
MATLAB生成正弦信号f(t) = 10 sin(πt)的程序如下:
>> t = 0:0.01:10; %时间10秒,采样时间间隔0.01秒
>> f = 10*sin(pi*t);
>> plot(t, f, ‘r’);
MATLAB在数字信号处理中的应用
信号的生成和运算
MATLAB生成单位阶跃信号的程序如下:
>> t = -5:0.01:5; %时间10秒,采样时间间隔0.01秒
>> f = (t>=0);
>> plot(t, f, ‘r’);
MATLAB生成单位脉冲信号的程序如下:
t = -5:0.01:5; %时间10秒,采样时间间隔0.01秒
n = length(t); %时间样本的长度
x = zeros(1, n); %各采样点信号赋初值为0
k = floor(5/0.01); %浮点数表示k
x(k) = 1/0.01; %第k个采样点处赋值1/0.01,近似表达无穷大
stairs(t, x); %绘图
MATLAB生成符号信号f(t) = sign(t)的程序如下:
>> t = -5:0.01:5; %时间10秒,采样时间间隔0.01秒
>> f = sign(t); %直接调用MATLAB函数
>> plot(t, f, ‘r’);
MATLAB在数字信号处理中的应用
信号的生成和运算
数字信号可以通过模数转换(AD转换)由模拟信号得到,计算机只能处理数字信
号。常用的数字信号有正弦信号序列、阶跃信号序列、随机序列等。下文用x(n)
表示数字信号,其中n表示信号序列的索引。
MATLAB生成基本数字信号的程序如下:
>> n = 1:10; %数字信号索引
>> x = [2, -1, 3, 2, 0, -3, 4, 1, -2, 3]; %数字信号序列值
>> stem(n, x);
MATLAB生成单位脉冲数字信号的程序如下:
>> n = 1:10; %序列长度
>> x = [(n-3)==0]; %单位脉冲出现在序列索引为3的位置
>> stem(n, x);
MATLAB生成单位阶跃数字信号的程序如下:
>> x1 = ones(1, 5);
>> x0 = zeros(1, 5);
>> stem(-5:-1, x0);
>> hold on
>> stem(0:4, x1); %阶跃信号从序列索引为0处开始
>> hold off
MATLAB在数字信号处理中的应用
信号的生成和运算
MATLAB生成正弦数字信号的程序如下:
>> n = 0:99;
>> x = sin(n/pi);
>> stem(n, x);
MATLAB生成随机数字信号的程序如下:
>> n = 50; %随机信号序列长度为50
>> x = rand(n, 1) - 0.5;
>> stem(0:n-1, x);

在MATLAB中进行两信号的加减法或乘法运算,要求两信号的采样时间相同,序
列长度相同。例如:
>> t = 0:0.01:5;
>> f = exp(-2*t); %指数信号
>> g = 0.5*sin(4*pi*t); %正弦信号
>> h = f + g; %两信号的加法运算
>> k = f .* g; %两信号的乘法运算,两数组对应元素相乘为".*"
MATLAB在数字信号处理中的应用
信号的生成和运算
>> subplot(2, 2, 1); plot(t, f);
>> subplot(2, 2, 2); plot(t, g);
>> subplot(2, 2, 3); plot(t, h);
>> subplot(2, 2, 4); plot(t, k);
在MATLAB中采用y = conv(h, g)实现两信号的卷积运算,运算结果y信号的长度是
输入信号h和g的长度之和再减一。两方波信号的卷积程序如下:
>> g = [ones(1, 20), zeros(1, 20)];
>> Lg = length(g); %信号g的序列长度为40
>> h = [ones(1, 10), zeros(1, 20)];
>> Lh = length(h); %信号h的序列长度为30
>> y = conv(g, h);
>> Ly = length(y); %信号y的序列长度为69
>> subplot(3,1,1);
>> plot(1:Lg, g);
>> subplot(3,1,2);
>> plot(1:Lh, h);
>> subplot(3,1,3);
>> plot(1:Ly, y);
MATLAB在数字信号处理中的应用
信号的频谱分析
信号可以在时间域中描述,也可以在频率域中描述。将信号的时域描述通过数学
处理变换为频域描述的过程称为信号的频谱分析。频谱包括幅值谱、相位谱、功
率谱、幅值谱密度、功率谱密度等。
根据傅里叶级数原理,任何周期信号都可以分解为一系列正弦信号的叠加。例如
时域方波信号f(t)可以表达为:

4A 1
f (t )  
 n1 2n  1
sin  2n  1 t

其中ω是方波频率,A是方波幅值,n是谐
波阶次。通过叠加正弦信号来合成波形时,
所包含的谐波分量越多,合成波形越接近
于理想波形。但在间断点附近,即使合成
波形包含无穷多谐波分量,合成波形仍会
与理想波形有偏差,这称为吉布斯现象
(Gibbs现象),如图10.1所示的方波信号
在间断点处存在吉布斯现象。吉布斯现象
是由于傅里叶级数展开式在间断点临域不
能均匀收敛。
MATLAB在数字信号处理中的应用
信号的频谱分析
以下MATLAB脚本程序采用正弦信号的叠加来合成频率2Hz、幅值为5的方波:
t = 0:0.0001:1; %方波时域长度1秒
w = 2*pi*2; %方波频率2Hz
A = 5; %方波幅值为5
subplot(2,1,1);
for n = 1:5 %采用5组正弦波形
plot(t, 4*A/pi*1/(2*n-1)*sin((2*n-1)*w*t));
hold on;
end
title('5组正弦信号');
subplot(2,1,2);
sum = 0;
for n = 1:5
sum = sum + 4*A/pi*1/(2*n-1)*sin((2*n-1)*w*t);
end
plot(t, sum);
title('合成的方波信号');
MATLAB在数字信号处理中的应用
信号的频谱分析
MATLAB采用fft命令将时域信号通过离散傅里叶变换转变为频域信号,采用abs命
令获取频域信号的幅频特性,采用angle命令获取频域信号的相频特性。
若已知离散周期信号x(n) = sin(n π/16) + 2 cos(n π/5),离散周期信号的频谱是离
散谱,则MATLAB计算信号幅频特性和相频特性的脚本程序如下:
N = 32; %对于离散周期信号,只需要对一个周期内的数值进行fft运算
n = 0:N-1; %数字信号序列索引
x = sin(pi/16*n) + 2*cos(pi/5*n);
xf = fft(x, N); %离散傅里叶变换
subplot(1,2,1);
%频谱平移后的幅频特性
stem(n-N/2, abs(fftshift(xf)));
xlabel('频谱特性');
ylabel('幅值');
subplot(1,2,2);
%频谱平移后的相频特性
stem(n-N/2, angle(fftshift(xf)));
xlabel('频谱特性');
ylabel('相位');
MATLAB在数字信号处理中的应用
信号的频谱分析
若已知离散非周期信号x(n) = 0.8n,离散非周期信号的频谱是连续谱,则MATLAB
计算信号幅频特性的脚本程序如下:
N = 32; %当信号序列索引n大于32时,信号几乎衰减为0
n = 0:N-1;
x = 0.8.^n; %注意运算符为“.^”
subplot(1,2,1);
stem(n, x);
title('时域波形');
subplot(1,2,2);
%频谱平移后的幅频特性
plot(n-N/2, abs(fftshift(fft(x))));
title('幅频特性');
MATLAB在数字信号处理中的应用
数字音频信号处理
机械工程信号测试时,通常需要对传感器获取的信号滤除高频噪声。MATLAB提
供了强大的信号处理工具箱,可以帮助我们设计各种类型的数字滤波器。本节介
绍MATLAB处理音频信号的过程,这里的音频信号可以是电脑中的一段音乐。
若需要使用MATLAB信号处理工具箱的
滤波器设计功能,可以在MATLAB命令
窗口中输入filterbuilder命令:
>> filterbuilder
根据需要选择滤波器类型,如图10.4所
示为低通滤波器设计界面。需要在设计
界面中填写滤波器名称,例如Hlp;滤
波器类型,例如IIR滤波器;通带频率,
例如5000Hz;阻带频率,例如6000Hz;
设计方法,例如Butterworth巴特沃斯滤
波器。这样设计好滤波器后,可以在
MATLAB环境中通过滤波器名称Hlp来
使用滤波器。
MATLAB在数字信号处理中的应用
数字音频信号处理
下面的MATLAB程序展示了对双声道音频信号的处理过程:
[audio, FS] = audioread('audio name.wav'); %通过audioread命令读入音频文件
audioLeft = audio(:, 1); %提取音频文件左声道数据信息
audioRight = audio(:, 2); %提取音频文件右声道数据信息
subplot(3,2,1);
plot(audioLeft); %绘制左声道时域波形
title('左声道时域波形');
subplot(3,2,2);
plot(audioRight); %绘制右声道时域波形
title('右声道时域波形');

[M, N] = size(audio);
m = 0:M-1;
FAudio = fft(audio); %音频信号的傅里叶变换
absAudio = abs(fftshift(FAudio)); %音频信号的幅频特性
angAudio = angle(fftshift(FAudio)); %音频信号的相频特性
subplot(3,2,3);
plot(m-M/2, absAudio);
MATLAB在数字信号处理中的应用
数字音频信号处理
title('声音信号的幅频特性');

subplot(3,2,4);
plot(m-M/2, angAudio);
title('声音信号的相频特性');

audioNew = filter(Hlp, audio); %用上文设计的Hlp低通滤波器去除高频分量


subplot(3,2,5);
plot(audioNew); %绘制滤波后的双声道时域波形
title('滤波后的时域波形');
FAudioNew = fft(audioNew); %滤波后的音频信号的傅里叶变换
subplot(3,2,6);
plot(m-M/2, abs(fftshift(FAudioNew)));
title('滤波后的幅频特性');
%用audiowrite命令产生新音频文件
audiowrite('new audio name.wav', audioNew, FS);
MATLAB在数字信号处理中的应用
数字音频信号处理
上述程序所绘制的滤波前后时域和频率中音频信号如图10.5所示。对比图中左声
道时域波形和滤波后双声道的时域波形,可以看出滤波后新的音频信号比原始信
号平滑。
MATLAB在数字信号处理中的应用
数字图像信号处理
数字图像处理在现代机械工程中应用广泛,比如通过铸造件的X光探伤照片来查
找气孔和裂纹等铸造缺陷,再如通过机器视觉技术使工业机器人智能识别出颜色
不同的物料。MATLAB提供了强大的数字图像处理工具箱,可以帮助我们进行图
像增强、噪声过滤、边缘提取、对象识别等操作。
本节介绍MATLAB处理灰度图像的基本过程。与矢量化的图形不同,数字图像是
一组点阵数据,其中每个元素称为像素。灰度图像的像素值是在0到255之间的一
个整数,其中0表示像素纯黑,255表示像素纯白。MATLAB数字图像工具箱通过
imread命令读取图片文件,通过imwrite命令写新图片文件,使用fft2命令将图像从
空间域变换到频率域,使用histeq命令进行灰度图像的直方图均衡化。下面程序
通过直方图均衡化实现车轮灰度图像的增强,从而能够观察到车轮的细节特征:
tire = imread('tire.tif'); %读取车轮图片
[M, N] = size(tire); %获取图片像素值
imshow(tire) %显示车轮图片
figure, mesh(double(tire)) %显示车轮图片灰度值
tire_histeq = histeq(tire); %直方图均衡化
figure, imshow(tire_histeq) %显示直方图均衡化后的图片
figure, mesh(double(tire_histeq)) %显示直方图均衡化后的图片灰度值
MATLAB在数字信号处理中的应用
数字图像信号处理
%通过傅里叶变换获取车轮图片频域信息
FTire = fft2(tire);
FTire_fftshift = fftshift(FTire); %频域图像数据重排
figure, mesh(log(1 + abs(FTire_fftshift))) %显示频域图像的log值
%通过傅里叶变换获取直方图均衡化后图片频域信息
FTire_histeq = fft2(tire_histeq);
FTire_histeq_fftshift = fftshift(FTire_histeq); %频域图像数据重排
figure, mesh(log(1 + abs(FTire_histeq_fftshift))) %显示频域图像的log值
imwrite(tire_histeq,'tire_histeq.tif');
上述程序运行后,车轮原始图片如图10.6所示,直方图均衡化后的车轮图片如图
10.7所示,可以看出直方图均衡化后能够清晰观察到车轮的细节特征;车轮原始
图片点阵像素的灰度值如图10.8所示,直方图均衡化后车轮图片点阵像素的灰度
值如图10.9所示,可以看出直方图均衡化后图片中部有明显的圆形像素分布,这
些圆形像素是高亮度值的车轮轮毂;车轮原始图片的频域信息如图10.10所示,直
方图均衡化后车轮图片的频域信息如图10.11所示,可以看出直方图均衡化后图像
的频率波动较小。
MATLAB在数字信号处理中的应用
数字图像信号处理

You might also like