matlab_第八章章符號計算


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.提取符號表達式的分子和分母

numden函數來提取符號表達式中的分子或分母。其一般調用格式為:

 [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)

S是符號表達式或符號矩陣;選項Name用於設置展開方式,ArithmeticOnly 或者為 IgnoreAanlyConstraints , Value為Name的值,可取值有true和false,默認為false。

expand(S,ArithmeticOnly,true):  指定展開多項式時不展開三角函數,雙曲線函數,對數函數。

expand(S,IgnoreAanlyConstraints,true):指定展開多項式時應用純代數簡化方法。  

>> 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為自變量,對符號對象Pv合並同類項,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)  :第2種格式指定以var為自變量。按升冪順序返回符號表達式p各項的系數,T返回C中各系數的對應項。

>> 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進行代數化簡。如果s是一個符號向量或符號矩陣,則化簡s的每一個元素。Name:指定化簡過程的屬性。Value:為該屬性的取值。

屬性

>> 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**.符號對象與數之間的轉換**

(1)符號對象轉換為基本數據類型

R=vpa(A,d):   按d為指定精度計算符號常量表達式A的值。並轉化為符號常量。

>> 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**.關系運算**

6種關系運算符<、<=、>、>=、= =、~=和對應的關系運算函數lt、le、gt、ge、eq、ne也可用於符號對象。

 

>> 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函數用於檢測符號矩陣中各個元素是否都是有效的符號表達式

any函數用於檢測符號矩陣中是否至少有一個元素是有效的符號表達式。

 

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

【例8.1】求下列極限。

 

 

 

 

>> 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,即求一階導數。

對多個自變量的求導,可以使用以下格式:

diff(F,var1,...,varN)

 【例8.2】求下列函數的導數。

 

%求(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求定積分。ab分別表示定積分的下限和上限。當表達式s關於變量x在閉區間[ab]上可積時,函數返回一個定積分結果。當ab中有一個是inf時,函數返回一個廣義積分。當ab中有一個符號表達式時,函數返回一個符號函數。

【例8.3】分別求下列積分

 

>> 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

 

 【例8.4】求圖8.1中曲邊梯形D的面積,其中D是由曲線y^2=2x和直線x+y=4、直線x+y=12所圍封閉區域。

>> 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

  

8.3.1 級數符號求和

函數symsum,用於無窮級數求和,其調用格式為:

symsum(f,v,a,b)

其中,f表示一個級數的通項。選項v指定自變量,v省略時,按默認規則確定自變量。選項ab指定求和的下限和上限,缺省時,symsum函數返回不定積分

【例8.6】求下列級數之和。

 

 

 

>> 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函數將函數展開為冪級數,調用格式為

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處的泰勒級數展開式。

(2)將在x = 1處的5階展開式。

>> 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

選項Name和Value成對使用,用於設置求解過程的參數

【例8.8】求解下列方程

 

 

 

>> 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 =

C4*exp(x) - 1

結果中的C1、C2、…代表任意常數。

 

 【例8.10】求下列微分方程的解。

 

 

%解方程(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)

  【例8.10】求下列微分方程的解。

 

 

 

%解方程(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的常因子。

下半部的控制面板中的按鈕用於符號表達式f的轉換和多種符號計算。

2.taylortool

用於將自變量為x的符號表達式f展開為泰勒級數,並以圖形化的方式展現計算時的逼近過程。

在命令行窗口輸入taylortool命令,會打開一個Taylor Tool窗口

窗口下部的編輯器用於輸入原函數、修改計算參數、自變量的值域。

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM