所謂符號計算是指在運算時,無須事先對變量賦值,而將所得到結果以標准的符號形式來表示。
例如,在符號變量運算過程中pi就用pi表示,而不是具體的近似數值3.14或3.14159。使用符號變量進行運算能最大限度減少運算過程中因舍入造成的誤差。符號變量也便於進行運算過程的演示。
一、符號計算基礎
(一) 定義符號變量
參與符號運算的對象可以是符號變量、符號表達式或符號矩陣。符號變量要先定義,后引用。可以用sym函數、syms函數將運算量定義為符號型數據。引用符號運算函數時,用戶可以指定函數執行過程中的變量參數;若用戶沒有指定變量參數,則使用默認的變量作為函數的變量參數。
1、sym函數
sym函數的主要功能是創建符號變量,以便進行符號運算,也可以用於創建符號表達式或符號矩陣。用sym函數創建符號變量的一般格式為:
x = sym(‘x’)
其目的是將’x’創建為符號變量,以x作為輸出變量名。每次調用該函數,可以定義一個符號變量。
a=sym(‘a’); %定義‘a’為符號運算量,輸出變量名為a b=sym(‘b’); x=sym(‘x’); y=sym(‘y”); [x,y]=solve(‘a*x-b*y=1’, ‘a*x+b*y=5’, ‘x’, ‘y’) %以a,b為符號常數,x,y為符號變量 即可得到方程組的解: x =3/a y =2/b
(一) 定義符號變量
【例2】已知一復數表達式 z=x+i*y, 試求其共軛復數,並求該表達式與其共軛復數乘積的多項式。
為了使乘積表達式x^2+y^2非負,這里,把變量x和y定義為實數。
x=sym(‘x’,’real’);
y=sym(‘y’,’real’);
z=x+i*y; %定義復數表達式
conj(z); %求共軛復數
expand(z*conj(z)) %求表達式與其共軛復數乘積的
多項式
ans =
x^2+y^2
若要去掉’x’的屬性,可以使用下面語句
x = sym(‘x’,’unreal’)
將’x’創建為純格式的符號變量。
2、syms函數
syms函數的功能與sym函數類似。syms函數可以在一個語句中同時定義多個符號變量,其一般格式為:
syms arg1 arg2 …argN
用於將rg1, arg2,…,argN等符號創建為符號型數據。
(二)默認符號變量
在數學表達式中,一般習慣於使用排在字母表中前面的字母作為變量的系數,而用排在后面的字母表示變量。例如:
f=ax2+bx+c
表達式中的a,b,c通常被認為是常數,用作變量的系數;而將x看作自變量。
例如,數學表達式
f=xn
g=sin(at+b)
根據數學式中表示自變量的習慣,默認a,b,c為符號常數,x為符號變量。
若在MATLAB中表示上述表達式,首先用syms 函數定義a,b,n,t,x為符號對象。在進行導數運算時,由於沒有指定符號變量,則系統采用數學習慣來確定表達式中的自變量,默認a,b,c為符號常數,x,t為符號變量。
即 : 對函數f求導為:df/dx
對函數g求導為:dg/dt
(四) 生成符號函數
將表達式中的自變量定義為符號變量后,賦值給符號函數名,即可生成符號函數。例如有一數學表達式:
其用符號表達式生成符號函數fxy的過程為:
syms a b c x y %定義符號運算量
fxy=(a*x^2+b*y^2)/c^2 %生成符號函數
生成符號函數fxy后,即可用於微積分等符號計算。
【例4】定義一個符號函數 fxy=(a*x2+b*y2)/c2 ,分別求該函數對x、y的導數和對x的積分。 syms a b c x y %定義符號變量 fxy=(a*x^2+b*y^2)/c^2; %生成符號函數 diff(fxy,x) %符號函數fxy對x求導數 ans =2*a*x/c^2 diff(fxy, y) %符號函數fxy對y求導數 ans =2*b*y/c^2 int(fxy, x) %符號函數fxy對x求積分 ans =1/c^2*(1/3*a*x^3+b*y^2*x)
(五)標准代數運算
很多標准的代數運算可以在符號表達式上執行,函數symadd、symsub、symmul和symdiv為加、減、乘、除兩個表達式,sympow將一個表達式上升為另一個表達式的冪次。
f= ' 2*x^2+3*x-5 ' % define the symbolic expression
>>f=
2*x^2+3*x-5
>> g= ' x^2-x+7 '
g=
x^2-x+7
>> symadd(f,g) % find an expression for f+g
ans= 3*x^2+2*x+2
>> symsub(f,g) % find an expression for f-g
ans= x^2+4*x-12
>> symmul(f,g) % find an expression for f*g
ans= (2*x^2+3*x-5)*(x^2-x+7)
>> symdiv(f,g) % find an expression for f/g
ans= (2*x^2+3*x-5)/(x^2-x+7)
>> sympow(f, ' 3*x ' ) % the same as sym(A)^sym(B)
ans= (2*x^2+3*x-5)^3*x