MATLAB 符号运算
- 格式:doc
- 大小:160.50 KB
- 文档页数:15
3.1 算术符号操作命令+、-、*、.*、\、.\、/、./、^、.^、’、.’功能符号矩阵的算术操作用法如下:A+B、A-B 符号阵列的加法与减法。
若A与B为同型阵列时,A+B、A-B分别对对应分量进行加减;若A与B中至少有一个为标量,则把标量扩大为与另外一个同型的阵列,再按对应的分量进行加减。
A*B 符号矩阵乘法。
A*B为线性代数中定义的矩阵乘法。
按乘法定义要求必须有矩阵A的列数等于矩阵B的行数。
即:若A n*k*B k*m=(a ij)n*k.*(b ij)k*m=C n*m=(c ij)n*m,则,i=1,2,…,n;j=1,2,…,m。
或者至少有一个为标量时,方可进行乘法操作,否则将返回一出错信息。
A.*B 符号数组的乘法。
A.*B为按参量A与B对应的分量进行相乘。
A与B必须为同型阵列,或至少有一个为标量。
即:A n*m.*B n*m=(a ij)n*m.*(b ij)n*m=C n*m=(c ij)n*m,则c ij= a ij* b ij,i=1,2,…,n;j=1,2,…,m。
A\B 矩阵的左除法。
X=A\B为符号线性方程组A*X=B的解。
我们指出的是,A\B近似地等于inv(A)*B。
若X不存在或者不唯一,则产生一警告信息。
矩阵A可以是矩形矩阵(即非正方形矩阵),但此时要求方程组必须是相容的。
A.\B 数组的左除法。
A.\B为按对应的分量进行相除。
若A与B为同型阵列时,A n*m.\B n*m=(a ij)n*m.\(b ij)n*m=C n*m=(c ij)n*m,则c ij= a ij\ b ij,i=1,2,…,n;j=1,2,…,m。
若若A与B中至少有一个为标量,则把标量扩大为与另外一个同型的阵列,再按对应的分量进行操作。
A/B 矩阵的右除法。
X=B/A为符号线性方程组X*A=B的解。
我们指出的是,B/A粗略地等于B*inv(A)。
若X不存在或者不唯一,则产生一警告信息。
MATLAB符号运算前⾔有时候,你可能会遇到较复杂的⽅程(组),希望⽤MATLAB来求解。
MATLAB的符号运算正好可⽤于求解⽅程(组)。
此外,它还有许多其他功能。
例如,展开和简化、因式分解以及微积分运算等。
MATLAB的符号运算虽然是数值运算的补充,但是它仍然是科学计算研究中不可替代的重要内容。
与数值运算相⽐,符号运算不需要预先对变量赋值,其运算结果以标准的符号形式表达。
⽐如说计算sin(π),数值运算的结果是1.2246e-16,符号运算的结果是0。
前者是近似的,后者是精确的。
正⽂MATLAB符号运算功能⾮常强⼤,本⽂只介绍⼤部分常⽤的符号运算功能。
注:本⽂代码的运⾏环境是MATLAB R2016b。
1. 创建符号数、符号变量和符号矩阵这⼀步骤是符号运算的第⼀步,后⾯的步骤都是在此基础上进⾏的。
%创建符号数 (只能⽤sym函数)s0 = 1 / sym(7) %符号数,不适合⼤型符号数s1 = sym('1/7') %符号数s2 = sym('3 + 4i') %符号复数%创建符号变量 (sym函数和syms函数都⾏)%--sym函数s3 = sym('x') %符号变量%--syms函数syms a b c %创建多个符号变量,值为本⾝syms(sym('[d e; e d]')) %⽤已存在的符号变量矩阵创建多个符号变量%创建符号矩阵 (sym函数和syms函数都⾏)s4 = sym('[2 5 6; 9 8 6]') %符号数矩阵s5 = sym('x', [2 3]) %符号变量矩阵,矩阵内的元素不会被创建为符号变量A = [a b c; c b a] %⽤已存在的符号变量创建符号变量矩阵% syms A B [2 3] %仅2017及以上版本⽀持,同时创建多个符号矩阵代码运⾏结果如下。
可以看到s5是⼀个2x3的符号变量矩阵,但矩阵内元素不会被创建成符号变量。
1、MATLAB程序设计M文件:M文件是一种以m为扩展名的33文件,将MA TLAB命令流写入一个文本文件中,在MATLAB命令窗口中输入文件名可运行文件中的命令流。
此文件必须以m为扩展名,MATLAB系统才能识别。
MATLAB文件搜索路径为:安装目录下的work目录。
通过File|set path…菜单可以增加工作目录。
1.1 M函数(1)M函数的格式:Function 返回变量列表=函数名(输入变量列表)注释函数体语句End【例1.1.1】:打开Medit窗口,编写如下程序:function n=fibfun(m)%FIBFUN for calculating Fibonacci numbers%Incidengtally, the name Fibonacci comes from%Filius Bonassi, or”son of Bonassus”%fibfun.mif m>10n=fibfun (m-1) + fibfun (m-2);elsen=10;end编写完后以fibfun.m文件名存盘然后在MATLAB主命令窗口中执行如下程序:>> fibfun (15)ans =130>> fibfun (8)ans =10文件保存名称必须与函数名相同,这样才能保证调用成功。
m文件与m函数的主要区别在于m函数中定义的变量在函数调用完成后会清除,为局部变量,而m文件中定义的变量在MA TLAB运行期内始终存在。
一般以m文件作为主程序,在主程序中将一些功能模块以m函数的形式进行调用。
【例1.1.2】:M函数文件Function [y1 y2]=proab(a,b)Y1=a^3;Y2=b^3;End文件保存为proab.mM文件a=2;b=3;[y1 y2]=proab(a,b)文件保存为test.m,proab.m及test.m都保存在work目录中。
(2)变量:区分大小写,不需要指定类型,不需要事先声明,变量长度不能超过31位,第31个字符之后的字符将被忽略。
(3)常量:MA TLAB有一些预定我的变量,这些特殊的变量称为常量。
%以后的内容起到注释的作用,对最终结果不产生任何影响(应该养注释的好习惯,方便自己和别人调用)。
;结尾不显示结果1.2向量生成(1)利用冒号表达式x=start:step:endStart表示向量的首元素数值,end表示向量尾元素的数值限,step表示从第二个元素开始,元素数值大小与前一个元素值大小的差值。
苦step=1,可以省略,直接写成X=start:end。
【例1.1.3】:>> a=1:5:30a =1 6 11 16 21 26>> a=1:6a =1 2 3 4 5 6(2)Linspace函数,用来生成线性等分向量,其调用格式如下:·y=linspace (x1,x2)生成100维的行向量,使得y(1)=x1 ,y(100)=x2 ;·y= linspace (x1,x2,n)生成n维的行向量,使得y(1)=x1 ,y(n)=x2。
【例1.1.4】:>> a=linspace (1,50,6)a =1.0000 10.8000 20.6000 30.4000 40.2000 50.0000(3)Logspace函数,对数等分功能函数,其调用格式如下:·y=logspace (x1,x2) 生成50维对数等分向量,使得y (1)= 110x ,y (50)= 210x ; ·y= logspace (x1,x2,n ) 生成n 维对数等分向量,使得y (1)= 110x ,y (n )=210x 。
【例1.1.5】:>> a=logspace (1,4,5)a =1.0e+004 *0.0010 0.0056 0.0316 0.1778 1.0000(4)点积dot(a,b) ,当a 和b 都为列向量时,等价于a ’*b 。
返回向量的数量点积。
a 和b 必须同维。
其格式如下:dot (a,b,dim) 返回a 和b 在维数为dim 的点积。
【例1.1.6】:>> a=[1,2,3]' %[1,2,3]'表示a 为列向量,即我们熟悉的 T ]3,2,1[a =123>> b=[4,5,6]'b =456>> dot (a,b)ans =32>> a'*bans =32(5)叉积cross(a,b),表示过两相交向量的交点的垂直于两向量所在平面的向量。
其格式为: c= cross (a,b) 返回向量a 和b 的叉积向量。
即c=a ×b 。
a 和b 必须为三维向量。
【例1.1.7】:>> a=[1,2,3];>> b=[4,5,6];>> c=cross(a,b)c =-3 6 -31.3矩阵输入矩阵时,要以“[]”为标识,元素应在“[]”内部,MA TLAB才会将其识别为矩职。
同行元素之间可用空格或“,”分隔,行与行之间要用“;”或回车符分隔。
(1)零矩阵zeros(m,n),建立一个m*n阶零矩阵。
【例1.1.8】:>> zeros(5,6)ans =0 0 0 0 0 00 0 0 0 0 00 0 0 0 0 00 0 0 0 0 00 0 0 0 0 0(2)单位阵eye(n),建立一个n阶单位阵【例1.1.9】:>> eye(3)ans =1 0 00 1 00 0 1(3)全1阵ones(m,n),建立一个m*n阶全1阵【例1.1.10】:>> ones(3,4)ans =1 1 1 11 1 1 11 1 1 1(4)随机阵rand(m,n),随机建立一个m*n阶矩阵【例1.1.11】:>> rand(3,4)ans =0.8147 0.9134 0.2785 0.96490.9058 0.6324 0.5469 0.15760.1270 0.0975 0.9575 0.9706(5)行列式det(A)(6)求逆inv(A),求A矩阵的逆矩阵【例1.1.12】:>> A=rand(3,3) %随机生成一个矩阵AA =0.9572 0.1419 0.79220.4854 0.4218 0.95950.8003 0.9157 0.6557>> det(A) %求上面生成随机阵的行列式ans =-0.4278>> inv(A) %求上面生成的矩阵A 的逆矩阵ans =1.4075 -1.4784 0.4628-1.0510 0.0148 1.2480-0.2500 1.7836 -0.7827(7)特征值eig,eigs【例1.1.13】:计算下面矩阵的特征值和特片向量。
⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=451973152A 解:>> A=[2,5,1;3,7,9;1,5,4];>> [x,y]=eig(A) %x 是特征向量矩阵,y 是特征值矩阵x =-0.3852 -0.9555 0.6691-0.8012 0.0433 -0.6236-0.4580 0.2919 0.4044y =13.5875 0 00 1.4680 00 0 -2.0555(8)条件数cond ,比如求特征值的条件数,我们用condeig (A )【例1.1.14】:>> condeig(A) %A 还是例13中的矩阵Aans =1.04221.24421.2211(9)范数norm ,它的调用格式是norm (A ,n ),A 为矩阵(向量),n 可以为1(1范数)、2(2范数)、inf 或fro 。
(10)秩rank ,求矩阵的秩【例1.1.15】:%仍然取例13中的矩阵A>> rank(A)ans =3(11)迹trace ,调用格式为trace (A ),A 为要求迹的矩阵(12)奇异值分解svd ,调用格式为[x ,y ]=svd (A )【例1.1.16】:>> [x,y]=svd(A)x =-0.3277 0.8842 -0.3329-0.8284 -0.4383 -0.3486-0.4542 0.1615 0.8761y =14.1191 0 00 3.2978 00 0 0.8806(13)LU 分解lu ,调用格式为[x ,y ]=lu (A )(14)QR 分解qr ,调用格式为[x ,y ]=qr (A )(15)Chol 分解chol ,调用格式为[x ,y ]=chol (A )1.4多项式运算多项式的表示方法对于多项式()n n n n a x a x a x a x p ++++=--1110...,用以下的行向量表示:],,......,,[110n n a a a a p -=这样可以把多项式问题转化为向量问题。
(1)Polyval 和polyvalm 求值polyval 以数组为单元,polyvalm 以矩阵为单元【例1.1.17】:>> p=[1 4 9 16];>> b=[1 1 1 1];>> polyval(p,b)ans =30 30 30 30(2)Roots 求根,调用格式为roots (P )【例1.1.18】:求解方程01501522=+-x x 的根>> p=[2,-15,150];>> roots(p)ans =3.7500 + 7.8062i3.7500 - 7.8062i(3)多项式的乘除法运算conv,deconv,用向量卷积实现【例1.1.19】:>> p=[2,3,4,5];>> b=[4,6,8,10];>> a=conv(p,b)a =8 24 50 88 92 80 50>> c=deconv(a,b)c =2 3 4 5可以看出C与P是相等的。
(4)Polyder微分,调用格式是polyder(P)【例1.1.20】:还是用上例中的P>> pp =2 3 4 5>> polyder(p)ans =6 6 4(5)Polyfit多项式拟合,调用格式如下:·polyfit(x,y,n)其中x,y为拟合数据,n为拟合多项式的阶数。
·[P,k]=polyfit(x,y,n)其中p为拟合多项式系数向量,k为拟合多项式系数向量的结构信息。