8.1.1建立符號對象
(1)、sym():用於創建單個符號變量。
x = sym('a')
符號變量與數值變量的差別
>> a = sym('a'); %定義符號變量a >> w = a^3 + 3*a + 10 %符號運算 w = a^3 + 3*a + 10 >> x = 5; %定義數值變量x >> w = x^3 + 3*x + 10 %數值運算 w = 150
建立符號變量可以指定該變量所屬集合
x = sym('x',set) %set可取值為'real'、'integer'、'positive' 或'rational'。 %取消符號變量所屬集合 x = sym('x','clear') %sym函數建立符號數組 A=('x',[n1,n2,n3,...,nm])
sym函數可以將常量、向量、矩陣轉化為符號對象
x = sym('Num',flag) %Num可以是常量、向量或矩陣,選項flag用於指定將浮點數轉換為符號對象時所采用的方法,可取值有'r'、'd'、'e'和'f', %分別代表將Num轉換為有理式、十進制數、帶估計誤差的有理式、與精確值對應的分式,默認為‘r’。 %列如 >> x1 = sym(pi) x1 = pi >> x2 = sym(pi,'e') x2 = pi - (198*eps)/359
符號對象與數值量在代數運算時的差別: 用符號對象進行計算更像在進行數學演算,所得到的結果是精確的數學表達式。
>> p1=sym(pi);a=sym(4); % 定義符號變量p1、a >> c1=cos((a+10)^2)-sin(p1/4) % 符號計算 c1 = cos(196) - 2^(1/2)/2 >> p2=pi; x=4; % 定義數值變量p2、x >> c2=cos((x+10)^2)-sin(p2/4) % 數值計算 c2 = -0.3646
(2)、1. sym函數一次只能定義一個符號變量, syms函數一次可以定義多個符號變量。
syms a b c d
建立符號變量可以指定該變量所屬集合
x = sym( a, b , c, set) %set可取值為'real'、'integer'、'positive' 或'rational'。
2.建立符號表達式
(1)使用已經定義的符號變量組成符號表達式。例如:
>> syms x y; >> f=3x^2-5y+2xy+6 f = 3x^2 + 2yx - 5y + 6 >> F=cos(x^2)-sin(2*x)==0 F = cos(x^2) - sin(2*x) == 0
(2)用sym函數將MATLAB的匿名函數轉換為符號表達式
>> fexpr=sym(@(x)(sin(x)+cos(x))) fexpr = cos(x) + sin(x)
(3)用str2sym函數將字符串轉換為符號表達式
>> fx=str2sym('cos(x)+sin(x)')
3
(1)使用已經定義的符號變量定義符號函數。
>> syms x y; >> f(x, y) = 3x^2-5y+2xy+6 f(x, y) = 3x^2 + 2yx - 5y + 6
(2)用syms函數定義符號函數,然后構造該符號函數所對應的表達式。
>> syms f(t) fxy(x, y) >> f(t)= t^2 + 1 f(t) = t^2 + 1 >> f(x,y)= 3x^2-5y+2xy+6 f(x, y) = 3x^2 + 2yx - 5y + 6
(3)用symfun函數建立符號函數。
f = symfun(formula,inputs) %formula為符號表達式或者由符號表達式構成的向量、矩陣,inputs指定符號函數f的自變量。例如: >> syms x y >> f=symfun(3x^2-5y+2xy+6, [x y]) f(x, y) = 3x^2 + 2yx - 5y + 6
8.1.2 符號表達式中自變量的確定
symvar函數用於獲取符號表達式中的自變量。調用格式為
symvar(s)
symvar(s,n)
返回s中的n個符號變量,默認返回s
>> syms x a y z b; >> s1=3*x+y; s2=a*y+b; >> symvar(s1) ans = [ x, y] >> symvar(s1+s2) ans = [ a, b, x, y]
>> syms a b w y z >> f(a,b)=a*z+b*w,2; %定義符號函數 >> symvar(f, 3) ans = [ a, b, w] >> ff=a*z+b*w; %定義符號表達式 >> symvar(ff, 3) ans = [ w, z, b] >> h=sym([3*b/2, (2*x+1)/3; a/x+b/y, 3*x+4]); >> symvar(h,1) ans = x
8.1.3符號對象的算術運算
1、符號對象的四則運算
>> x= sym('x'); >> f= 2*x^2+3*x-5; >> g= x^2-x+7; >> fsym= f+g %或 fsym= plus(f, g) fsym= 3*x^2 + 2*x + 2 >> gsym= f^g gsym= (2*x^2 + 3*x - 5)^ (x^2 - x + 7)
注意:
2.提取符號表達式的分子和分母
[n,d]=numden(s) :n與d的分別用於返回表達式s的分子和分母。
注意: 對於符號矩陣,numden返回分子矩陣n,分母矩陣d
>> [n,d]=numden(sym(10/33)) n = 10 d = 33 >> syms a b x >> [n,d]= numden(a*x^2/(b+x)) n= a*x^2 d= b + x
3.符號表達式的因式分解、展開與合並
(1)factor函數用於分解因式。基本調用格式為:
factor(s) 若參數s是一個整數,函數返回s的所有素數因子;若s是一個符號對象,函數返回由s
>> F = factor(823429252) %對整數分解因子 F = 2 2 59 283 12329 >> F = factor(sym(823429252)) %對符號常量分解因子 F = [ 2, 2, 59, 283, 12329] %返回的因子構成一個向量 >> syms x y; >> s1=x^3-y^3; >> factor(s1) %對s1分解因式 ans = [ x - y, x^2 + x*y + y^2]
(2)expand函數:用於將符號表達式展開成多項式。
expand(S,Name,Value)
ArithmeticOnly 或者為 IgnoreAanlyConstraints ,
>> syms x y >> s2=(-7*x^2-8*y^2)*(-x^2+3*y^2); >> expand(s2) %對s2展開 ans = 7*x^4 - 13*x^2*y^2 - 24*y^4 >> expand(cos(x+y)) ans = cos(x)*cos(y) - sin(x)*sin(y) >> expand(cos(x+y),'ArithmeticOnly', true) ans = cos(x + y)
(3)collect函數:用於合並同類項。
collect(P,v) :以v為自變量,對符號對象P按v
>> syms x y >> s3=(x+2*y)*(x^2+y^2+1) >> collect(s3) %默認以x為自變量,對s3按x合並同類項 ans = x^3 + (2*y)*x^2 + (y^2 + 1)*x + 2*y*(y^2 + 1) >> collect(s3,y) %以y為自變量,對s3按y合並同類項 ans = 2*y^3 + x*y^2 + (2*x^2 + 2)*y + x*(x^2 + 1)
4.符號表達式系數的提取
coeffs函數提取符號表達式中的系數。調用格式為
C = coeffs(p) :以默認方式確定符號表達式的自變量,按升冪順序返回符號表達式p各項的系數
[C,T] = coeffs(p,var) :
>> syms x y >> s = 5*x*y^3 + 3*x^2*y^2 + 2*y + 1; >> coeffs(s) %求各項系數,按所有變量的升冪排列 ans = [ 1, 2, 3, 5] >> coeffs(s,x) %按x的升冪排列 [ 2*y + 1, 5*y^3, 3*y^2] >> coeffs(s,y) %按y的升冪排列,返回變量y的系數 [ 1, 2, 3*x^2, 5*x] >> coeffs(s,[x,y]) ans = [ 1, 2, 5, 3]
5**.符號表達式的化簡**
simplify(s,Name,Value) :
對s
>> syms x; >> s= (x^2+5*x+6)/(x+2); >> simplify(s) ans= x + 3 >> s= [2*cos(x)^2-sin(x)^2,sqrt(16)]; >> simplify(s) ans = [ 2 - 3*sin(x)^2, 4]
6**.符號對象與數之間的轉換**
>> a = sym(2*sqrt(2)); >> b = sym((1-sqrt(3))^2); >> T = [a, b; a*b, b/a]; >> R1=double(T) %R1為數值矩陣 R1 = 2.8284 0.5359 1.5157 0.1895 >> R2 = vpa(T,10) %R2為符號矩陣 R2 = [ 2.828427125, 0.5358983849] [ 1.515749528, 0.189468691]
7**.指定符號對象的值域**
在進行符號對象的運算前,可用assume函數設置符號對象的值域。
assume(condition)
assume(expr, set)
第1種格式指定變量滿足條件condition,第2種格式指定表達式expr屬於集合set,set的可取值有'integer'、'rational'、'real'和'positive',分別表示整數、有理數、實數和正數。
>> syms x >> assume(x < 0) >> abs(x) ans = -x >> assume(x,'positive') >> abs(x) ans = x
8.1.4 符號對象的關系運算
1**.關系運算**
>> syms x y a b c d; >> A=[a*x,x*y; y/b,y^3]; >> B=[a,b; c,d]; >> x+y<=100 ans = x + y <= 100 >> A~=B*2 ans = [ a*x ~= 2*a, x*y ~= 2*b] [ y/b ~= 2*c, y^3 ~= 2*d]
2**.** piecewise**函數**
用於定義分段函數的符號表達式。調用格式如下:
pw = piecewise(cond1,val1,cond2,val2,..., condn,valn)
cond1、cond2、......表示條件,val1、val2、、......表示值。當條件cond1成立時,pw的值是val1;當條件cond2成立時,pw的值是val2。
2**.** piecewise**函數**
用於定義分段函數的符號表達式。調用格式如下:
pw = piecewise(cond1,val1,cond2,val2,..., condn,valn)
cond1、cond2、......表示條件,val1、val2、、......表示值。當條件cond1成立時,pw的值是val1;當條件cond2成立時,pw的值是val2。
>> syms x >> y=piecewise(x>0,sqrt(x),x<0,x*x,x==0,1) y = piecewise(0 < x, x^(1/2), x < 0, x^2, x == 0, 1)
2**.** piecewise**函數**
用於定義分段函數的符號表達式。調用格式如下:
pw = piecewise(cond1,val1,cond2,val2,..., condn,valn)
cond1、cond2、......表示條件,val1、val2、、......表示值。當條件cond1成立時,pw的值是val1;當條件cond2成立時,pw的值是val2。
>> syms x >> isequaln(abs(x), x) ans = logical 0 >> assume(x > 0) >> isequaln(abs(x), sqrt(x*x), x) ans = logical 1
8.1.5 符號對象的邏輯運算
1.基本邏輯運算
4個邏輯運算函數and(與)、or(或)、xor(異或)、not(非)以及3個邏輯運算符&(與)、|(或)、~(非)也可用於符號對象。
>> syms x >> y=x>0 & x<10 %或 y=and(x>0 , x<10) y = 0 < x & x < 10
all函數用於檢測符號矩陣中各個元素是否都是有效的符號表達式
2.其他邏輯運算
fold函數,用於組合邏輯表達式。fold函數的調用格式如下:
fold(@fun,v)
fun是邏輯運算函數,v是一個由符號表達式組成的向量。
>> syms a b c >> fold(@and, [a<b+c, b<a+c, c<a+b]) ans = a < b + c & b < a + c & c < a +
8.2.1 符號極限
求符號表達式極限的函數是limit,調用格式如下。
limit(f, var, a, direction)
計算當自變量var趨近於常數a時,符號表達式f的極限值。
選項var缺省時,按默認方式確定自變量。
選項a缺省時,求自變量趨近於0時,表達式f的極限值。
選項direction用於指定趨近的方向,'right'表示自變量從右邊趨近於a,'left'表示自變量從左邊趨近於a
>> syms x h t >> limit((sin(x+h)-sin(x))/h, h, 0) %極限1 ans = cos(x) >> limit((1+t/x)^x,inf) %極限2 ans = exp(t) >> limit(x*(sqrt(x^2+1)-x),x,inf,'left') %極限3 ans = 1/2 >> limit(cot(x)^(1/log(x)),x,0,'right') %極限4 ans = exp(-1)
8.2.2 符號導數
diff函數用於對符號表達式和符號函數求導,調用格式如下。
diff(F,var,n)
F是符號表達式或符號函數
選項var指定自變量,缺省時,按默認規則確定自變量;
選項n指定求n階導數,默認為1,即求一階導數。
對多個自變量的求導,可以使用以下格式:
%求(1) >> syms x; >> diff(cos(x*x)) ans = -2*x*sin(x^2) >> diff(cos(x*x),x,2) %求對x的二階導數 ans = - 2*sin(x^2) - 4*x^2*cos(x^2) >> diff(cos(x*x),x,3) %求對x的三階導數 ans = 8*x^3*sin(x^2) - 12*x*cos(x^2) %求(2) >> syms a b t >> fx=a*(t-sin(t)); >> fy=b*(1-cos(t)); >> diff(fy,t)/diff(fx,t) %求對x的一階導數 ans = -(b*sin(t))/(a*(cos(t) - 1)) %求(3) >> syms x y >> diff(x^6-3*y^4+2*x^2*y^2,x) %求對x的偏導數 ans = 6*x^5 + 4*x*y^2 >> diff(x^6-3*y^4+2*x^2*y^2,y) %求對y的偏導數 ans = 4*x^2*y - 12*y^3 >> diff(x^6-3*y^4+2*x^2*y^2,x,y) ans = 8*x*y
8.2.3 符號積分
(1)求不定積分
int(expr, v)
以v為自變量,對符號表達式expr求不定積分。
(2)求定積分
int(expr, v, a, b) 或 int(expr, v, [a, b])
以v為自變量,對符號表達式expr求定積分。a、b分別表示定積分的下限和上限。當表達式s關於變量x在閉區間[a,b]上可積時,函數返回一個定積分結果。當a、b中有一個是inf時,函數返回一個廣義積分。當a、b
>> syms x a b %求(1) >> f= 1/(1+x^2); >> f1=int(1/(1+x^2)) %求不定積分 f1 = atan(x) %求(2) >> f2=int(1/(1+x^2),a,b) %求定積分 f2 = atan(b) - atan(a) %求(3) >> f3=int(1/(1+x^2),1,2) %求定積分 f3 = atan(2) - pi/4 >> eval(f3) %計算積分值 ans = 0.3218
>> syms x y >> f1=int(x+y, x, y^2/2, 12-y) f1 = -((y - 4)*(y + 6)*(y^2 + 2*y + 24))/8 >> ff1=int(f1, y, -6, 4) ff1 = 1750/3 >> f2=int(x+y, x, y^2/2, 4-y) f2 = -((y - 2)*(y + 4)*(y^2 + 2*y + 8))/8 >> ff2=int(f2, y, -4, 2) ff2 = 198/5 >> f=ff1-ff2 f = 8156/15
【例8.5】求 ,其中D是由xy平面上曲線y^2=2x繞x軸旋轉而成的曲面與平面x=5所圍封閉區域,如圖所示
>> syms r x theta >> f=int(int(int(r*r,x,r*r/2,5),r,0,sqrt(10)),theta,0,2*pi) f = (40*pi*10^(1/2))/3
函數symsum,用於無窮級數求和,其調用格式為:
symsum(f,v,a,b)
其中,f表示一個級數的通項。選項v指定自變量,v省略時,按默認規則確定自變量。選項a和b
>> syms n k x; %求(1) >> s=symsum((-1)^(n+1)/n,1,inf) s= log(2) >> eval(s) ans = 0.6931 %求(2), factorial是求階乘的函數 >> symsum(x^k/factorial(k),k,1,inf) ans = exp(x) - 1
8.3.2 函數的泰勒級數
taylor(f,v,a,Name,Value)
a指定將函數f在自變量v = a處展開,a默認為0。
v缺省時,按默認規則確定自變量。
選項Name和Value成對使用,用於設置運算過程的屬性。Name有3個可取值:
•'ExpansionPoint':指定展開點,對應值為標量或向量。展開點默認為0。
•'Order':指定截斷階,對應值為一個正整數。默認截斷階為6,即展開式的最高階為5。
•'OrderMode':指定展開式采用絕對階或相對階,對應值為'Absolute' 或'Relative',默認為'Absolute'。
【例8.7】求函數在指定點的泰勒級數展開式。
(1)求在x = 0處的泰勒級數展開式。
>> syms x %求(1) >> taylor(log(x+sqrt(x*x+1))) ans = (3*x^5)/40 - x^3/6 + x %求(2) >> taylor((1+2*x+3*x^x)/(1-2*x-3*x^x),x,1,'Order', 5) ans = (5*x)/8 - (13*(x-1)^2)/32 + (29*(x-1)^3)/128 - (45*(x-1)^4)/512 - 17/8
8.4.1 符號代數方程求解
求解用符號表達式表示的代數方程可由函數solve實現,其調用格式如下。
Y = solve(s,v, Name,Value)
Y = solve(s1,s2, …,sn,v1,v2,…,vn)
[y1,y2,...,yn] = solve([s1,s2, …,sn],[v1,v2,…,vn])
第1種格式求解符號表達式s的代數方程,求解變量為v。v缺省時,按默認規則確定自變量;
第2、3種格式求解符號表達式s1,s2,…,sn組成的代數方程組,自變量分別為v1,v2,…,v**n。
>> syms x %解方程(1) >> y=solve(x-(x^3-4*x-7)^(1/3)==1,x) y = 3 %解方程(2) >> sx = solve(sin(x)==1,x) sx = pi/2 要得到方程(2)的完全解,則使用以下命令: >> [solx, params, conds]=solve(sin(x)==1, x, 'ReturnConditions', true) solx = pi/2 + 2*pi*k params = k conds = in(k, 'integer')
8.4.2 符號常微分方程求解
通過函數dsolve求解,調用格式為
S = dsolve(eqn,cond)
求解常微分方程eqn在初值條件cond下的特解。若沒有給出初值條件cond,則求方程的通解。eqn可以是符號等式或由符號等式組成的向量。
要改變求解過程的參數,函數的調用格式為:
S = dsolve(e,c,Name,Value)
Name和Value成對使用,用於設置求解過程的參數
例如求解微分方程dy/dx=y+1的命令如下:
>> syms y(x)
>> dsolve(diff(y)==y+1)
ans =
%解方程(1) >> syms y(t) >> y1=dsolve(diff(y,t)==(t^2+y^2)/t^2/2) y1 = t -t*(1/(C3 + log(t)/2) - 1) %解方程(2) >> syms y(x) a >> y2=dsolve(diff(y,x)==a*y, y(0)==5) y2 = 5*exp(a*x)
%解方程(3) >> syms f(x) >> y3=dsolve(x*diff(y,x,2)-3*diff(y,x)==x^2, y(1)==0, y(5)==0) y3 = (31*x^4)/468 - x^3/3 + 125/468 %解方程組(4) >> syms x(t) y(t) >> [x,y]=dsolve(diff(x,t)==4*x-2*y, diff(y,t)==2*x-y) x = C11/2 + 2*C10*exp(3*t) y = C11 + C10*exp(3*t)
8.5 符號計算的可視化分析
1.funtool
是一個可視化符號計算器,提供了一些常用的符號運算工具
在命令行窗口輸入funtool命令,會打開一個funtool計算器窗口和兩個圖形窗口。
funtool計算器窗口上半部面板中的f和g編輯框用於編輯參與運算的符號表達式,x編輯框用於設置符號表達式f和g的自變量的值域,a編輯框用於編輯表達式f的常因子。
用於將自變量為x的符號表達式f展開為泰勒級數,並以圖形化的方式展現計算時的逼近過程。
在命令行窗口輸入taylortool命令,會打開一個Taylor Tool窗口