第二章 MATLAB 语言程序设计基础.docx
《第二章 MATLAB 语言程序设计基础.docx》由会员分享,可在线阅读,更多相关《第二章 MATLAB 语言程序设计基础.docx(55页珍藏版)》请在冰豆网上搜索。
第二章MATLAB语言程序设计基础
第二章MATLAB语言程序设计基础
•MATLAB语言的简洁高效性
•MATLAB语言的科学运算功能
•MATLAB语言的绘图功能
•MATLAB庞大的工具箱与模块集
•MATLAB强大的动态系统仿真功能
本章主要内容
•MATLAB程序设计语言基础
•基本数学运算
•MATLAB语言流程控制
•MATLAB函数的编写
•二维图形绘制
•三维图形绘制
2.1MATLAB程序设计语言基础
•MATLAB语言的变量命名规则是:
(1)变量名必须是不含空格的单个词;
(2)变量名区分大小写;
(3)变量名最多不超过19个字符;
(4)变量名必须以字母打头,之后可以是
任意字母、数字或下划线,变量名中
不允许使用标点符号
MATLAB的保留常量
常数
返回值
ans
默认变量名,保存最近的结果。
如果不给表达式指定一个输出变量,MATLAB会自动将结果保存到ans变量中
eps
浮点相对精度。
是MATLAB用于计算的容限,值为2.2204e-16
realmax
计算机可以表示的最大浮点数
realmin
计算机可以表示的最小浮点数
pi
圆周率
i,j
虚数单位
inf
无限值。
类似n/0的表达式生成的结果为inf,其中n为非0实数
NaN
表示不合法的数值值,非数值。
类似0/0和inf/inf的表达式生成的结果,与NaN有关的算术运算结果,以及n/0,n为复数时的计算结果都是NaN
computer
计算机类型
version
MATLAB版本字符串
nans和空矩阵在matlab中作特殊处理。
例:
>>a=[12naninfnan]
a=
12naninfnan
>>b=2*a
b=
24naninfnan
>>d=(a==nan)
d=
00000
>>f=(a~=nan)
f=11111
>>size([])
ans=
00
>>x=(1:
5)-3
x=
-2-1012
>>y=find(x>2)
y=
[]
>>isempty(y)
ans=
1
>>a=(y==0)
a=
0
>>x=(-3:
3)/3
x=
-1.0000-0.6667-0.333300.33330.66671.0000
>>sin(x)./x
ans=
0.84150.92760.9816NaN0.98160.92760.8415
>>x=x+(x==0)*eps;
>>sin(x)./x
ans=
0.84150.92760.98161.00000.98160.92760.8415
数学运算符号及标点符号
+
加法运算,适用于两个数或两个同阶矩阵相加
-
减法运算
*
乘法运算
.*
点乘运算
/
除法运算
./
点除运算
^
乘幂运算
.^
点幂运算
\
反斜杠表示左除
(1)MATLAB的每条命令后,若为逗号或无标点符号,
则显示命令的结果;若命令后为分号,则禁止显示结果.
(2)“%”后面所有文字为注释.
(3)“...”表示续行.
•双精度数值变量
–IEEE标准,64位(占8字节),11指数位,53数值位和一个符号位
–
–double()函数的转换
•其他数据类型
–uint8,无符号8位整形数据类型,值域为0至255,常用于图像表示和处理。
(节省存储空间,提高处理速度)
–int8(),int16(),int32(),uint16(),uint32()
数字显示的8种格式
MATLAB命令
显示形式
说明
Formatlong
3.14159264358979
16位十进制
Formatshorte
3.1416e+000
5位十进制加指数
Formatlonge
3.14159264358979e+000
16位十进制加指数
Formathex
400921fb54442d18
16位十六进制
Formatbank
3.14
两位小数
Format+
+
正、负、零
Formatrat
355/113
分数
Formatshort(默认)
3.1416
四位小数
>>pi
ans=
3.1416
>>formatlong
>>pi
ans=
3.141592653589793
>>formatshorte
>>pi
ans=
3.1416e+000
>>formatlonge
>>pi
ans=
3.141592653589793e+000
•符号型,sym(A),常用于公式推导、解析解法
–符号变量声明
•symsvar_listvar_props
•例:
symsabreal
•symscpositive
–符号型数值可采用变精度函数求值
•vpa(A),或vpa(A,n)
>>vpa(pi)
ans=
3.1415926535897932384626433832795
>>vpa(pi,60)
ans=
3.14159265358979323846264338327950288419716939937510582097494
•需要注意的是vpa的结果是符号数值,可以用于初等运算,不可用于关系运算。
>>a=vpa(pi)
a=
3.1415926535897932384626433832795
>>a+1
ans=
4.1415926535897932384626433832795
>>a>1
?
?
?
Undefinedfunctionormethod'gt'forinputargumentsoftype'sym'.
MATLAB支持的其他数据类型
•字符串型数据:
用单引号括起来。
•多维数组:
是矩阵的直接扩展,多个下标。
•单元数组:
将不同类型数据集成到一个变量名下面,用[]表示;例:
用A[i,j]可表示单元数组A的第i行,第j列的内容。
•类与对象:
允许用户自己编写包含各种复杂详细的变量,可以定义传递函数。
MATLAB的基本语句结构
•直接赋值语句
赋值变量=赋值表达式
例:
>>a=pi^2
a=
9.8696
例:
表示矩阵
>>B=[1+9i,2+8i,3+7j;4+6j,5+5i,6+4i;7+3i,8+2j,1i]
B=
1.0000+9.0000i2.0000+8.0000i3.0000+7.0000i
4.0000+6.0000i5.0000+5.0000i6.0000+4.0000i
7.0000+3.0000i8.0000+2.0000i0+1.0000i
•函数调用语句
[返回变量列表]=函数名(输入变量列表)
例:
[a,b,c]=my_fun(d,e,f,g)
•冒号表达式
v=s1:
s2:
s3
该函数生成一个行向量v,其中s1是起始值,s2是步长(若省略步长为1),s3是最大值。
例:
用不同的步距生成(0,π)间向量。
>>v1=0:
0.2:
pi
v1=
Columns1through9
00.20000.40000.60000.80001.00001.20001.40001.6000
Columns10through16
1.80002.00002.20002.40002.60002.80003.0000
>>v2=0:
-0.1:
pi%步距为负不能生成向量,得出空矩阵
v2=
Emptymatrix:
1-by-0
>>v3=0:
pi
v3=
0123
>>v4=pi:
-1:
0%逆序排列构成新向量
v4=
3.14162.14161.14160.1416
>>v5=[0:
0.4:
pi,pi]%扩充向量
v5=
00.40000.80001.20001.60002.00002.40002.80003.1416
Linspace函数
Linspace(初值,终值,点数)
>>theta=linspace(0,2*pi,9)
theta=
00.78541.57082.35623.14163.92704.71245.49786.2832
Logspace函数
>>w=logspace(0,1,11)
w=
1.00001.25891.5849…..6.30967.943310.0000
即从10的0次幂到1次幂之间按幂等分为11个点。
子矩阵提取
•基本语句格式B=A(v1,v2)
v1、v2分别表示提取行(列)号构成的向量。
例:
>>A=[1,2,3,4;3,4,5,6;5,6,7,8;7,8,9,0]
A=
1234
3456
5678
7890
>>B1=A(1:
2:
end,:
)%提取全部奇数行、所有列。
B1=
1234
5678
>>B2=A([3,2,1],[2,3,4])%提取3,2,1行、2,3,4列构成子矩阵。
A=
B2=1234
6783456
4565678
2347890
>>B3=A(:
end:
-1:
1)%将A矩阵左右翻转,即最后一列排在最前面。
B3=
4321
6543
8765
0987
>>A(5,:
)=[3,2,6,8]
A=
1234
3456
5678
7890
3268
>>A(6,2)=3
A=
1234
3456
5678
7890
3268
0300
>>A(6,:
)=[]
A=
1234
3456
5678
7890
3268
>>A(12)=0
A=
1234
3406
5678
7890
3268
聚合矩阵
E=ones(2,5)*6;%2×5的矩阵,元素为6
F=rand(3,5);%3×5的矩阵,元素为随机数
G=[E;F]%垂向聚合E和F
G=
6.00006.00006.00006.00006.0000
6.00006.00006.00006.00006.0000
0.81470.91340.27850.96490.9572
0.90580.63240.54690.15760.4854
0.12700.09750.95750.97060.8003
2.2基本数学运算
•矩阵的代数运算
•矩阵表示
A矩阵为n*m矩阵
•矩阵转置
–数学表示(若A有复数元素,先转置再取各元素共轭复数值)
>>z=[1+2i,3+4i;5+6i,7+8i]%也可z=[1,3;5,7]+[2,4;6,8]i
z=
1.0000+2.0000i3.0000+4.0000i
5.0000+6.0000i7.0000+8.0000i
>>w=z’%共轭转置
w=
1.0000-2.0000i5.0000-6.0000i
3.0000-4.0000i7.0000-8.0000i
>>u=conj(z)%共轭
u=
1.0000-2.0000i3.0000-4.0000i
5.0000-6.0000i7.0000-8.0000
>>v=conj(z)’%转置
v=
1.0000+2.0000i5.0000+6.0000i
3.0000+4.0000i7.0000+8.0000i
矩阵的四则运算
•数组和矩阵的加减运算使用加号和减号,即“+”和“-”。
•矩阵相乘使用“*”运算符。
•如果只是将两个矩阵中相同位置的元素相乘,使用“.*”运算符。
•矩阵除法有左除和右除的区别,分别使用“\”和“/”运算符。
•与“\”和“/”运算符相对应,也有“.\”和“./”运算符,分别用于将两个矩阵中的对应元素相除。
•矩阵与常数的代数运算,可以直接使用上面的各种运算符。
•矩阵加减法
C=A+BD=A-B
–注意维数是否相等
–注意其一为标量的情形
•矩阵乘法
–数学表示
C=AB
–MATLAB表示
C=A*B
–注意相容性
•矩阵除法
–矩阵左除:
AX=B,求X
–MATLAB求解:
X=A\B
•若A为非奇异方阵,则X=A-1B
•最小二乘解(若A不是方阵)
在线性代数中,没有除法,只有逆矩阵。
对于任意n*n阶方阵A,如果能找到一个同阶的矩阵V,使AV=I,I为单位矩阵,则V为A的逆阵。
即V=A-1
在matlab中写成V=inv(A)。
上面式子中:
inv(A)*A*X=inv(A)*B
X=inv(A)*B
在matlab中表示为
X=A\B(左除)
–矩阵右除:
XA=B,求X
–MATLAB求解:
X=B/A
•若A为非奇异方阵,则X=BA-1
•最小二乘解(若A不是方阵)
X*A*inv(A)=B*inv(A)
则:
X=B*inv(A)
在matlab中表示为:
X=B/A(右除)
>>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
?
?
?
Errorusing==>*Innermatrixdimensionsmustagree.
>>A’*B
ans=
61620
92325
123030
>>A*B’
ans=
1022
2849
>>D\A
?
?
?
Errorusing==>*Innermatrixdimensionsmustagree.
>>D\A’
ans=
-0.03700.0000
0.51851.0000
-0.14810.0000
>>A/D
ans=
0.40740.07410.0000
0.74070.40740.0000
矩阵除法解线性方程组
6x1+3x2+4x3=3
-2x1+5x2+7x3=-4
8x1-4x2-3x3=-7
此式可写成矩阵形式Ax=B,
A=[6,3,4;-2,5,7;8,-4,-3],B=[3;-4;-7];
x=A\B
得出x=0.6000
7.0000
-5.4000
•矩阵翻转
–左右翻转B=fliplr(A)
–上下翻转C=flipud(A)
–旋转90o(逆时针)D=rot90(A)
–如何旋转180o?
>>D=rot180(A)
?
?
?
Undefinedfunctionorvariable'rot180'.
>>D=rot90(rot90(A))
矩阵乘方
–A为方阵,求
–MATLAB实现:
F=A^x
•点运算--矩阵对应元素的直接运算
数学表示:
MATLAB实现:
C=A.*B
例:
>>A=[1,2,3;4,5,6;7,8,0];
>>B=A.^A
B=
1427
256312546656
823543167772161
>>C=A.*A
C=
149
162536
49640
例:
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)
X=[1,2,3],Y=[4,5,6]
求:
Z=X.*Y,Z=X.\Y,Z=X.^Y,Z=X.^2,Z=2.^[XY]
思考:
X*Y能成立吗?
数组运算有没有左除右除之分?
X^Y能成立吗?
X^2能成立吗?
(注:
expm(),logm(),sqrtm()都是把矩阵当作一个整体看待。
)
矩阵的逻辑运算
•逻辑变量:
–当前版本有逻辑变量
–对double变量来说,非0表示逻辑1
•逻辑运算(相应元素间的运算)
–与运算A&C
–或运算A|C
–非运算~A
–异或运算xor(A,C)
•各种允许的比较关系
>,>=,<,<=,==,~=,find(),all(),any()
•例:
>>A
A=
123
456
780
>>find(A>=5),%大于或等于5元素的下标
ans=
3568
>>[i,j]=find(A>=5);[i,j]%显示行标,列标
ans=
31
22
32
23
>>all(A>=5)%某列元素全大于或等于5时,相应元素为1,否则为0。
ans=
000
>>any(A>=5)%某列元素中含有大于或等于5时,相应元素为1,否则为0。
ans=
111
解析结果的化简与变换
MATLAB实现:
s1=simple(s)从各种方法中自动选择最简格式[s1,how]=simple(s)化简并返回实际采用的化简方法
其中,s为原始表达式,s1为化简后表达式,how为采用的化简方法。
•其他常用化简函数(信息与格式可用help命令得出)
collect()合并同类项
expand()展开多项式
factor()因式分解
numden()提取多项式的分子和分母
例:
>>[n,d]=numden(sym(4/5))
n=4
d=5
>>[n,d]=numden(x/y+y/x)
n=x^2+y^2
d=x*y
例:
>>symss;%定义一个符号变量
>>P=(s+3)^2*(s^2+3*s+2)*(s^3+12*s^2+48*s+64)
P=
(s+3)^2*(s^2+3*s+2)*(s^3+12*s^2+48*s+64)
>>simple(P)%一系列化简尝试,得出计算机认为的最简形式
ans=
(s+3)^2*(s+2)*(s+1)*(s+4)^3
>>[a,m]=simple(P)%返回化简方法为因式分解方法,用factor()函数将得同样结果
a=
(s+3)^2*(s+2)*(s+1)*(s+4)^3
m=
factor
>>expand(P)
ans=
s^7+21*s^6+185*s^5+883*s^4+2454*s^3+3944*s^2+3360*s+1152
•变量替换
f1=subs(f,x1,x1*)
f1=subs(f,{x1,x2,……,xn},{x1*,x2*,……,xn*})
其中,f为原表达式,用x*替换x得出新的。
例:
求函数值
f(t)=cos(at+b)+sin(ct)*sin(dt)
>>symsabcdt;%假设这些变量均为符号变量
>>f=cos(a*t+b)+sin(c*t)*sin(d*t);%定义给定函数f(t)
>>f1=subs(f,{a,b,c,d,t},{0.5*pi,pi,0.25*pi,0.125*pi,4})
f1=
-1.0000
解方程
符号数学函数可用于解方程、方程组和微分方程。
solve(f)求符号方程f的符号变量解。
如果f是一个符号表达式,则求f=0的符号变量解。
如果有多个变量,优先求解x。
solve(f1,f2,……,fn)求由f1,f2,……,fn表示的方程组的解。
solve(f,’y’)求符号方程关于变量y的解。
例:
eq1=sym(‘x-3=4’);
eq2=sym(‘x^2-x-6’);
eq3=sym(‘x^2+2*x+4=0’);
eq4=sym(‘3*x+2*y-z=10’);
eq5=sym(‘-x+3*y+2*z=5’);
eq6=sym(‘x-y-z=-1’);
求:
solve(eq1),solve(eq2),solve(eq3),solve(eq4),
solve(eq4,y),solve(eq4,eq5,eq6)
微分
diff()函数用于求一个符号表达式的符号导数。
diff(f)返回f关于缺省的自变量的导数
diff(f,’t’)返回f关于自变量t的导数
diff(f,n)返回f关于缺省自变量的n阶导数
diff(f,‘t’,n)返回f关于自变量t的n阶导数
例:
s1=sym(‘6*x^3-4*x^2+b*x-5’);
s2=sym(‘sin(a)’);
s3=sym(‘(1-t^3)/(1+t^4)’);
求:
diff(s1),diff(s2,2),diff(s1,’b’),diff(s2),diff(s3)
积分
int()函数用于求表达式的积分。
int(f)返回f关于缺省自变量的积分
int(f,’t’)返回f关于自变量t的积分
int(f,a,b)返回f关于缺省自变量在区间[a,b]的积分
int(f,’t’,a,b)返回f关于自变量t在区间[a,b]的积分
int(f,’m’,’n’)返回f关于缺省自变量在区间[m,n]的积分,这里m,n为符号表达式。
例:
s1=sym(‘6*x^3-4*x^2+b*x-5’);
s2=sym(‘sin(a)’);
s3=sym(‘sqrt(x)’);
求:
int(s1),int(s2),int(s3),int(s3,‘a’,’b’),
int(s3,0.5,0.6)
优先级
运算
1
括号
2
乘方运算,从左到右
3
乘法和除法运算,从左到右
4
加法和减法运算,从左到右
基本数论运算
基本数学函数包括一些