MATLAB编程入门

Download Report

Transcript MATLAB编程入门

MATLAB编程入门
目 录
第1章 MATLAB简介
第2章 MATLAB基本语法
2.1 变量及其赋值
2.2 矩阵的初等运算
2.3 元素群运算
2.4 逻辑判断及流程控制
2.5 基本绘图方法
2.6 M文件及程序调试
第3章 MATLAB在电路中的应用
3.1 电阻电路
3.2 动态电路
3.3 正弦稳态电路
3.4 频率响应
3.5 二端口电路
第一章 MATLAB简介
MATLAB(MATrix LABoratory,即矩阵实验室)是
MathWork公司推出的一套高效率的数值计算和可视化软件。
MATLAB是当今科学界最具影响力、也是最具活力的软件,
它起源于矩阵运算,并已经发展成一种高度集成的计算机语言。
它提供了强大的科学运算、灵活的程序设计流程、高质量
的图形可视化与界面设计、便捷的与其他程序和语言接口的功
能。
MATLAB语言有如下优点:
1.编程简单使用方便
MATLAB的基本数据单元是既不需要指定维数、也不需要
说明数据类型的矩阵,而且数学表达式和运算规则与通常的习
惯相同。因此,在MATLAB环境下,数组的操作与数的操作
一样简单。
MATLAB的矩阵和向量操作功能是其他语言无法比拟的。
2.函数库可任意扩充
由于MATLAB语言库函数与用户文件的形式相同,所以
用户文件可以像库函数一样随意调用。所以用户可根据自己
的需要任意扩充函数库。
3.语言简单内涵丰富
MATLAB语言中最重要的成分是函数,其一般形式为:
Function [a,b,c…]=fun(d,e,f…)
fun是自定义的函数名,只要不与库函数名相重,并且
符合字符串的书写规则即可。这里的函数既可以是数学上的
函数,也可以是程序块或子程序,内涵十分丰富。每个函数
建立一个同名的M文件,如上述函数的文件名为fun.m。这种
文件简单、短小、高效,并且便于调试。
4.简便的绘图功能
MATLAB具有二维和三维绘图功能,使用方法十分简便。
而且用户可以根据需要在坐标图上加标题。坐标轴标记。文
本注释及栅格等,也可一指定图线形式(如实线、虚线等)和
颜色,也可以在同一张图上画不同函数的曲线,对于曲面图
还可以画出等高线。
5.丰富的工具箱
由于MATLAB的开放性,许多领域的专家都为MATLAB
编写了各种程序工具箱。
这些工具箱提供了用户在特别应用领域所需的许多函数,
这使得用户不必花大量的时间编写程序就可以直接调用这些
函数,达到事半功倍的效果。
第二章 MATLAB基本语法
2.1 变量及其赋值
(1)标识符与数
标识符是标识变量名、常量名、函数名和文件名的字符
串的总称。标识符可以是英文字母、数字和下划线等符号。
标识符第1个字符必须是英文字母,MATLAB对大、小写敏
感。
MATLAB只有一种数据格式,双精度(即64位)二进制,
对应于十进制16位有效数和±308次幂。
(2)矩阵及其元素的赋值
变量=表达式(数)
a=[1 2 3; 4 5 6;7 8 9]
x=[-1.3 sqrt(3) (1+2+3)/5*4]
x(5)=abs(x(1))
a(4,3)=6.5
a=
1.0000
2.0000
3.0000
4.0000
7.0000
0
5.0000
8.0000
0
6.0000
9.0000
6.5000
a(5,:)=[5,4,3]
b=a([2,4],[1,3])
a([2,4,5], : )=[]
a/7
元素之间用逗号、空格分开。不同行以分
号隔开。语句结尾用回车或逗号,会显示
结果,如果不想显示结果,用分号。
元素用()中的数字(下标)来注明,一
维用一个下标,二维用两个下标,逗号分
开。
如果赋值元素的下标超过原来矩阵的大
小,矩阵的行列会自动扩展。
全行赋值,用冒号。
提取交点元素;
抽取某行元素用空矩阵。
(3)复数
c=3+5.2i
z=[1+2i,3+4i; 5+6i,7+8i]
z=[1,3; 5,7]+[2,4; 6,8]*i
f=sqrt(1+2i)
f*f
w=z’ (共轭转置)
u=conj(z) (共轭)
v=conj(z)’ (转置)
复数的虚数部分用i或j表示,如
曾用过i, j 作变量,用clear i,j
复数矩阵有两种赋值方法:
①将其元素逐个赋予复数;
②将其实部和虚部矩阵分别赋值。
Z’复数矩阵共轭转置:行列互换,
各元素的虚部反号。
函数conj(z)共轭:只把各元
素的虚部反号。
转置conj(z)’:行列互换。
z = 1.0000 + 2.0000i 3.0000 + 4.0000i
5.0000 + 6.0000i 7.0000 + 8.0000i
w=z'(共轭转置)
w = 1.0000 - 2.0000i 5.0000 - 6.0000i
3.0000 - 4.0000i 7.0000 - 8.0000i
u=conj(z) (共轭)
u = 1.0000 - 2.0000i 3.0000 - 4.0000i
5.0000 - 6.0000i 7.0000 - 8.0000i
v=conj(z)’ (转置)
v = 1.0000 + 2.0000i 5.0000 + 6.0000i
3.0000 + 4.0000i 7.0000 + 8.0000i
(4)变量检查
who
whos
inf
NaN
检查工作空间中的变量;
检查变量的详细特征
无穷大 1/0;
非数(Not a Number) 0/0 inf/inf 0*inf。
系统不停止运算,结果仍为inf或NaN。
(5)基本赋值矩阵
f1=ones(3,2)
f2=zeros(2,3)
f3=magic(3)
f4=eye(2)
f5=linspace(0,1,5)
fb1=[f1,f3;f4,f2]
fb2=[fb1;f5]
全1矩阵
全0矩阵
魔方矩阵:元素由1到nn的自然数组成,每行、每
列及两对角线上的元素之和均等于(n3+n)/2。
单位矩阵是n×n阶的方阵。对角线上元素为1。
线性分割函数
大矩阵可由小矩阵组成,其行列数必须正确,恰
好填满全部元素。
f1 =
1
1
1
1
1
1
0
0
0
0
0
0
f4 =
1
0
0
1
单位矩阵
全1矩阵
8 1 6 魔方矩阵
3 5 7
4 9 2
线性分割函数
f5 = 0 0.2500 0.5000 0.7500 1.0000
大矩阵可由小矩阵组成
fb2 =1.0000 1.0000 8.0000 1.0000 6.0000
1.0000 1.0000 3.0000 5.0000 7.0000
1.0000 1.0000 4.0000 9.0000 2.0000
1.0000
0
0
0
0
0 1.0000
0
0
0
0 0.2500 0.5000 0.7500 1.0000
f3 =
全0矩阵
f2 =
fb1 =
1
1
1
1
0
1
1
1
0
1
fb1=[f1,f3;f4,f2]
fb2=[fb1;f5]
8
3
4
0
0
1
5
9
0
0
6
7
2
0
0
2.2 矩阵的初等运算
(1)矩阵的加减乘法
i. 加、减法:相加减的两矩阵阶数必须相同,
对应元素相加减。
[n,m]=size(fb2)
x=[-1 0 1]; y=x-1
y=
-2
-1
0
语句size检查矩阵阶数,两矩阵
相加,阶数必须相同。
两相加减的矩阵中有一个是标
量时,MATLAB将标量扩展成
同等元素矩阵,与另一矩阵相
加减。
ii.矩阵乘法
矩阵A n×p阶与矩阵B p×m阶的乘积 C是n×m阶矩阵。
P是A阵的列数,B阵的行数,称为两个相乘矩阵的内阶数。
两矩阵相乘的必要条件是内阶数相等。
C(i,j)=ΣkA(i,k)·B(k,j)值为A阵第i行和B阵第j列对应元素乘积的和。
标量与矩阵相乘,不检查阶数,标量乘以矩阵的每一个元素。
X与y内阶数不同,将y转置 y’。读作x左乘y’。
pi*x
x=[-1 0 1];
y =[-2 -1 0];
x*y’
ans = 2
y‘*x
X右乘y’。
1
0
0
-2
0 -1
0 0
左、右乘结果不同,只有单位矩阵例外。
单位矩阵乘以矩阵A,左、右乘结果仍等于该矩阵。
eye(3)*a
a*eye(3)
a=1 2
4 5
7 8
ans = 2
3
6
9
ans =
1
4
7
2
5
8
3
6
9
ans =
1
4
7
2
5
8
3
6
9
(2)矩阵的除法及线性方程组的解
a =1
4
7
2
5
8
AV=I
V=inv(a)
3
6
9
V=A-1
inv(a)*a
n×n阶方阵A和同阶的方阵V相乘,得出n阶单位矩阵I。
I为eye(n)。
V是A的逆阵。V存在条件:A的行列式不等于0,
det(A)≠0
V=A-1 MATLAB内部函数inv,得出A的逆阵V。
V = 1.0e+016 *
-0.4504 0.9007 -0.4504
0.9007 -1.8014 0.9007
-0.4504 0.9007 -0.4504
D*X=B
inv(D)*D*X=inv(D)*B
inv(D)*D=I
I*X=X
X=inv(D)*B=D\B
X*D=B
X=B*inv(D)=B/D
D与B行数相等
两端同时左乘以inv(D) 逆阵
单位阵
D\B为D左除B
X=D\B,左除时阶数检查条件:两矩阵的行数必须相等。
未知矩阵在左. D的逆阵右乘以B,记作 /D 右除。
右除时阶数检查条件:两矩阵的列数必须相等。
a=[1 2 3; 3 -5 4; 7 8 9]
x=[x1,x2,x3]
b=[2;0;2]
ax'=b
x=a\b
a左除b
方程组 X1+2X2+3X3=2
3X1- 5X2+4X3=0
7X1+8X2+9X3=2
可以表示为ax’=b
a=[1 2 3;4 5 6]
b=[2 4 0; 1 3 5]
d=[1 4 7; 8 5 2; 3 6 0]
运算:a*b d\a
a'*b
a*b
??? Error using ==> *
Inner matrix dimensions must agree.
d\a
??? Error using ==> \
Matrix dimensions must agree.
a*b'
ans =
6 16 20
9 23 25
12 30 30
10
28
d\a'
ans =
22
49
ans =
-0.0370
0.5185
-0.1481
a/d
0
1.0000
0
ans =
0.4074
0.7407
0.0741
0.4074
0.0000
0.0000
解线性方程组Ax=B
6x1+3x2+4x3=3
-2 x1+5 x2+7 x3=-4
8 x1-4 x2-3 x3=-7
A=[6 3 4; -2 5 7; 8 -4 -3]
B=[3;-4; -7]
X=A\B
A=
6 3
-2 5
8 -4
B= 3
-4
-7
X = 0.6000
7.0000
-5.4000
4
7
-3
(3)矩阵的乘方和幂次函数
MATLAB的运算符*、/、\、和^,指数函数expm、对数函数logm和开方
函数sqrtm是对矩阵进行的,即把矩阵作为一个整体来运算。除此以外,
其他MATLAB函数都是对矩阵中的元素分别进行,英文直译为数组运算
(Array Operations),译为“元素群运算”
S=[1 2; 3 4]
D=[1 4 7; 8 5 2; 3 6 0]
D^2
2.^D
D^S
U1=sqrtm(S)
U2=sqrt(S)
V1=expm(S)
V2=exp(S)
Logm(D)
Log(D)
幂次运算:矩阵为底数,指数是标量,同矩阵乘法一样,
为保内阶数相同,底数的矩阵必须是方阵。矩阵是指数,
底数是标量,矩阵也必须是方阵。底数和指数不能同时
为矩阵。
按矩阵运算,等于D* D
按元素群运算
非法运算
按矩阵运算,求平方根,可以用U1* U1=S验证
按元素群运算,U2* U2≠S,U2.×U2=S
按矩阵运算
按元素群运算
按矩阵运算
按元素群运算
S =1 2
3 4
D=1 4
8 5
3 6
D^2 ans =
2.^D
7
2
0
54 66 15
54 69 66
51 42 33
ans = 2 16 128
256 32 4
8 64 1
D^S
??? Error using ==> ^
At least one operand must be scalar.
V1=expm(S)
V1 = 51.9690 74.7366
112.1048 164.0738
V2=exp(S)
V2 = 2.7183 7.3891
20.0855 54.5982
U1=sqrtm(S)
U1 =0.5537 + 0.4644i 0.8070 - 0.2124i
1.2104 - 0.3186i 1.7641 + 0.1458i
U2=sqrt(S)
U2 = 1.0000
1.7321
1.4142
2.0000
Logm(D)
ans = 1.2447 -0.9170 2.8255
1.6044 2.5760 -1.9132
-0.7539 1.1372 1.6724
log(D)
Warning: Log of zero.
ans =
0 1.3863 1.9459
2.0794 1.6094 0.6931
1.0986 1.7918
-Inf
(4)矩阵结构形式的提取与变换
A=[8 1 6 0; 3 5 7 1; 4 9 2 2] 提取矩阵中某些特殊结构的元素,
组成新的矩阵,改变矩阵结构。
B1=fliplr(A)
fliplr矩阵左右翻转
B2=flipud(A)
flipud矩阵上下翻转
B3=reshape(A,2,6)
reshape阶数重组(元素总数不变)
B4=rot90(A)
B5=diag(A)
rot90矩阵整体反时针旋转90度
diag提取或建立对角阵
B6=tril(A)
B7=triu(A)
B8=A(: )'
tril取矩阵的左下三角部分
triu取矩阵的右上三角部分
将元素按列取出排成一列
A=
8 1 6 0
3 5 7 1
4 9 2 2
B1=fliplr(A)
B1 =
0 6 1 8
1 7 5 3
2 2 9 4
B2=flipud(A)
B2 =
4 9 2 2
3 5 7 1
8 1 6 0
B3=reshape(A,2,6)
B3 =
8 4 5 6 2
3 1 9 7 0
1
2
B4=rot90(A)
B4 = 0 1
6 7
1 5
8 3
B5=diag(A)
B5 = 8
5
2
B6=tril(A)
B6 =
8 0 0
3 5 0
4 9 2
B7=triu(A)
B7 =
8 1 6
0 5 7
0 0 2
B8=A(: )'
B8 =8 3 4
2
2
9
4
0
0
0
0
1
2
1
5
9
6
7
2
0
1
2
2.3 元素群运算
(1)数组及其赋值
数组是单行或单列的矩阵,一个N阶的数组可以表述为一个N
组向量。
用两个冒号组成等增量语句
t=[0 : 0.02 : 1]
格式:t=[初值:增量:终值]
z=10 : -3: -5
增量也可以设为负值,此时初值要比终值大
k=1 : 6
增量为1时,增量值可以省略。
t=
0
0.1400
0.2800
0.4200
0.5600
0.7000
0.8400
0.9800
z = 10
0.0200
0.1600
0.3000
0.4400
0.5800
0.7200
0.8600
1.0000
7
4
0.0400
0.1800
0.3200
0.4600
0.6000
0.7400
0.8800
1
-2
0.0600
0.2000
0.3400
0.4800
0.6200
0.7600
0.9000
-5
0.0800
0.2200
0.3600
0.5000
0.6400
0.7800
0.9200
k=
1
0.1000
0.2400
0.3800
0.5200
0.6600
0.8000
0.9400
2
3
0.1200
0.2600
0.4000
0.5400
0.6800
0.8200
0.9600
4
5
6
用linspace函数
theta= linspace (0, 2*pi, 9)
格式:linspace(初值、终值、点数)
logspace函数,自变量按等比级数赋值。
从10的0次幂到1次幂之间按幂等分为11点
w=logspace (0, 1, 11)
(数是等比的)
theta =
w=
0 0.7854 1.5708 2.3562 3.1416
3.9270 4.7124 5.4978 6.2832
1.0000
3.9811
1.2589 1.5849 1.9953 2.5119 3.1623
5.0119 6.3096 7.9433 10.0000
(2)元素群的四则运算和幂次运算
元素群的运算是矩阵中所有元素按单个元素运算。运算符前加.号,表
示元素群运算。
元素群的运算的两个矩阵必须是同阶的。(标量会自动扩展为同阶矩
阵参与运算)
x=[1, 2, 3]
y=[4, 5, 6]
z =4 10 18
x*y不能成立
z=x.*y
z =4.0 2.5 2.0 元素群没有左除右除之分
z=x.\y
z =1 32 729 x^y 能成立吗?
z=x.^y
z =1 4 9
x^2能成立吗?
z=x.^2
z =2 4 8 16 32 64 2^[x y] 能成立吗?
z=2.^[x y]
d=[1 4 7; 8 5 2; 3 6 0]
d^3
d.^3
3.^d
3^d
元素群的幂次运算是各个元素自行作幂次运算,
对每个元素的这种运算和对标量运算一样。但
是,不能将元素群运算称为数组运算。
区别左边运算
输入算式
输出结果
d^3
d
1 4 7
8 5 2
3 6 0
627 636 510
804 957 516
486 612 441
d.^3
1 64 343
512 125 8
27 216 0
输入 3.^d
算式
3^d
输出
结果
1.0e+005 *
2.6388 - 0.0000i 3.0233 + 0.0000i 1.9754 + 0.0000i
3.4735 - 0.0000i 3.9797 + 0.0000i 2.6003 + 0.0000i
2.3170 - 0.0000i 2.6546 + 0.0000i 1.7345 + 0.0000i
3 81 2187
6561 243 9
27 729 1
(3)元素群的函数
除矩阵运算的乘、右除、左除、幂指数(× / \ ^)、sqrtm、expm、
logm函数外,基本函数库中的常用函数都可用于元素群运算。自变量可以是
任意阶的矩阵。
基本函数库(elfun)
x=[0: 0.1: pi/4]’
x=
0
0.1000
0.2000
0.3000
0.4000
0.5000
0.6000
0.7000
disp('显示 x sin(x) cos(x) tan(x)')
disp([x, sin(x) cos(x) tan(x)])
显示 x sin(x) cos(x) tan(x)
0
0
1.0000
0.1000 0.0998 0.9950
0.2000 0.1987 0.9801
0.3000 0.2955 0.9553
0.4000 0.3894 0.9211
0.5000 0.4794 0.8776
0.6000 0.5646 0.8253
0.7000 0.6442 0.7648
0
0.1003
0.2027
0.3093
0.4228
0.5463
0.6841
0.8423
2.4 逻辑判断及流程控制
1. 关系运算
a= 2+2==4
a=(2+2==4)
a=(3<4)
a=(4<3)
a=(3<=4)
a=(4<=3)
a=(4>3)
a=(3>4)
a=(4>=3)
a=(3>=4)
a=(3~=4)
A=magic(6)
rem(A,3)
p=(rem(A, 3)==0)
lp=find (p)'
等于,a = 1
a=1
小于,a = 1
a=0
小于等于,a = 1
a=0
大于,a =1
a =0
大于等于,a=1
a=0
不等于,a=1
魔方矩阵,每行、每列、对角线的元素之和=(n3+n)/2
A整除3,求余数
余数为0,是真,即整除
找出p矩阵中不为零元素的序号,矩阵元素是按列排序号的。
A=magic(6)
A =35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
p=(rem(A,
p =0 0
1 0
0 1
0 0
1 0
0 1
3)==0)
1 0
0 1
0 0
1 0
0 1
0 0
0
0
1
0
0
1
1
0
0
1
0
0
rem(A,3)
ans = 2
0
1
2
0
1
1
2
0
1
2
0
0
1
2
0
1
2
2
0
1
2
0
1
1
2
0
1
2
0
0
1
2
0
1
2
lp=find (p)'
lp=2
5 9 12 13 16 20 23 27 30 31 34
矩阵元素的序号排法:
n×m阵中下标为(j,k)的元素序号为 l=(k-1)*n+j
1
7
13
19
25
31
2
8
14
20
26
32
3
9
15
21
27
33
4
10
16
22
28
34
5
11
17
23
29
35
6
12
18
24
30
36
符号
数
学
及
逻
辑
运
算
符
号
意义
符号
意义
符号
意义
+
加
-
减
*
矩阵乘
\
矩阵左除
/
矩阵右除
^
矩阵乘幂
.*
矩阵元素乘
./
矩阵元素除
.^
矩阵元素乘幂
()
{}
优先,下标输
入参量
[]
矩阵,向量输
入变量
:
整行(列)等增
量赋值
.
小数点
..
母目录
…
行命令延续符
,
语句分割符,
显示
;
语句分割符,
不显示
=
赋值符
‘
转置,引用
!
操作系统命令
%
注释符
==
关系相等符
<>
关系大小符
~=
关系不等符
&
逻辑与
xor
异或
|
kron
逻辑或
Kronecker积
~
逻辑非
逻
辑
字
符
检
查
位
运
算
集
合
运
算
exist
检查变量或函数是否有定
义
any
检查向量中有无非零元
素
all
检查向量中元素是否全为
非零
find
找到非零元素的序号
isnan
元素为NaN时得1
isinf
元素为Inf时得1
isfinite
元素为有限值时得1
isempty
矩阵为空阵时得1
isreal
矩阵为实数阵时得1
issparse
矩阵为稀疏阵时得1
isstr
为文本字符串时得1
isglobal
变量为全局变量时得1
bitand
按位求“与”
bitcmp
按位求“非”(补)
bitor
按位求“或”
bitmax
最大浮点整数
bitxor
按位求“异或”
bitset
设置位
bitget
获取位
bitshift
按位移动
union
集合“合”
unique
去除集合中的重复元素
intersect
集合“交”
setdiff
集合“差”
setxor
集合“异或”
ismember
是集合中的元素时为真
2. 逻辑运算
A=[0 0 1 1]
B=[0 1 0 1]
A&B
A|B
~A
xor(A, B)
G=magic(6)
rem(G,3)
p=(rem(G, 3)==0)
u=p|~p
all(p)
all(u)
any(p)
将逻辑运算用于元素群,得出同阶的0-1矩阵。
与
或
非
异或
G整除3,求余数
可以按行、按列判断一群元素的逻辑值。
两个对元素群运算的函数:
列中有一个元素为0,即为0
列中元素全为1,才为1
列中有一个元素为1,即为1
A =0 0 1 1
B =0 1 0 1
A&B ans =
0 0 0 1
A|B ans =
0 1 1 1
~A ans =
1 1 0 0
xor(A, B) ans =
0 1 1 0
G=magic(6)
G=
35 1 6
3 32 7
31 9 2
8 28 33
30 5 34
4 36 29
26
21
22
17
12
13
19
23
27
10
14
18
24
25
20
15
16
11
1
2
0
1
2
0
0
1
2
0
1
2
rem(G,3)
ans =
2
0
1
2
0
1
1
2
0
1
2
0
0
1
2
0
1
2
2
0
1
2
0
1
rem(G,3)
ans =
2
0
1
2
0
1
1
2
0
1
2
0
0
1
2
0
1
2
2
0
1
2
0
1
1
2
0
1
2
0
0
1
2
0
1
2
p=(rem(G, 3)==0)
p= 0 0 1
1 0 0
0 1 0
0 0 1
1 0 0
0 1 0
0
1
0
0
1
0
0
0
1
0
0
1
1
0
0
1
0
0
u=p|~p
u= 1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
all(p) ans =
all(u) ans =
any(p) ans =
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
1
3. 流程控制语句
(1)if语句
if (表达式) 语句组A,end
if (表达式1) 语句组A,else 语句组B,end
if (表达式1) 语句组A,elseif (表达式2) 语句组B,else 语句组C,end
n=input( 'n='), if rem(n, 2)==0
a='even', else a='odd', end
n = 7 a =odd; n = 8 a =even
n=[]
a =odd
n=input( 'n='), if isempty(n)==1
a='empty', elseif rem(n,2)==0
a='even', else a='odd', end
n = [ ] a =empty
输入数n,判断奇偶性。如果用户没有键
入数就回车,程序会判断为odd。
修改为用户无输入时程序自动中止。
(2)while语句
while (表达式) 语句组A,end
x=1; while x~=inf, x1=x;
x=2*x; end, x1
x1 = 8.9885e+307
求MATLAB中的最
大实数。X不断增
大,直到无法表示
它的值,只能用inf
表示为止。
x=1; while x~=inf, x1=x; x=1.1*x; end, x1
x1 =1.7837e+308
y=1; while 1+y>1, y1=y y=y/2; end, y1
y1 =2.2204e-016
求MATLAB相对精度,y不断减小,直至MATLAB
分不出1+y与1的差别为止。
(3) for语句
for k= 初值:增量:终值 语句组A,end
将语句组A反复执行N次,每次执行时程序中的k值不同。
N=1+(终值-初值)/增量
用for语句求三角函数表
for x=0: 0.1: pi/4 disp([x, sin(x), cos(x), tan(x)]), end
运行结果
x
0
1/10
1/5
3/10
2/5
1/2
3/5
7/10
sin(x)
0
839/8404
209/1052
409/1384
368/945
501/1045
1153/2042
947/1470
cos(x)
1
1195/1201
295/301
1647/1724
2882/3129
1699/1936
430/521
992/1297
tan(x)
0
1499/14940
374/1845
275/889
1777/4203
820/1501
979/1431
486/577
n =5
列出构成Hilbert矩阵的程序
format rat显示形式是分数近似 h = 1
1/2
n=input('n='), format rat
1/3
for i=1:n, for j=1:n,
1/4
h(i, j)=1/(i+j-1); end, end, h
1/5
增加可读性
format rat, n=input(‘n=’)
for i=1:n
for j=1:n,
h(i, j)=1/(i+j-1);
end
end
h
1/2
1/3
1/4
1/5
1/6
1/3
1/4
1/5
1/6
1/7
1/4
1/5
1/6
1/7
1/8
1/5
1/6
1/7
1/8
1/9
在if,for,while与表达式之间留
空格,在表达式与语句组之间必
须用空格或逗号分隔,必须用逗
号或分号分隔end和else。
break 是中止循环的命令,在多
重循环中,break只能使程序跳
出包含它的最内部的那个循环。
(4)switch语句
switch-case-otherwise
switch 表达式(标量或字
符串)
case 值1
语句组A
Case 值2
语句组B
…….
Otherwise
语句组N
end
当表达式的值(或字
符串)与某case语句中的
值(或字符串)相同时,
它就执行该case语句后的
语句组,然后跳到终点的
end。
case语句可以有N-1个,
如果没有任何一个case值
能与表达式值相符,则执
行otherwise后面的语句组
N。
n=input( 'n='),
switch mod(n,2),
case 1, a='奇',
case 0, a='偶',
otherwise, a='空', end
n=5
a =奇
n=input( 'n='),
switch rem(n,2),
case 1, a='奇',
case 0, a='偶',
otherwise, a='空', end
n=8
a =偶
判断输入数n的奇、偶、空的程序
mod(x,m)x整除m取正余数,
rem(a,b) a整除b,求余数
n= 负数
n = -5
a =奇
n=-8
a =偶
2.5 基本绘图方法
1.直角坐标中的两维曲线
(1)plot(y)--输入一个数组的情况
y=5*(rand(1,10) -.5)
plot(y)
title ('my first plot')
xlabel('x'), ylabel('y')
grid
画出10个随机数的曲线。
Rand函数产生0—1之间的随机数,平均值是0.5。
加标题,
坐标轴说明
加坐标网格线
(2)Plot(x,y)--输入两个数组的情况
t=0:0.5:4*pi
y=exp(-0.1*t).*sin(t)
plot(t,y)
y1=exp(-0.1*t).*sin(t+1)
plot(t,y1,':')
t是横坐标,y为纵坐标
y1相位超前1弧度。
2.线型、点型和颜色
y2=exp(-0.1*t).*sin(t+1)
plot(y2,'*b')
plot(y1,':y')
plot(y2,'+r')
蓝色*号线
黄色虚线
红色+号线
3.多条曲线的绘制
有四种方法在一张图上显示多条曲线
(1)用plot(t,[y1,y2,…])命令
t=0:0.5:4*pi;
y=exp(-0.1*t).*sin(t);
y1=exp(-0.1*t).*sin(t+1);
plot(t,[y;y1])
t是向量,y是矩阵,如果t是列(行)向量,则y
的列(行)长度与t相同。y的行(列)数就是曲
线的根数。
这种方法要求所有的输出量有同样的长度和同样
的自变量向量。不便于用户自行设定线型和颜色。
(2)用hold命令
plot(t,y), hold on ,plot(t,y1,'g'); 画完一张图用命令保持住,再画下一条曲线。
t2=0:.2:2*pi;
两张图的变量长度可以各不相同。只要每张图的
自变量和因变量长度相同就可以。
y2=exp(-0.5*t2).*sin(5*t2+1);
plot(t2,y2);
hold off
(3)在plot后使用多输入变量
plot(x1,y1,x2,y2,...xn,yn)
plot(t,y,'+g',t2,y2,':r');
title('线型,点型和颜色');
xlabel('时间'),ylabel('Y')
x1,y1,x2,y2,…xn,yn分别为数组对,每一对数
组可以绘出一条曲线,每一组数组对的长度可以不
同,在后面都可以加线型标志符。
为曲线图加标题
(3)图在plot后使用多输入变量
(2)图用hold命令
(4)用plotyy命令
y3=5*y2; plotyy(t,y',t2,y3);
grid, gtext('t, t2');
gtext('y'),gtext('y3')
Plotyy设有两个纵坐标,可以绘制两个y尺
度不同的变量,x仍只用同一比例尺。
用gtext命令可以标注纵坐标和曲线。
4. 屏幕控制和其他二维绘图
(1)图形屏幕控制命令
图形屏幕可以开、关,可以开几个图形窗,可以在一个图形窗
内华几幅分图,每幅分图可以用不同坐标。
figure
clf
hold
hold on
hold off
close
close all
subplot(n,m,p)
打开图形窗口;
清除当前图形窗的内容;
保持当前图形窗的内容;
再次用hold就解除保持状态。
关闭当前图形窗口。
关闭所有图形窗口。
将图形窗口分为n*m个子图,在第p个子图处绘
制图形。
通用图形函数(graphics)(h)
图形
窗的
控制
轴系
的
控制
图形
对象
figure
创建图形窗口
shg
显示图形
gcf
获取当前图形窗的句柄
refresh
刷新图形
clf
清除当前图形窗
close
关闭图形窗
axes
在任意位置创建坐标系
ishold
保持当前图形状态为真
gca
获取当前坐标系的句柄
box
形成轴系方向
cla
清除当前坐标系
line
创建直线
surface
创建曲面
patch
创建图形填充块
light
创建照明
image
创建图象
set
设置对象特性
gcbo
获得回叫对象的曲柄
图形
get
获得对象特性
gcbf
获得回叫图形的曲柄
句柄
reset
复位对象特性
drawnow
直接等待图形事件
操作
delet
删除对象
findobj
寻找具有特定值的对象
gco
获得当前对象的句柄
copyobj
为图形对象及其子项作硬拷
贝
closereq
请求关闭图形窗
ishandle
是图形句柄时为真
newplot
说明Nextplot的M文件
ginput
从鼠标作图形输入
uiputfile
给出存储文件的对话框
graymon
设定图形窗灰度监视器
uigetfile
给出询问文件名的对话框
rbbox
涂抹块
whitebg
设定图形窗背景色
rotate
围绕指定方向旋转对象
zoom
二维图形的放大和缩小
terminal
设定图形终端类型
warndlg
警告对话框
工具
杂项
(2)其他二维绘图命令
stem
stairs
bar
errorbar
hist
fill(t,y,'颜色标注符')
绘脉冲图
绘阶梯图
绘条形图
绘误差条形图
绘直方图
颜色标注符 r
subplot (2,2,1), stem(t,y);
title('stem(t,y)')
subplot (2,2,2), stairs(t,y);
title('stairs(t,y)')
subplot (2,2,3), bar(t,y);
title('bar(t,y)')
subplot (2,2,4), fill(t,y,'r');
title(' fill(t,y,''r'')')
subplot(1,1,1)
loglog
semilogx
semilogy
polar(theta,rho)
取消子图
绘出以log10-log10为坐标刻度的对数图
使用半对数刻度绘图,x轴为log10刻度,y轴为线性刻度。
使用半对数刻度绘图, y轴为log10刻度,x轴为线性刻度。
极坐标绘图,角度theta为一个坐标,单位是弧度,另一坐
标是矢径rho。
二维图形函数库
基本 plot
线性X-Y坐标绘图
polar
极坐标绘图
X-Y
双对数X-Y坐标绘图
plotyy
用左、右两种Y坐标画图
图形 semilogx
半对数X坐标绘图
semilogy
半对数Y坐标绘图
坐标 axis
控制坐标轴比例和外观
subplot
在平铺位置建立图形轴系
控制 hold
保持当前图形
图
title
标出图名(适用于三维图形) gtext
用鼠标定位文字
形
xlabel
X轴标注(适用于三维图形)
legend
标注图例
注
ylabel
Y轴标注(适用于三维图形)
grid
图上加坐标网格(适用于
三维)
释
textt
在图上标文字(适用于三维)
打
print
打印图形或把图存为M文件
orient
设定打印纸方向
印
printop
打印机默认选项
loglog
(3)虚数的绘图
figure(2)
t=0:.2:4*pi
z=exp((-0.1+i)*t)
subplot(2,2,1)
plot(z), pause
title('复数绘图plot(z)')
subplot(2,2,2)
plot(t,z), pause
title('复数绘图plot(t,z)')
subplot(2,2,3), polar(angle(z), abs(z))
title('polar(angle(z),abs(z))')
subplot(2,2,4),semilogx(t,z)
title('semilogx(t,z)')
plot(t,real(z),imag(z))
plot(z)中的z为复数单变量时(即含有非零的
虚部),复数的实部为x坐标,虚部为y坐标
进行绘图。即相当于plot(real(z),imag(z))。
如果是双变量,如plot(t,z) ,则z中的虚数部
分将被丢弃。
要在复平面内绘多条曲线,必须用hold命令,
或将多条曲线的实部和虚部明确地写出,作
为函数的输入变元,即
Plot(real(z1),imag(z1),real(z2),imag(z2))
子图1画出了复数图形;
子图2只画出了z的实部随t 的变化规律,
子图3是用极坐标绘制的复数曲线;
子图4说明了半对数坐标绘图的结果。
(4)坐标比例和尺寸的设定—axis命令
v=axis
axis(v)
axis('equal')
axis('square')
z=0:0.1:2*pi;
x=sin(z);
y=cos(z);
subplot(1,2,1),plot(x,y)
subplot(1,2,2), plot(x,y)
axis('equal')
用户自行设定坐标比例,选择图形边界范
围。返回值是图形边界的4元行向量,
v=[xmin, xmax, ymin,ymax]
如果当前图形是三维的,返回值是三维坐
标边界的6元行向量。
将坐标轴设定在v规定的范围内。0
控制图形的纵横比,使屏幕上x与y的比例
尺相同.
axis(‘equal’)的作用使第二个字图称为圆。
v=axis
axis('equal')
axis('square')
v=0
1
0
1
5. 三维曲线和曲面
(1)空间曲线绘制-plot3
plot3(x,y,z,'s')
z=0:0.1:4*pi;
x=cos(z);
y=sin(z);
plot3(x,y,z,'r')
绘制空间曲线, s是线型颜色符
(2)空间曲面的绘制
mesh
surf
直线--连接相邻的点构成三维曲面
小平面--连接相邻的点构成三维曲面
函数sinc(r)=sin(r)/r
x=-8:0.5:8; y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
r是X-Y平面上的向径,绘制sin(r)/r函数的立体图。
X、Y方向各有33个样本点,生成一维自变量数组。
size多维矩阵的各维长度。共建立33*33=1089 个网格
点的坐标矩阵X和Y,形成33*33网格的矩阵;
R=sqrt(X.*X+Y.*Y); z=sin(R)./R;
mesh(z),pause
R=sqrt(X.*X+Y.*Y)+eps; z=sin(R)./R;
figure(2),mesh(z)
R=abs(X)+abs(Y)+eps; z1=sin(R)./R;
figure(3), surf(z1)
R表示数据点到原点的距离,生成因变量。
画三维曲面
在R=0(原点)处出现0/0运算,得NaN
结果。
eps浮点数相对精度,消除NaN。
abs(X)+abs(Y)称为一范数
1图是mesh图, 原点处出现0/0运算,得NaN结果
2图是mesh图, eps浮点数相对精度,消除NaN
3图 是surf 图,abs(X)+abs(Y)称为一范数
(3)其他三维绘图命令
view(20, 0)
view(37,30)
view(方位角, 俯仰角)可以变换立体图的视角
默认值
shading flat
shading interp
shading faceted
可将曲面上的小格平滑掉,使曲面成为光滑表面。
rotate3d
contour
coutour3
可用鼠标拖动立体图作空间连续转动
把曲面的等高线投影在X-Y平面
在三维立体图中画出等高线
默认状态,曲面有小格。
subplot(2,2,1), R=sqrt(X.^2+Y.*Y);
z=sin(R)./R; meshc(z), pause
title(' meshc(z),shading
flat'),shading flat
Subplot(2,2,2),
R=sqrt(X.^2+Y.*Y)+eps;
z=sin(R)./R; mesh(z),pause
title('meshz(z),shading
interp'),shading interp
subplot(2,2,3),
subplot(2,2,4), surfc(z1),view(20,0);
R=abs(X)+abs(Y)+eps;
rotate3d
z1=sin(R)./R; surfc(z1),pause
title('surfc(z1),shading flat'),shading
title('surfc(z1), view(20,0)')
flat, %colormp(gray)
meshc(z) 、surfc(z1),加入了等高线绘制命令contour3。
6. 特殊图形和动画
moviein
getframe
movie
预留存储空间以加快运行的速度
存储图形,每个图形成一个很大的列向量,再用
N行这样的列保存N幅图,成为一个大矩阵。
用movie命令把它们连起来重放。
axis equal,
m=moviein(16);
for j=1:16
plot(fft(eye(j+16)));
m(:,j)=getframe;
end
movie(m,30)
%因为产生的图形是圆形,将坐标设成相等比例
%为变量M预留16幅图的存储空间
%做16次循环
%画图
%依次存入M中
16个画面放在矩阵M中,每幅16858*8=134864个
字节,
运行movie(m,30),将M中图形播放30遍。
eye单位矩阵
fft Discrete Fourier transform.
特殊图形和动画(graphics)(u)
area
填满绘图区域
feather
羽状图
特
bar
条形图
fill
填满两维多边形
殊
barh
水平条形图
pareto
pareto图
的
bar3
三维条形图
pie
饼图
二
bar3h
三维水平条形图
plotmatrix
矩阵散布图
维
compass
极坐标向量图
ribbon
画成三维中的色带
图
comet
彗星轨迹图
stem
离散序列绘图
形
errorbar
误差条图
stairs
阶梯图
等高
contour
等高线图
pcolor
伪彩色图
线
contourf
填充的等高线图
quiver
箭头图
图
contour3
三维等高线图
voronoi
voronoi图
形
clabel
等高线图标出字符
comet3
三维彗星轨迹图
meshc
三维曲面与等高线组合图 surfc
三维曲面与等高线组合图
meshz
带帘的三维曲面
trisurf
三角表面图
pie3
三维饼面
trimesh
三角网状表面图
stem3
三维图
waterfall
瀑布图
quiver3
三维图
image
显示图象
imread
从图形文件读出图像
图像
imagesc
缩放数据并作为图像显示 imwrite
把图像写入图形文件
显示
colormap 颜色查找表
电影
capture
和
动画
特殊
三维
图形
实体
slice
实体切片图
imfinfo
关于图形文件的信息
从屏幕抓取图形文件
rotate
绕给定方向旋转对象
moviein
初始化电影帧存储器
frame2im
把电影帧转换为索引图象
getframe
获取电影帧
im2frame
把索引图像转换为电影帧
movie
重放录下的电影帧
cylinder
生成圆柱体
sphere
生成球体
7. 彩色、光照和图像
mesh(x,y,z,w)
colorbar
[x,y]=meshgrid([-2:.2:2]);
z=x.*exp(-x.^2-y.^2);
surf(x,y,z), colorbar
figure(2)
surf (x,y,z,gradient(z)),
colorbar
colormap(cool)
m=colormap
pcolor([1:65; 1:65]’)
hot(8)
pcolor([1:9;1:9]’)
caxis([cmin cmax])
surfl(peaks,[30,0])
在三维曲面绘图命令中加入第四维变元,W是颜色的值。
彩色条表示颜色与w值的一一对应关系
彩色轴表示曲面的梯度,作为第四维坐标
彩色条分为64个等级,颜色排序的默认值为HSV,用户
可以自行定义为hot,cool,gray,copper,pink,jet,
prism等,
m=colormap将返回一个64×3阶的矩阵
65个分割点,产生64根彩条
hot(8)将伪彩色板设置为hot色,改为8份。
人工设定的命令caxis([cmin cmax])
彩色条中的最小值、最大值
光源在方位角30º俯仰角0º方向照射时的peak曲面。
2.6 M文件、M函数及程序调试






M文件是文本文件,扩展名*.m。(example.m)可以用任何编
辑器来建立,可直接阅读。MATLAB程序可直接调用M文件
并执行。
M文件分为两种:一种是主程序,为用户解决特定的问题编
制的;一种是子程序,函数文件,必须由其他M文件来调用,
函数文件可以递归调用(自己调用自己)。MATLAB软件的
大部分功能是来自其建立的函数集。
1.主程序文件
主程序文件格式特征:
(1)用clear 、close all等语句开始,清除原有的变量和图
形。
注释行以%号开始,增加可读性。MATLAB不执行%号后面
的任何内容。在键入“help 文件名example.m”时,屏幕会
显示以%号起始的行的内容,注释可以是汉字的。
(2)程序的主体







全局变量:在子程序中和主程序中共用的变量。应在程序的
起始部分注明。
全局变量语句:global 变量名1 变量名2 ……
程序必须用半角英文字母和符号编制(包括标点符号),只
有%号后面的注释可以用中文。
要注意流程控制语句的缩进及与end的对应关系。选项可以
自动对程序进行缩进排版。
元素之间用逗号、空格分开。不同行以分号隔开。语句结尾
用回车或逗号,会显示结果,如果不想显示结果,用分号。
(3)M文件的文件名、路径名不能用中文,要按MATLAB
的标识符编制,因为M文件也就是MATLAB的调用命令。
在MATLAB的命令窗键入程序的M文件名后,系统就开始执
行M文件中的程序。
[例1]列出一个求fibonnaci数的程序,它是一个数列,从[1,1]开始,由数
列的最后两个元素之和生成新的元素,依次递推。
%计算fibonnaci数的M文件
clear,close all
N=input('输入最大数值范围 N=')
f=[1,1]; i=1; %变量的初始化
while f(i)+f(i+1)<N %循环条件检验
f(i+2)=f(i+1)+f(i); i=i+1; %求fibonnaci数的算式
end
f,plot(f) %显示和绘图
输入最大数值范围 N=20
N = 20
f = 1 1 2 3 5 8 13
将程序以文件名fibon.m存入一MATLAB搜索目录下,在MATLAB命令窗
中键入fibon,即可执行。
[例2]求素数的程序。只能被自身和1除净的数。
%求素数(prime number)的程序
clear, close all
N=input('N='), x=2:N;
for u=2:sqrt(N)
n=find (rem(x, u)==0 & x~=u);
x(n)=[ ];
end, x
N = 44
x =2 3 5 7 11 13 17 19 23 29
41 43
31
37
人机交互命令:
·echo on(off) 在执行M文件每行程序前先显示其内容。
·pause(n) 程序执行到此,暂停n秒,再继续。
·keyboard程序执行到此暂停,在屏幕上显示字符K,用户可
以在命令窗进行任何操作,键入字符串return,恢复运行原
来的程序。
·input(‘提示符’) 程序执行到此暂停,屏幕显示引号中的字符
串,要求用户输入数据。数据输入后,程序继续运行。
·^c (control-c) 强行停止程序运行的命令。
·menu 用来产生人际交互的备选择菜单的命令。
2.函数文件
函数文件是用来定义子程序的。与主程序文件的主要区别有3点:
(1)由function起头,后面跟的函数名,函数名必须与文件名相同。
(2)有输入输出变元(变量),可以进行变量传递。
(3)除非用global声明,程序中的变量均为局部变量,不保存在工作空间
中。
[例3]函数文件
mean.m
function y=mean(x)
%文件的第一条语句定义了函数名、输入变元及输出变元。(这条语句可以区分程序文件和
函数文件)输入变元、输出变元可以有若干个,必须在第一条语句中列出。
%MEAN求平均值。对于向量, mean(x)返回该向量x中各元素的平均值
% 对于矩阵,mean(x)是一个包含各列元素平均值的行向量
[m, n]=size (x);
%变量m,n和y都是函数mean的局部变量,当mean文件执行完毕,这些变量值会自动消
失,不保存在工作空间中。如果在执行该文件前,工作空间中已有同名的变量,系统会
把两者看作各自无关的变量。如果希望将两者看作同一变量,则必须在主程序和子程序
中都加入global语句,对此共同变量进行声明。
If m==1 M=n; end %处理单行向量
y=sum(x)/m
z=magic(7)
mean(z) %对输入变元x赋值,应把x代换成主程序中的已知
变量。假如它是一个已知向量或矩阵Z,可以写成mean
(Z),该变量Z通过变元替换传递给mean函数后,在子程
序内,它就变成了局部变量x。
z = 30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
ans =25 25 25 25 25 25 25
[例4] 多输入变量函数logspace,用于生成等比分割的数组。
function y=logspace (d1, d2, n)
% LOGSPACE 对数均分数组
% LOGSPACE(d1, d2)在10d1与10d2之间生成长度为50的对数均分数组
% 如果d2为pi,则这些点在10d1和pi之间
% LOGSPACE(d1, d2,n)生成的数组长度为n,n的默认值为50
if nargin ==2 n=50; end
%输入变元分析及n的默认值设置, nargin输入变元的数目
if d2==pi d2=log10(pi); end
%d2为pi时的设置
y=(10).^[d1+(0:n-2)*(d2-d1)/(n-1), d2]; %将结果返回到输出变元
特定变量nargin表示输入变元的数目。nargout表示输出变元数目的变量。
MATLAB常常根据nargin和nargout的数目不同而调用不同的程序段,从
而体现它的智能作用。
调用logspace(1,10,50) 要给出d1, d2, n的值。
自学
 程序调试
 主程序不需要专门的调试命令,需要用调试命令的主要是函




数程序。因为函数程序出错停机时,变量不能保存,无现场
记录。会给调试带来很大困难,解决方法:
(1)把某些分号改为逗号,使中间结果能显示在屏幕上,
作为查错依据。
(2)在子程序中适当部位加keyboard命令。系统会暂停,
等待用户键入命令。这是子程序的变量还存在于工作空间中,
可以对它们进行检查。
(3)将函数文件的第一行加%号,成为程序文件,进行初
步调试。第一行中的输入变元,可改用input或赋值语句来
输入,调好后再改回函数文件。
(4)使用MATLAB提供的调试命令。调试命令较繁琐,不
作介绍。
2.7 MATLAB的数据分析函数库(datafun函数库)
基本的数据分析
MATLAB的基本数据处理功能是按列向进行的,因此要求待处理的数
据矩阵按列向分类,而行向则表示数据的不同样本。例如,10个学生
的身高及3门课程分数列表如下:
data= [154 49 83 67;
158 99 81 75;
155 100 68 86;
145 63 75 96;
145 63 75 96;
141 55 65 75;
155 56 64 85;
147 89 87 77;
147 96 54 100;
145 60 76 67]
一些数据处理命令的结果
命令
功能
身高
课程1
课程2
课程3
max(data)
求各列最大值
158
100
87
100
min(data)
求各列最小值
141
49
54
67
mean(data)
求各列平均值
149.2
73.0
72.8
82.4
std(data)
求各列标准差
5.7504
20.4070
10.0421
12.0757
median(data)
求各列中间元素
147
63
75
81
sum(data)
求各列元素和
1492
730
728
824
trapz(data)
梯形法求积分
1342.5
675.5
648.5
757.0
 std(标准差)是指列中N个元素与该列平均值mean(data)之
差的平方和开方。
 Trapz(求积分)可以看成求和,梯形法求积分近似于求元
素和,差别在于梯形法是把相邻两点数据的平均值作为数据
点。10个数据只能产生9个数据点,相加以后比元素和少一
组数据,把它乘以步长才真正表示了面积。其差额为半个首
点和半个末点的数据和,即
 trapz(data)=sum(data)-0.5(data(1)+data(N))
 在N很大时两者的误差很小。
 有些数据处理命令的结果不是一个标量而是一个列向量。为
了节省篇幅,只取数据中的前5行。
产生列结果的数据处理命令
命令
功能
身高
课程1
课程2
课程3
cumsum(data(1:5,:))
列向累加和
154
49
83
67
312
148
164
142
467
248
232
228
612
311
307
324
757
374
382
420
154
49
83
67
24332
4851
6723
5025
3771460
485100
457164
432150
4
50
-2
8
-3
1
-13
11
-10
-37
7
10
0
0
0
0
-4
-8
-10
-21
cumprod(data(1:3,:))
diff(data(1:6,:))
列向累乘积
列向差分
命令
sort(data(1:5,:))
cumtrapz(data(1:6,:))
功能
身高
课程1
课程2
课程3
145
49
68
67
145
63
75
75
154
63
75
86
155
99
81
96
158
100
83
96
列向累加积分
156.0
74.0
82.0
71.0
(相当于
312.5
173.5
156.5
151.5
不定积分)
462.5
255.0
228.0
242.5
即累计求面积
607.5
318.0
303.0
338.5
750.5
377.0
373.0
424.0
列向重新排序
第二章 MATLAB在电路中的应用
5.1 电阻电路
[例1] 电阻电路的计算
已知:R1=2Ω, R2=4Ω,
R3=12Ω, R4=4Ω,
R5=12Ω, R6=4Ω, R7=2Ω。
求:(1)如us=10V,求i3,u4,u7;
(2)如已知u4=6V,求us,i3,u7。
解:建模,用网孔法,列出网孔方程为
( R1  R2  R3 )ia  R3ib  u s
 R3ia  ( R3  R4  R5 )ib  R5 ic  0
 R5 ib  ( R5  R6  R7 )ic  0
可写成如下的矩阵形式
 R1  R2  R3

 R3


0
 R3
 ia  1 
 i   0u
 R5
 b    s
R5  R6  R7  ic  0
0
R3  R4  R5
 R5
或直接列出数字方程,简写为A*I=B*us
2  4  12

 12


0
 12
12  4  12
 12
 ia  1 
 12  ib   0u s
12  4  2 ic  0
0
(1)令us=10V,由 i3  ia  ib , u 4  R4 ib , u 7  R7 ic
可以得到问题(1)的解。
(2)如已知u4=6V,求us,i3,u7。由电路的线性性质,可令
i3  k1u s ,
u4  k 2us ,
u 7  k 3u s
根据问题(1)的结果和电路图可列出下式
i3
k1  ,
us
u4
k2  ,
us
u7
k3 
us
可以通过下式求问题(2)的解
u4
us 
k2
k1
i3  k1u s  u 4
k2
k3
u 7  k 3u s  u 4
k2
%MATLAB程序q501.m
clear, close all, format compact
R1=2; R2=4; R3=12; R4=4; R5=12; R6=4; R7=2; %为给定
元件赋值
display ('解问题(1)') %解问题(1)
a11=R1+R2+R3; a12=-R3; a13=0; %将系数矩阵各元件赋值
a21=-R3; a22=R3+R4+R5; a23=-R5;
a31=0; a32=-R5; a33=R5+R6+R7;
b1=1; b2=0; b3=0;
us=input('us='), %输入解(1)的已知条件
A=[a11, a12, a13; a21, a22, a23; a31, a32, a33] %列出系数矩阵A
B=[b1; 0; 0]; I=A\B*us; %I=[ia;ib;ic]
ia=I(1); ib=I(2); ic=I(3);
i3=ia-ib,u4=R4*ib,u7=R7*ic %解出所需变量
display('解问题(2)') %利用电路的线性性质及问题1的解求解问题2
u42=input('给定u42=');
k1=i3/us;k2=u4/us;k3=u7/us; %由问题(1)得出待求量与us的比例系数
us2=u42/k2, i32=k1/k2*u42, u72=k3/k2*u42 %按比例方法求出所需变量
程序运行结果
解问题(1)us=10V
A = 18 -12 0
-12 28 -12
0 -12 18
i3 = 0.3704,u4 = 2.2222,u7 = 0.7407
解问题(2) 给定u42=6
us2 = 27.0000,i32 =1.0000,u72 = 2
[例2]含受控源的电阻电路
已知R1=R2=R3=4Ω,R4=2Ω,
控制常数k1=0.5,k2=4,is=2A,求i1和i2?
解:建模
列出节点方程
1
1
1
(  )u a 
u b  i s  k1i 2
R1 R2
R2

k i
1
1
1
1
ua  (


)ub  k1i2  2 1
R2
R2 R3 R4
R3
控制变量i1,i2
与节点电压ua,ub的关系为
u a  ub
i1 
,
R2
ub
i2 
R4
讲
将i1,i2作为未知量移至等号左端,写成矩阵形式为
令is=2A,解上式i1,i2
%MATLABq502.m
clear,format compact
R1=4;R2=4;R3=4;R4=2;
%设置元件参数
is=2; k1=0.5; k2=4;
%按A*X=B*is列写此电路的矩阵方程,其中X=[ua;ub;i1;i2]
a11=1/R1+1/R2; a12=-1/R2; a13=0; a14=-k1; %设置系数A
a21=-1/R2; a22=1/R2+1/R3+1/R4; a23=-k2/R3; a24=k1;
a31=1/R2; a32=-1/R2; a33=-1; a34=0;
a41=0; a42=1/R4; a43=0; a44=-1;
A=[a11,a12,a13,a14; a21,a22,a23,a24;
a31,a32,a33,a34; a41,a42,a43,a44];
B=[1; 0; 0; 0]; % 设置系数B
X=A\B*is; %解出X
i1=X(3),i2=X(4) %显示要求的分量
5.2 动态电路
[例3]一阶动态电路,三要素公式。
已知:R1=3Ω,R2=12Ω,R3=6Ω,C=1F;us=18V,is=3A,在
t<0时,开关S位于“1”,电路已处于稳定状态。
(1)t=0时,开关S闭合到“2”,求uc(t),iR2(t),并画出
波形;
(2)若经10秒,
开关S又复位到“1”,
求uc(t),iR2(t),
并画出波形。
解:建模这是一阶动态电路,可用三要素公式求解。
(1)求初始值uc(0+)和iR(0+),先求uc(0-),在t=0-时,开关位于“1”,电路已
达到稳定。电容可看作开路,
不难求得uc(0-)=-12V。根据换路时电容电压不变的定律,
得电容初始电压uc(0+)=uc(0-)=-12V
在t=0时,开关已闭合到“2”,可求得非独立初始值
i R2 (0  ) 
u C (0  )
R2
 1A
其次求稳定值。达到稳态时电容可看作开路,于是可得
uC () 
时间常数
得
R2 R3
is
R2  R3
R2 R3
1 
C
R2  R3
i R2 () 
R3
is
R2  R3
; 用三要素公式
uC (t )  uC ()  [uC (0  )  uC ()]e t / 1
t 0
(4)
i R2 (t )  i R2 ()  [i R2 (0  )  i R2 ()]e t / 1
t 0
(5)
(2)经10秒后,开关又闭合到“1”,将t=10s代入(4)式即得电
容电压的初始值为uc(10+)=uc(10)。由电路图可见这
时 i R2 (10  )  i s  3 A,保持不变。
'
达到稳定时, uC ()  12V
这时   R1 R3 C ,用三要素公式得
2
R1  R3
12  24 e t / 1
0  t  10

t 10
u C (t )  
2
'
'

u
(

)

[
u
(
10
)

u
(

)]
e
, 10  t
C

C
 C
3


i R2 (t )  1  2e t / 1
 3

t0
0  t  10
t 0
%MATLABq5-4
R1=3; us=18;is=3; R2=12; R3=6; C=1; %给出原始数据
%解问题(1)
uc0=-12; ir20=uc0/R2; ir30=uc0/R3; %算出初值ir20及uc0
ic0=is-ir20-ir30;
ir2f=is*R3/(R2+R3); %算出终值 ir2f及ucf
ir3f=is*R2/(R2+R3);
ucf=ir2f*R2; icf=0;
%注意时间数组的设置,在t=0及10附近设两个点
t=[-2-eps:0-eps, 0:9, 10-eps, 10+eps, 11:20];
figure(1),plot(t),grid
%t=10+eps对应下标15
uc(1:3)=-12; ir2(1:3)=3 % t<0时的值
T=R2*R3/(R2+R3)*C;
% 求充电时间常数
uc(4:14)=ucf+(uc0-ucf)*exp(-t(4:14)/T);
ir2(4: 14)=ir2f+(ir20-ir2f)*exp(-t(4:14)/T); %用三要素法求输出
%解问题(2)
uc(15)=uc(14); ir2(15)=is;
%求t=10+eps时的各初值
ucf2=-12; ir2f=is;
%求uc和ir2在新区间终值ucf2和ir2f
T2=R1*R3/(R1+R3)*C; %t=10+eps到t=20区间的时间常数
%再用三要素法求输出
uc(15:25)=ucf2+(uc(15)-ucf2)*exp(-(t(15:25)-t(15))/T2);
ir2(15:25)=is;
figure(2)
subplot(2, 1, 1); h1=plot(t,uc); %绘uc图
grid, set(h1,'linewidth',2)
%加大线宽
subplot(2, 1, 2), h2=plot(t, ir2); %绘ir2图
grid, set(h2, 'linewidth', 2)
5.3 正弦稳态电路
[例4]正弦稳态电路:运用戴维南定理
已知c1=0.5F, R2=R3=2Ω,L4=1H;
Us(t)=10+10cos(2t), Is(t)=5+5cos2t,
b
求b,d两点之间的电压U(t)。
解:建模 这是一个含三个频率
分量的正弦稳态电路问题,
可以按每个频率成分分别计算,
再叠加起来。
更好的方法是利用MATLAB的元素群计算特性,
把多个频率分量及相应的电压、电流、阻抗等都看作多元
素的行数组,每一元素对应一种频率分量的值。
因为他们服从同样的方程,所以程序就特别简洁。
d
讲


(1)先看U s 对b、d点产生的等效电压 U oc,令电流源开路,即Is=0,由电桥电
路可得

U OC

Z2
Z4
[

]U S
Z1  Z 2
Z3  Z4
其相应的等效内阻抗为
Z eq
Z3Z4
Z1 Z 2


Z 3  Z 4 Z1  Z 2

(2)令 U S =0,则电流源在b,d间
产生的电压为IsZeq
(3)根据叠加原理



U I
s
Z eq  U oc
%MATLAB程序q509.m
clear format compact
w=[eps, 1,2]; us=[10,10,0]; is=[5,0,5]; %按频率依次设定输入信号数组
z1=1./(0.5*w*j); z4=1*w*j; %电抗分量是频率的函数,故自动成为数组
z2=[2,2,2]; z3=[2,2,2];
%对电抗分量也列写成常数数组
uoc=(z2./(z1+z2)-z4./(z3+z4).*us);
%列出电路的复数方程
zeq=z3.*z4./(z3+z4)+z1.*z2./(z1+z2); %列出等效阻抗
u=is.*zeq+uoc;
%求解
disp(' w um phi ')
%显示
disp([w' , abs(u'), angle(u')*180/pi])
程序运行结果
w
um
phi
0.0000 10.0000
0.0000
1.0000 3.8079 113.1986
2.0000 7.9246 -10.1755
由此可以写出U(t)的表达式:
U(t)=10+3.8079cos(t-113.1986)+7.9246cos(2t-10.1755)
5.4 频率响应
[例5]一阶低通电路的频率响应

电路图是一阶RC低通电路,以U C为响应,求频率响应函数,画
出其幅频响应(幅频特性)|H(jω)|
和相频的响应(相频特性)θ(ω)。
解:建模
1

H ( j ) 
UC

US

j
C 
R j
1
C
1

1  jCR
1
1 j
式中ωc=1/RC为截止角频率。
设无量纲频率ωw=ω/ωc=0,0.2,0.4,…,4,
画出幅频响应及相频的响应。

C
clear ,format compact
ww=0:0.2:4;
%设定频率数组ww=w/wc
H=1./(1+j*ww);
%求复频率响应
figure(1)
subplot(2,1,1),plot(ww,abs(H)),
%绘制幅频特性
grid, xlabel('ww'),ylabel('abs(H)')
subplot(2,1,2),semilogx(ww,angle(H)) %绘制相频特性
grid ,xlabel('ww'),ylabel('angle(H)')
figure(2)
%绘制对数频率特性
subplot(2,1,1),semilogx(ww,20*log10(abs(H)) %纵坐标为分贝
grid ,xlabel('ww'),ylabel('分贝')
subplot(2,1,2),semilogx(ww,angle(H)) %绘制相频特性
grid ,xlabel('ww'),ylabel('angle(H)')
[例6]复杂谐振电路的计算
(a)原电路图
电路图为一双电感并联电路
(b)等效电路
已知:Rs=28.2k,R1=2,R2=3,L1=0.75mH,
L2=0.25mH,C=1000pF。
求回路的通频带B及满足回路阻抗大于50k的频率范围。
解:建模 先把回路变换为一个等效单电感回路,把信号源的内阻
Rs变为并接在该单电感回路上的等效内阻Rse,按照等效电路写
出的方程:
RS
US
Rse  2 ,
IS  m
设m=L1/(L1+L2),则
RS
m
其他支路的等效阻抗分别为
Z1e  R1  j ( L1  L2 ),
总阻抗是三个支路阻抗的并联
Z 2e
1
 R2 
jC
 1
1
1 

Z e  


 Rse Z1e Z 2e 
其谐振曲线可按Ze的绝对值直接求得。
1
%MATLAB程序5-17.m
R1=2; R2=3; L1=0.75e-3; L2=0.25e-3;C=1000e-12;Rs=28200;
L=L1+L2;R=R1+R2;Rse=Rs*(L/L1)^2; %折算内阻
f0=1/(2*pi*sqrt(C*L))
Q0=sqrt(L/C)/R, R0=L/C/R;
%空载Q0值
Re=R0*Rse/(R0+Rse),
%折算内阻与回路电阻的并联
Q=Q0*Re/R0,B=f0/Q,
%实际Q值和通带
s=log10(f0)
f=logspace(s-.1,s+.1, 501); w=2*pi*f; %设定计算的频率范围及数组
z1e=R1+j*w*L; z2e=R2+1./(j*w*C);
%等效单回路中两个电抗支路的阻抗
ze=1./(1./z1e+1./z2e+1./Rse);
%等效单回路中三个支路的并联阻抗
subplot(2,1,1),loglog(w,abs(ze)),grid
%画对数幅频特性
axis([min(w),max(w),0.9*min(abs(ze)),1.1*max(abs(ze))])
subplot(2,1,2),semilogx(w,angle(ze)*180/pi)
%画相频特性
axis([min(w),max(w),-100,100]),grid
fh=w(find(abs(1./(1./z1e+1./z2e))>50000))/2/pi; %求幅频特性大于50kHz的频带
fhmin=min(fh),fhmax=max(fh),
程序运行结果:谐振频率f0 = 1.5915e+005,空载品质因数Q0 = 200,
等效信号源内阻Re = 4.0085e+004,考虑内阻后的品质因数Q = 40.0853,
通频带B = 3.9704e+003,fhmin = 1.5770e+005,fhmax = 1.6063e+005
5.5 二端口电路
[例7]阻抗匹配网络的计算
为使信号源(其内阻Rs=12Ω)与负载(RL=3Ω)相匹配,
在其间插入一阻抗匹配网络,电路如图。已知Z1=-j6Ω,Z2=j10Ω,Z3=j6Ω。若Us=24∠0º,求负载吸收的功率。
解:建模 方法1 用Z 方程求解,
对于二端口电路有



U 1  z11 I 1  z12 I 2








U 2  z 21 I 1  z 22 I 2
即
U 1  z11 I 1  z12 I 2  0

U 2  z 21 I 1  z 22 I 2  0






对电源端有 U S  RS I 1  U 1即 RS I 1  U 1  U S




对负载端有 U 2   R L I 2 即 U 2  R L I 2  0
将上四式写为矩阵形式
1
0

1

0
0  z11
1  z 21
0
RS
1
0
 
 z12  U 1   0 

 

 z 22  U 2   0 
  
0   I  U S 
  1   
RL 
0 

 I 2 
中z11=Z1+Z2=-j16, z12=-j10, z22=Z2+Z3=-j4, z21=-j10
Rs=12Ω,RL=3Ω,Us=24∠0º
 2
解出U2,则负载吸收功率为
U
2
P
RL
方法2 应用戴维南定理求解。令




可得开路电压 U OC  U 2 | 
,当 U S  0 时,I 2  0
I 2 0
负载端的输入阻抗即为等效阻抗
 z  z 22 RS

z11  RS
Z eq  Z OUT
按戴维南等效电路,得负载吸收功率

2
U OC
P
RL
Z OUT  RL
%MATLAB 程序5-19.m
clear, format
%调用画线路图函数
Rs=12;RL=3;
Z1=-6j; Z2=-10j; Z3=6j; Us=24;
%方法1用Z方程求解
Z(1,1)=Z1+Z2;Z(1,2)=-10j;
%列出Z矩阵各分量
Z(2,1)=Z(1,2); Z(2,2)=Z2+Z3; %系数矩阵A和系数矩阵B
A=[1,0,-Z(1,1), -Z(1,2);0,1,-Z(2,1),-Z(2,2);1,0,Rs,0;0,1,0,RL];
B=[0;0;Us;0]; X=A\B
%求方程解
U1=X(1); U2=X(2);I1=X(3);I2=X(4); %列出各未知数的解
P=abs(U2)^2/RL
%求负载功率
%方法2,用戴维南定理求解
Uoc=Us*Z2/(Z2+Rs+Z1)
%等效电压源开路电压
Zout=(det(Z)+Z(2,2)*Rs)/(Z(1,1)+Rs) %等效电压源内阻
P1=abs(Uoc/(Zout+RL))^2*RL
%求负载功率
程序运行结果
方法1
X =[U1;U2;I1;I2]=12.0000
4.8000 - 3.6000i
1.0000 + 0.0000i
-1.6000 + 1.2000i
P = 12.0000
方法2
Uoc = 9.6000 - 7.2000i
Zout = 3
P1 = 12.0000
[例8]二阶巴特沃斯低通数字滤波器的频率响应
二阶巴特沃思低通滤波器的传递函数为
z 2  2z  1
H ( z)  
(2  2 ) z 2  (2  2 )
求其频率响应并作图(0-2 )
解:建模
离散系统的频率响应函数为 H (e j )  H ( z ) | j
z e
(θ=ωts,ts为抽样周期),其幅频特性为|H(ejθ)|,相频特性为
∠H(ejθ),按定义编程。
信号处理工具箱中的freqz函数与此程序有同样功能。
%MATLAB程序q616.m
%二阶巴特沃思低通滤波器的离散系统函数为:
%H(z)=(z^2+2z+1)/((2+sqrt(2)z^2+(2-sqrt(2));
%求其频率响应可将z用exp(i*w)代入
b=[1, 2, 1]; a=[2+sqrt(2), 0, 2-sqrt(2)]; %给出滤波器分子分系数
N=input('取频率数组的点数N=');
w=[0:N-1]*pi/N;
%给出0 到pi之间的频率数组
H=polyval(b, exp(i*w))./polyval(a,exp(i*w));
%求频率响应
figure(1)
%在线性坐标内画频率特性
subplot(2, 1, 1), plot(w, abs(H)),grid
subplot(2, 1, 2), plot(w, unwrap(angle(H)), grid
figure(2)
%在对数坐标内画频率特性
subplot(2, 1, 1), semilogx(w, 20*log10(abs(H))),grid
subplot(2, 1, 2), semilogx(w, unwrap(angle(H))), grid
[例9]低通巴特沃思模拟滤波器设计
设计一个低通巴特沃思模拟滤波器,指标如下
通带截止频率:fp=3400Hz,通带最大衰减:Rp=3dB
阻带截止频率:fs=4000Hz,阻带最小衰减:As=40dB
解:建模
低通巴特沃思模拟滤波器的系统函数的一般形式如下
H a (S )   c /
N 1
 (S  S k )
k 0
极点
sk   C e
1 2 k 1
j ( 
)
2 2N
低通巴特沃思模拟滤波器的系统函数完全由阶数N和3dB截止
频率  决定。
c
N
lg k sp
lg sp
,

sp  s ,
p
 C1   P (10 0.1RP  1)
取

1
2N
,
10 RP / 10  1
k sp 
,
AS / 10
10
1
 C 2   S (10 0.1 AS  1)

1
2N
 C   C1 ,则所设计的滤波器的通带指标刚好满足,阻
带指标富裕;
取  C   C 2 ,则所设计的滤波器的阻带指标刚好满足,通
带指标富裕。
MATLAB工具箱函数buttord,butter就是根据以上关系式编
写的。因此设计时就无需再记忆和使用这些公式了。
%低通巴特沃思模拟滤波器设计
clear; close all
fp=3400; fs=4000; Rp=3; As=40;
%输入滤波器指标
[N, fc]=buttord (fp, fs,Rp, As, 's'); %计算阶数N和3dB截止频率fc
[B, A]=butter(N, fc, 's');
%设计低通巴特沃思模拟滤波器
[hf, f]=freqs(B, A,1024); %计算模拟滤波器频率响应,freqs为工具箱函数
subplot(3,2,1);
plot(f, 20*log10(abs(hf)/abs(hf(1))))
grid; xlabel('f/Hz');
label ('幅度(dB)')
axis ([0, 4000, -40,5])
line ([0,4000],[-3, -3]);
line([3400,3400],[-90, 5])Fp=3400; fs=4000; Rp=3; As=40;
%输入滤波器指标
互动互动
1、mesh ;surf 两个命令的区别是什么?
2、clear 、close all等语句作用是什么?
3、对全局变量有什么要求?
4、函数文件与主程序文件的主要区别是什么?
作
业
互动抢答
1、a([2,4,5], : )=[] 语句的含义是什么?
2、复数矩阵有几种赋值方法,什么叫做共轭,什么叫做转置?
3、区别下列矩阵:f1=ones(3,2) f2=zeros(2,3) f3=magic(3)
f4=eye(2)
4、 大矩阵可由小矩阵组成,组成的原则是什么?
5、矩阵加、减法要求相加减的两矩阵必须具备什么条件?如何相加减?
6、矩阵乘法要求是什么?两个相乘矩阵的内阶数指的是什么?例如
A×B。
7、标量如何与矩阵相乘?
8、左、右乘结果相同吗?什么情况下可以例外?
9、逆阵是什么?逆阵V存在条件是什么?
10、左除时阶数检查条件是什么?
11、右除时阶数检查条件是什么?
互动时间
1、MATLAB的运算符中哪些对矩阵进行的?举出最少5个例子。
2、幂次运算:对底数和指数的要求是什么?说明最少3点。
3、U1=sqrtm(S)、U2=sqrt(S)、V1=expm(S)、V2=exp(S)、Logm(D)、
Log(D)这些运算符的区别是什么?
4、z=10 : -3: -5这个语句是表示什么矩阵?
5、能说出d^3、d.^3、3.^d、3^d 的区别么?
6、A=magic(6);rem(A,3);p=(rem(A, 3)==0);lp=find (p)' 这4个语句运
行完了,是个什么结果呢?请一 一道来。
7、all(u)、any(p)这两个句子的含义是什么?
8、你能详细解释下面语句含义:
for x=0: 0.1: pi/4 disp([x, sin(x), cos(x), tan(x)]), end
1、if (表达式1) 语句组A,else 语句组B,end和
while (表达式) 语句组A,end 这两个语句有什么区
别?
2、for k= 初值:增量:终值 语句组A,end
switch-case-otherwise 这两个语句执行的是什么
样的流程?
3、plot(y2,'*b');plot(y1,':y');plot(y2,'+r') 分别是
什么样的图形?
4、loglog;semilogx;semilogy;polar(theta,rho)
这4句表示的坐标轴是什么?