序言
符號對象(Symbolic Objects 不同於普通的數值計算)是Matlab中的一種特殊數據類型,它可以用來表示符號變量、表達式以及矩陣,利用符號對象能夠在不考慮符號所對應的具體數值的情況下能夠進行代數分析和符號計算(symbolic math operations),例如解代數方程、微分方程、進行矩陣運算等. 符號對象需要通過sym或syms函數來指定, 普通的數字轉換成符號類型后也可以被作為符號對象來處理. 我們可以用一個簡單的例子來表明數值計算和符號計算的區別: 2/5+1/3的結果為07333(double類型數值運算), 而sym(2)/sym(5)+sym(1)/sym(3)的結果為11/15, 且這里11/15仍然是屬於sym類型, 是符號數.
正文
1. 符號對象的定義
符號對象的定義用syms x y z; 的形式,例如
此外,還可以用x=sym('x'); y=sym('y'); 的格式定義符號變量,它跟syms x y; 具有相同的含義. Matlab也支持一次性定義一個符號表達式,如f=sym('a*x^2+b*x+c'),定義后這個表達式會被認為是一個整體,Matlab不會自動把其中每個項a,x,b ,c 定義為符號變量. 所以如果想對一個符號表達式進行計算,則還是要把參與計算的項單獨定義好.
2. 符號數
Matlab支持將一個數字轉換成符號對象,轉換得到的符號數(Symbolic Numbers)仍然具有數字值的含義,只是之后Matlab不會對它進行浮點運算. 符號數的定義也通過sym命令實現. 例如可以讓Matlab進行分數運算1/2+1/3=5/6,
而如果直接在命令窗口中輸入1/2+1/3則會得到0.8333的結果. 符號數的計算比浮點計算要花費更多的時間和空間, 但是它是一種精確計算, 沒有誤差.
3. 符號計算
利用符號變量可以構建符號表達式、符號函數、符號方程和符號矩陣等,然后可以進行因式分解、求導、求方程、求矩陣函數值的解等操作.
(1) 因式分解Factoring
對符號表達式f進行因式分解的命令格式為factor(f). 例如將表達式(x^9-1)分解成多個因式的命令為
syms x; factor(x^9-1)
運行結果為
(2) 求導/求微分Differentiation
對符號表達式f(x)求導的命令為diff(f). Matlab可以自動識別表達式中的變量, 如果表達式a只包含一個變量, 則diff(f)函數是相對這個唯一的變量求導, 若a包含多個變量, 則diff(f)是對f中的默認變量求導, 默認變量是f中含有的在字母表中離x最近的變量. 表達式f的默認變量可以用函數findsym(f,1)來得出.
如果要對f(x)求n階導數, 則用diff(f,n). 對於含有多個自變量的表達式, diff可以實現求偏導, 例如表達式f(s,t)相對s求偏導就用diff(f,s), 如果相對s求2階偏導則是diff(f,s,2).
(3) 求積分Integral
求符號表達式f(x)的不定積分用int(f). 對於含有多個符號變量的表達式f(x,s,t), 如果希望將其相對t求積分, 用int(f,t). 求f(x)從0到1的定積分用int(f,0,1)或int(f,x,0,1).
(4) 求極限Limits
求函數f(x)或f(x,y)在x趨近於0時的極限用limit(f,x,0), 求(1+x/n)n在n趨近無窮大時的極限用limit((1+x/n)^n,n,inf), 求a(x)在x趨近0-(左極限)或x趨近0+(右極限)的時候用limit(f,x,0,'left')或limit(f,x,0,'right').
(5) 符號累加Symbolic Summation
普通的算術累加用sum, 而符號數或符號表達式的累加用symsum. 例如求1+1/22+1/32+...和1+x+x2+...用如下代碼
syms x k; s1=symsum(1/k^2,1,inf) s2=symsum(x^k,k,0,inf)
(6) 符號表達式化簡Simplification
利用MATLAB提供的若干表達式變形函數, 我們可以將符號表達式化簡或根據需求轉換成不同的形式.
- collect 可以將表達式按照其默認的符號變量的冪次由高到低排列, 同一冪次的符號變量的系數被合並到一起. 如果表達式含有多個變量, 則可以利用第二個參數指出以哪個變量為准. 例如對於f=x^3*y+x*(y^2+6)+x*y+8*x^2+y^2*x, collect(f)的結果為x^3*y+8*x^2+(2*y^2+6+y)*x, collect(f,y)的結果為2*y^2*x+(x+x^3)*y+8*x^2+6*x.
- expand 將表達式展開, 並且會應用一些基本公式(等式identities). 例如expand((x-1)*(x-2)*(x-3))的結果為x^3-6*x^2+11*x-6; expand(exp(a+b))的結果為exp(a)*exp(b); expand(cos(x+y))的結果為cos(x)*cos(y)-sin(x)*sin(y); expand(cos(3*acos(x)))的結果為4*x^3-3*x.
- horner 將表達式分解成嵌套形式. 例如horner(x^3-6*x^2+11*x-6)的結果為-6+(11+(-6+x)*x)*x.
- factor 因式分解, 將表達式分解成幾個因式的乘積, 如果表達式無法分解成積的形式, 則分解結果為原表達式保持不變.
- simplify 利用各種內置的基本公式(algebraic identities)對表達式化簡.
- simple 通過不同的方式對表達式進行化簡, 試圖得到最短的結果(結果表達式含有最少的字符數).
(7) 解代數方程
解代數方程的a(x)=0的命令是solve(a),例如
(8) 求符號矩陣的函數值
符號矩陣是指矩陣元素包含符號變量的矩陣,對這種類型的矩陣可以按照正常數值矩陣一樣的規律進行計算,例如
(8) 其他符號函數
- numden求符號分數的(消去最大公約數之后的)分子和分母。例如[n,d] = numden(sym(6/8)) 返回 n = 3 和 d = 4,單純的numden(6/8)僅返回分子3.