在本节中,我们将介绍符号矩阵和matlab提供的工具,它用线性代数求解问题。
符号矩阵
符号矩阵和向量是数组,其元素为符号表达式,可用函数sym来产生。
>> A=sym( ' [a, b, c; b, c, a; c, a, b] ' )
A=
[ a, b, c]
[ b, c, a]
[ c, a, b]
>> G=sym( ' [cos(t), sin(t);-sin(t),cos(t)] ' )
G=
[ cos(t), sin(t)]
[-sin(t), cos(t)]
函数sym也可以扩展成定义各元素的公式。注意,只有在这种情况下,i,j分别表示行列的位置;且不影响i,j的缺省值(它代表 )。下面的例子建立了3×3的矩阵,其元素依赖于行和列的位置。
>> S=sym(3,3,' (i+j)+(i-j+s) ') % create a matrix using a formula
S=
[ 2/s, 3/(-1+s), 4/(-2+s)]
[1/(1+s), 4/s, s/(-1+s)]
[4/(2+s), 5/(1+s), 6/s]
>> S=sym(3, 3, ' m ', ' n ', ' (m-n)/(m-n-t) ') % use m and n in another formula
S=
[ 0, -1/(-1-t), -2/(-2-t)]
[1/(1-t), 0, -1/(-1-t)]
[2/(2-t), 1/(1-t), 0]
函数sym也可以把数值矩阵转换成符号形式
>> M=[1.1, 1.2, 1.3; 2.1, 2.2, 2.3; 3.1, 3.2, 3.3] % a numeric matrix
M=
1.1000 1.2000 1.3000
2.1000 2.2000 2.3000
3.1000 3.2000 3.3000
>> S=sym(M) % convert to symbolic form
S=
[11/10, 6/5, 13/10]
[21/10, 11/5, 23/10]
[31/10, 16/5, 33/10]
如果数值矩阵的元素可以指定为小的整数之比,则函数sym将采用有理分式表示。如果元素是无理数,则在符号形式中sym将用符号浮点数表示元素。
>> E=[exp(1) sqrt(2)]
E=
2.7183 1.4142
>> sym(E)
ans=
[3060513257434036*2^(-50), 3184525836262886*2^(-51)]
用函数symsize可以得到符号矩阵的大小(行,列数)。函数返回数值或向量,而不是符号表达式。symsize的四种形式说明如下:
>> S=sym(' [a,b,c;d,e,f] ') % create a symbolic matrix
S=
[a,b,c]
[d,e,f]
>> d=symsize(S) % return the size of S as the 2-element vector d
d=
2 3
>> [m,n]=symsize(S) % return the number of rows in m, and column in n
m=
2
n=
3
>> m=symsize(S,1) % return the number of rows
m=
2
>> n=symsize(S,2) % return the number of columns
n=
3
数值数组用N(m,n)形式来访问单个元素,但符号数组元素必须用函数如sym(S,m,n)来获取。若能用相同的句法当然好,但MATLAB符号表达式的表示不方便。在内部,符号数组表示成一个字符串数组;而S(m,n)返回单个字母。所以,符号数组的各个元素,必须由符号函数,如sym,来指定,而不是直接指定。
>> G=sym(' [ab,cd;ef,gh] ') % create a 2-by-2 symbolic matrix
G=
[ab, cd]
[ef , gh]
>> G(1,2) % this is the second character of the first row of G
ans=
a
>> r=sym(G,1,2) % this is the second expressinon in the first row of G
r=
cd
记住,在上例中的符号矩阵G,实际是以2×7字符数组存储在计算机中。第一行为' [ab, cd] ',所以第二个元素是' a '。
最后,sym可以用于改变符号数组的一个元素。
>> sym(G,2,2,' pq ') % change the (2,2) element in G from ' gh ' to ' pq '
ans=
[ab, cd]
[ef, pq]
代数运算
用函数symadd,symsub,symmul和symdiv,对符号矩阵可以执行许多通用的代数运算,用sympow可计算乘幂,用transpose计算符号矩阵的转置。
>> G=sym(' [cos(t),sin(t0;-sin(t0,cos(t)] ') % create a symbolic matrix
G=
[ cos(t), sin(t)]
[ -sin(t), cos(t)]
>> symadd(G, ' t ' ) % add ' t ' to each element
ans=
[ cos(t)+t, sin(t)+t]
[ -sin(t)+t, cos(t)+t]
>> symmul(G,G) % multiply G by G; Synpow(G,2) does the same thing
ans=
[cos(t)^2-sint(t)^2, 2*cos(t)*sin(t)]
[ -2*cos(t)* sin(t), cos(t)^2-sin(t)^2]
>> simple(G) % try to simplify
ans=
[cos(2*t), sin(2*t)]
[-sin(2*t), cos(2*t)]
下面通过证明G的转置是它的逆来证明G是正交阵。
>> I=symmul(G,transpose(G)) % multiply G by its transpose
I=
[cos(t)^2+sin(t)^2, 0]
[ 0, cos(t)^2+sin(t)^2]
>> simplify(I) % there appears to be a trig identity here
ans=
[1, 0]
[0, 1]
正如所期望的那样,这是单位阵。
线性代数运算
用函数inverse和determ,可计算符号矩阵的逆阵以及行列式。
>> H=sym(hilb(3)) % the symbolic form of the numeric 3-by-3 Hilbert matrix
H=
[ 1, 1/2, 1/3]
[1/2, 1/3, 1/4]
[1/3, 1/4, 1/5]
>> determ(H) % dind the determinant of H
ans=
1/2160
>> J=inverse(H) % find the inverse of H
J=
[ 9, -36, 30]
[-36, 192, -180]
[ 30, -180, 180]
>> determ(J) % find the determinant of the inverse
ans=
2160
用函数linsolve求解齐次线性方程;这是等价于基本的MATLAB的逆斜杠算子的符号,linsolve(A,B)对X方阵求解矩阵方程A*X=B。回到以前的硬币问题:
黛安娜想去看电影,她从小猪存钱罐倒出硬币并清点,她发现:
10美分的硬币数加上5美分的硬币总数的一半等于25美分的硬币数。
1美分的硬币数比5美分、10美分以及25美分的硬币总数多10。
25美分和10美分的硬币总数等于1美分的硬币数加上1/4的5美分的硬币数
25美分的硬币数和1美分的硬币数比5美分的硬币数加上8倍的10美分的硬币数多1。。
象上次所做的那样,列出线性方程组,令p,n,d和q分别为1美分,5美分,10美分,和25美分的硬币数
重新以p,n,d,q的顺序排列表达式
p/2+n/2+d-q=0 p-n-d-q=-10 -p-n/4+d+q=0
p-n-8d+q=1
接下来,列出方程系数的符号数组。
>> A=sym(' [1/2,1/2,1,-1;1,-1,-1,-1;-1,-1/4,1,1;1,-1,-8,1] ')
A=
[1/2, 1/2, 1, -1]
[ 1, -1, -1, -1]
[ -1, -1/4, 1, 1]
[ 1, -1, -8, 1]
>> B=sym(' [0;-10;0;-1] ') % Create the symbolic vector B
B=
[ 0]
[-10]
[ 0]
[ -1]
>> X=linsolve(A,B) % solve the symbolic system A ' X=B for x
x=
[16]
[ 8]
[ 3]
[15]
结果是相同的,黛安娜有16枚1美分的硬币,8枚5美分的硬币,3枚10美分的硬币,15枚25美分的硬币。
其他特性
symop将其参量串接起来,并计算所得到的表达式。
>> f=' cos(x) ' % create an expression
f=
cos(x)
>> symop( ' atan( ' ,f, ' + ' ,a, ' ) ' , ' ^2 ' )
ans=
atan(cos(x)+a)^2
在用函数symop时,若将数组和标量混合应慎重。例如:
>> M=sym( ' [a b; c d] ' )
M=
[a, b]
[c, d]
>> symop(M, ' + ' , ' t ' )
ans=
[a+t, b]
[ c, d+t]
是把t加到M的对角线上。
函数charpoly求解矩阵的特征多项式。
>> G=sym(' [1,1/2;1/3,1/4] ') % create a symbolic matrix
G=
[ 1, 1/2]
[1/3, 1/4]
>> charpoly(G) % find the characteristic polynomial of G
ans=
x ' 2-5/4*x+1/12
用函数eigensys可以求得符号矩阵的特征根和特征向量
>> F=sym(' [1/2,1/4;1/4,1/2] ') % create a symbolic matrix
F=
[1/2,1/4]
[1/4,1/2]
>> eigensys(F) % find the eigenvalues of F
ans=
[3/4]
[1/4]
>> [V,E]=eigensys(F) % find eigenvalues E and eigenvectors v
V=
[-1, 1]
[ 1, 1]
E=
[1/4]
[3/4]
矩阵的约当(Jordan)标准型是特征值的对角矩阵;转换矩阵的列是特征向量。对于给定的矩阵A, jordan(A)求出非奇异的矩阵V,使得inv(V)*A*V成为约当标准型,函数jordan有两种形式
>> jordan(F) % find the Jordan form of F ,above
ans=
[1/4, 0]
[ 0, 3/4]
>> [V,J]=jordan(F) % find the Jordan form and eigenvectors
V=
[ 1/2, 1/2]
[-1/2, 1/2]
J=
[1/4, 0]
[ 0, 3/4]
标准形和特征向V的列是某些F可能的特征向量。
因为F是非奇异的,F的零空间的基是空矩阵,而列空间的基是单位阵。
>> F=sym( ' [1/2,1/4;1/4,1/ 2] ' ) % recreate F
F=
[1/2, 1/4]
[1/4, 1/2]
>> nullspace(F) % the nullspace of F is the empty matrix
ans=
[]
>> colspace(F) % find the column space of F
ans=
[1, 0]
[0, 1]
用函数singvals可求解矩阵奇异值。
>> A=sym(magic(3)) % Generate a 3-by-3 matrix
A=
[8, 1, 6]
[3, 5, 7]
[4, 9, 2]
>> singvals(A) % find the singular expressions
ans=
[15.00000000000000]
[6.928203230275511]
[3.464101615137752]
函数jacobian(w,v)可相对于v求解w的雅可比(Jacobia)值。其结果的第(i,j)项是df(i)/dv(j)。注意,当f是标量时,f的雅可比值是f的梯度。
>> jacobian( ' u*exp(v) ' ,sym( ' u,v ' ))
ans=
[exp(v,u*exp(v)]
22.10 小结
下列各表(表22.2-表22.8)综合了符号数学工具箱的特性:
表22.2
符号表达式的运算 |
numeric |
符号到数值的转换 |
pretty |
显示悦目的符号输出 |
subs |
替代子表达式 |
sym |
建立符号矩阵或表达式 |
symadd |
符号加法 |
symdiv |
符号除法 |
symmul |
符号乘法 |
symop |
符号运算 |
sympow |
符号表达式的幂运算 |
symrat |
有理近似 |
symsub |
符号减法 |
symvar |
求符号变量 |
表22.3
符号表达式的简化 |
collect |
合并同类项 |
expand |
展开 |
factor |
因式 |
simple |
求解最简形式 |
simplify |
简化 |
symsum |
和级数 |
表22.4
符号多项式 |
charpoly |
特征多项式 |
horner |
嵌套多项式表示 |
numden |
分子或分母的提取 |
poly2sym |
多项式向量到符号的转换 |
sym2poly |
符号到多项式向量的转换 |
表22.5
符号微积分 |
diff |
微分 |
int |
积分 |
jordan |
约当标准形 |
taylor |
泰勒级数展开 |
表22.6
符号可变精度算术 |
digits |
设置可变精度 |
vpa |
可变精度计算 |
表22.7
求解符号方程 |
compose |
函数的复合 |
dsolve |
微分方程的求解 |
finverse |
函数逆 |
linsolve |
齐次线性方程组的求解 |
solve |
代数方程的求解 |
表22.8
符号线性代数 |
charploy |
特征多项式 |
determ |
矩阵行列式的值 |
eigensys |
特征值和特征向量 |
inverse |
矩阵逆 |
jordan |
约当标准形 |
linsolve |
齐次线性方程组的解 |
transpose |
矩阵的转置 |
|