薛定宇教授大讲堂(卷Ⅲ):MATLAB线性代数运算
上QQ阅读APP看书,第一时间看更新

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的任意矩阵,其元素为aiji=1,2,…,nj=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 试输入如下的两个矩阵和一个列向量。

从给出的要求可见,矩阵AB都需要双下标,所以需要给出字符串'%d%d'设置。另外,两个矩阵的符号分别为af,所以可以用下面的语句直接输入两个矩阵。相比之下,向量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)

其中,nm为矩阵的行数与列数,如果只给出n,将生成一个方阵。变元x1x2,…,xk为事先声明的符号变量,a还可以使用任何其他字母,生成的函数矩阵为

例2-22 若先声明符号变量xyt,则可以用下面的命令生成函数矩阵。注意,使用矩阵函数的方式输入矩阵。

生成的任意函数矩阵与向量为