2.3 符号型矩阵的输入方法
前面介绍过,若已建立起数值矩阵A,则可以由B=sym(A)语句将其转换成符号型矩阵。所有数值矩阵均可以通过这种形式转换成符号型矩阵,可以利用符号运算工具箱获得更高精度的解。相反地,一个全数值的符号型矩阵B可以通过命令A1=double(B)转换成双精度矩阵A1。
但是,如果矩阵中含有符号变量,则不能由double()函数进行转换,否则将给出错误信息。
2.3.1 特殊符号矩阵的输入方法
前面介绍的很多特殊矩阵输入函数都可以直接生成符号型矩阵,或由sym()函数转换成符号型矩阵。例如,eye(5)函数可以生成双精度单位矩阵,然后由sym()函数转换成符号型单位矩阵。较新版本的MATLAB还支持一些特殊符号矩阵,例如Vandermonde矩阵、Hankel矩阵和相伴矩阵等的直接输入函数。如果读者使用的版本不支持生成这样的符号型矩阵,则可以使用本书所附的函数vandersym()、hankelsym()和compansym()生成相应的符号型矩阵。
例2-18 试由多项式P(λ)=a1λ7+a2λ6+a3λ5+…+a6λ2+a7λ+a8建立相伴矩阵。
解 可以先由sym()函数生成行向量a,然后由compan()函数直接生成所需的相伴矩阵。这里,由于原始的向量不是首一化的系数向量,MATLAB函数会自动作首一化处理,然后再生成相伴矩阵。
得出的相伴矩阵为
2.3.2 任意常数矩阵的输入
MATLAB提供的sym()函数除了矩阵类型转换外,还可以生成任意元素aij构成的矩阵,具体的调用格式为
A=sym('a%d%d',[n,m])%其中,%d%d表示双下标
上面的语句可以生成n×m的任意矩阵,其元素为aij,i=1,2,…,n,j=1,2,…,m。如果不给出m,则将生成一个n×n的任意方阵。
类似地,使用下面的命令可以生成任意的行向量v1和列向量v2。
v1=sym('a',[1,n]),v2=sym('a',[n,1]),%第一种方法
v1=sym('a%d',[1,n]),v2=sym('a%d',[n,1]),%第二种方法
例2-19 试输入如下的两个矩阵和一个列向量。
解 从给出的要求可见,矩阵A和B都需要双下标,所以需要给出字符串'%d%d'设置。另外,两个矩阵的符号分别为a和f,所以可以用下面的语句直接输入两个矩阵。相比之下,向量v的输入比较简单与直观。
>> A=sym('a%d%d',4), B=sym('f%d%d',[4,2]), v=sym('v',[4,1])
如果想进一步声明满足某种属性的矩阵,还可以用assume()与assumeAlso()函数设定。例如,可以使用下面的命令设置矩阵属性。
>> assume(A,'real'); assumeAlso(A,'integer') %设置其他矩阵属性
其中,这两个函数可以使用的属性为integer(整数)、rational(有理数)、real(实数)与positive(正数)。如果不特别设置,则一般矩阵的默认类型为复数矩阵。
例2-20 试重新输入例2-18中要求的相伴矩阵。
解 由a=sym('a',[1,8])命令就可以声明任意符号型向量,而无须像例2-18那样逐个声明、逐个输入向量元素,即使更大规模的向量也可以这样输入。
>> a=sym('a',[1,20]); A=compan(a) %建立符号型相伴矩阵
例2-21 试建立一个3×6的任意实有理数矩阵。
解 由前面的介绍,不难建立所需的矩阵。
2.3.3 任意矩阵函数的输入
sym()函数可以生成任意常数矩阵,根据该函数还可以编写出任意矩阵函数的输入函数。例如,如果想生成矩阵函数M={mij(x,y)},则可以根据需要编写出通用函数any_matrix()。
该函数的调用格式为
A(x1,x2,…,xk)=any_matrix([n,m],'a',x1,x2,…,xk)
其中,n,m为矩阵的行数与列数,如果只给出n,将生成一个方阵。变元x1,x2,…,xk为事先声明的符号变量,a还可以使用任何其他字母,生成的函数矩阵为
例2-22 若先声明符号变量x、y和t,则可以用下面的命令生成函数矩阵。注意,使用矩阵函数的方式输入矩阵。
生成的任意函数矩阵与向量为