符號運算

符號對象和表達式

基本符號對象和運算符

生成符號對象的規則

  • 必須藉助 sym syms symfun定義
  • 任何包含符號對象的表達式或方程也是符號對象

符號常數的定義

sym(Num)      如果Num是一個小數,則用此方法創建
sym(‘Num’)    如果Num是一個有理分數,則用此方法創建

對於sym(Num)的說明:

  • 如果Num是精準的浮點數,則能創建精準的符號常數
  • 如果Num是諸如sin(0.3)的數值表達式,那麼sym(Num)只能生成由表達式獲得的16位精度的近似符號常數
>> a = sym(0.3)
a =
3/10
>> b = sym(sin(0.3))
b =
5323618770401843/18014398509481984
>> whos
  Name      Size            Bytes  Class    Attributes

  a         1x1               112  sym                
  b         1x1               112  sym    

sym(‘Num’)的說明

  • 如果Num是普通小數,如0.31,3.21e-1,那麼只能產生近似符號常數

基本符號變量

創建單個符號變量

syms para     
syms para Flag     Flag是給para劃定範圍用的,比如當Flag爲real時,表示限定para爲實域

創建多個符號變量

syms para1 para2 ...
syms para1 para2 para3 ... Flag   注意中間是空格,Flag的作用同上
>> syms a
>> syms b c 'real'
>> whos
  Name      Size            Bytes  Class    Attributes

  a         1x1               112  sym                
  b         1x1               112  sym                
  c         1x1               112  sym                

>> assumptions   %assumptions是用來查看符號變量做了什麼限定性條件,這裏b,c都爲實域上的數
ans =
[ b in R_, c in R_]


符號表達式和符號函數

符號表達式和符號函數

符號表達式:由基本符號對象構成的衍生符號對象,可藉助“=“賦義給某符號變量。
  不建議使用sym('a*x^2+b*x+c')生成串型符號表達式。

符號函數:syms f(x,y) 定義了一個以x,y爲變量的函數f

>> syms a b c x y;
>> y=a*x^2+b*x+c   %將符號表達式賦給y
y =
a*x^2 + b*x + c
>> syms f(x,y)        %定義一個符號函數f(x,y)
>> whos
  Name      Size            Bytes  Class     Attributes

  a         1x1               112  sym                 
  b         1x1               112  sym                 
  c         1x1               112  sym                 
  f         1x1               112  symfun              
  x         1x1               112  sym                 
  y         1x1               112  sym  


自由符號變量

  MATLAB中有一個命令可以列出表達式中的基本符號變量

  • symvar(expression) 列出expression中所有的符號變量
  • symvar(expression,n) 列出n個自由符號變量,這n個的規則按離x的距離列出(先右後左),比如前3個爲x,y,w(yx的右邊,wx的左邊)
>> syms x y w
>> f = x + y + w;
>> symvar(f,2)
ans =
[ x, y]

符號對象的識別

  識別數據對象屬性的命令

  • class(var) 給出var的數據類別
  • isa(var,’Obj’) 判斷var是否爲Obj代表的類,是返回1
  • whos 給出MATLAB內存變量的屬性
a = 1; b = 2; c = 3; d = 4;
Mn = [a,b;c,d]
Mc = '[a,b;c,d]'
Ms = sym(Mc)

Mn =
     1     2
     3     4
Mc =
[a,b;c,d]
Ms =
[ a, b]
[ c, d]
CMn = class(Mn)
CMc = class(Mc)
CMs = class(Ms)

CMn =
double
CMc =
char
CMs =
sym
whos Mn Mc Ms

  Name      Size            Bytes  Class     Attributes

  Mc        1x9              18   char                
  Mn        2x2              32   double              
  Ms        2x2              112   sym

符號變量假設

對符號變量的限定性假設

  • assume(assumption) ,假設限定在assumption
  • assume(expr,set)表達式限定在集合setset可以爲’real’,’integer’’rational’
  • assumeAlso(assumption)增加新假設assumption
  • a = sym(‘a’,res)syms a res 創建帶res限制的a,res只能爲’real’’positive’

撤銷限制

  • clear,清除MATLAB內存中的x,但沒有清除x的假設,如果再定義一個x,那麼x的假設還在
  • syms x clearsym(‘x’,’clear’)以上兩個都是撤銷所有對x的假設,沒有刪除x
  • assumptions(x)顯示對x的所有假設
  • reset(symengine)重啓MuPAD引擎,清空MuPAD中所有內容

在默認的複數域求根

%對x沒有做任何假設,默認爲複數域
clear all
syms x
f = x^3 + 475*x/100 +5/2;
r = solve(f,x)

r =
              -1/2
 (79^(1/2)*i)/4 + 1/4
 1/4 - (79^(1/2)*i)/4

在實數域求根

assume(x,'real')          %將x限制在real
r21 = solve(f,x)

r21 =
-1/2

%另一種限制x在實數域的方法
syms x clear
assume(imag(x) == 0)
r22 = solve(f,x)

r22 =
-1/2

求第一、第四象限的根

syms x clear
assume(real(x) > 0)    %x的實部大於0即在一、四象限
r3 = solve(f,x)

r3 =
 (79^(1/2)*i)/4 + 1/4
 1/4 - (79^(1/2)*i)/4

求在第一象限的根

assumeAlso(imag(x) > 0)    %同時追加條件x的虛部也大於0
r4 = solve(f,x)

r4 =
(79^(1/2)*i)/4 + 1/4

符號數字及表達式操作

符號數字轉換成雙精度數字

  • double(sym_Num)

符號數字的任意精度表達

  • digits,顯示當前環境下十進制符號數字的有效位數
  • digits(n),設置有效位數爲n
  • vpa(x),根據digits設置的有效數字顯示x
  • vap(x,n),以n位有效數字顯示x,該命令設置的有效位數只對該命令有效,其他情況的有效位數以digits設置的爲準。

符號化簡

  • simplify(expr)expr運用多種方法進行一輪簡化
syms x
f = (1/x^3 + 6/x^2 + 12/x +8)^(1/3)
g1 = simplify(f)

f =
(12/x + 6/x^2 + 1/x^3 + 8)^(1/3)
g1 =
((2*x + 1)^3/x^3)^(1/3)

g2 = simplify(f,'Steps',10,'IgnoreAnalyticConstraints',true)

g2 =
1/x + 2

simplify(f,'Steps',10)的說明

  • ‘Steps’ 爲化簡的次數,這裏選爲10

表達式中的置換操作

公共子式簡化

  • RS = subexpr(S),從S中提取出公共的子式sigama,並把用sigama重寫的S賦給RS
  • RS = subexpr(S,’w’),從S中提取出公共子式並把子式命名爲w,然後把用w重寫的S賦值給RS
  • [Rs w] = subexpr(S,’w’),與上面一樣
A = '[a11,a12,a13;a21,a22,a23;a31,a32,a33]';
SA = sym(A);                     %生成符號矩陣
det_A = det(SA)                  %求矩陣的行列式
inv_A = inv(SA)                  %求矩陣的逆
Sinv_A = subexpr(inv_A,'w')      %提取矩陣逆中的公共子式並簡化表達式

det_A =
a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31
inv_A =
[  (a22*a33 - a23*a32)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31), -(a12*a33 - a13*a32)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31),  (a12*a23 - a13*a22)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31)]
[ -(a21*a33 - a23*a31)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31),  (a11*a33 - a13*a31)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31), -(a11*a23 - a13*a21)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31)]
[  (a21*a32 - a22*a31)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31), -(a11*a32 - a12*a31)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31),  (a11*a22 - a12*a21)/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31)]
w = 
1/(a11*a22*a33 - a11*a23*a32 - a12*a21*a33 + a12*a23*a31 + a13*a21*a32 - a13*a22*a31)
Sinv_A =
[  w*(a22*a33 - a23*a32), -w*(a12*a33 - a13*a32),  w*(a12*a23 - a13*a22)]
[ -w*(a21*a33 - a23*a31),  w*(a11*a33 - a13*a31), -w*(a11*a23 - a13*a21)]
[  w*(a21*a32 - a22*a31), -w*(a11*a32 - a12*a31),  w*(a11*a22 - a12*a21)]
>> 

通用置換命令

subs(ES,old,new)new置換ES中的old

syms a b x
t = 0:pi/20:2*pi;
f1 = a * sin(x) + b
f2 = subs(f1,{a,x,b},{1,t,0});
plot(t,f2,'r')

符號微積分

極限和導數

函數 功能
limit(f,v,a) 求極限
limit(f,v,a,’right’) 求右極限
limit(f,v,a,’left’) 求左極限
diff(f,v,n) 求導,n缺省時,默認爲1
jacobian(f,v) 求多元函數f的雅克比矩陣
taylor(g) 麥克勞林5階展開
taylor(g,v,a,Name,Value) g(v)v = a展開,ValueName必須成對出現。
Value一般爲’Order’Name爲一個整數n,表示階段誤差階次爲n

求兩個重要極限
limt0sinktkt,limx(11x)kx\lim\limits_{t \to 0}\frac{sinkt}{kt},\lim\limits_{x \to \infty}(1-\frac{1}{x})^{kx}

syms k t x
f1 = sin(k*t)/(k*t);
r1 = limit(f1,0)              %求極限
f2 = (1-1/x)^(k*x);
r2 = limit(f2,x,inf)         %求極限

r1 =
1
r2 =
exp(-k)


f=[at3tcosxlnx]dfdx,d2fdt2,d2fdtdxf= \begin{bmatrix} a & t^3 \\ tcosx & lnx \end{bmatrix} 求\frac{df}{dx},\frac{d^2f}{dt^2},\frac{d^2f}{dtdx}。

syms a t x;
f = [a,t^3;t*cos(x),log(x)];
df = diff(f)                 %f默認對x求一階導
dfdt2 = diff(f,t,2)          %f對t求二階導
dfdxdt = diff(diff(f,x),t)   %先對x求導,然後對t求導

df =
[         0,   0]
[ -t*sin(x), 1/x]
dfdt2 =
[ 0, 6*t]
[ 0,   0]
dfdxdt =
[       0, 0]
[ -sin(x), 0]


f(x1,x2)=[x1ex2x2cos(x1)sin(x2)] f(x_1,x_2)= \begin{bmatrix} x_1e^{x_2} \\ x_2 \\ cos(x_1)sin(x_2) \end{bmatrix}

Jacobian矩陣 。

syms x1 x2
f = [x1 * exp(x2);x2;cos(x1)*sin(x2)];
v = [x1;x2];              %寫成v = [x1, x2]也是一樣的
Jf = jacobian(f,v)

Jf =
 
[          exp(x2),      x1*exp(x2)]
[                0,               1]
[ -sin(x1)*sin(x2), cos(x1)*cos(x2)]


隱函數求導。

cos(x+siny)=sinycos(x+siny)=siny,求dydx\frac{dy}{dx}

syms x y
f(x,y) = sym('cos(x+sin(y(x))) == sin(y(x))');  %y必須寫成y(x)
dfdx = diff(f,x,1)

dfdx(x, y) =
-sin(x + sin(y(x)))*(D(y)(x)*cos(y(x)) + 1) == D(y)(x)*cos(y(x))

dfdx1 = subs(dfdx,'D(y)(x)','dydx')  %用dydx替代D(y)(x),這一步是必須的

dfdx1(x, y) =
-sin(x + sin(y(x)))*(dydx*cos(y(x)) + 1) == dydx*cos(y(x))

dydx = simplify(solve(dfdx1,'dydx'))   求解得隱函數導數

dydx =
-sin(x + sin(y(x)))/(cos(y(x))*(sin(x + sin(y(x))) + 1))

f(x)=xexf(x)=xe^xx = 0處展開的5階和8Maclaurin級數。

syms x
f(x) = x*exp(x);
r5 = taylor(f)
r8 = taylor(f,'Order',9)
pretty(r8)

r5(x) =
x^5/24 + x^4/6 + x^3/2 + x^2 + x
r8(x) =
x^8/5040 + x^7/720 + x^6/120 + x^5/24 + x^4/6 + x^3/2 + x^2 + x
  8      7     6    5    4    3
 x      x     x    x    x    x     2
---- + --- + --- + -- + -- + -- + x  + x
5040   720   120   24    6    2

  pretty可以把一個物理行表示擴展成多個物理行表示

級數符號求和

  • symsum(f,v,a,b),函數f的變量v取遍[a,b]所有數之和
syms n k
f1 = 1/(k * (k+1));
s1 = symsum(f1,k,1,inf)

s1 =
1

syms x
f2 = x^(2*k - 1)/(2*k-1);
s2 = symsum(f2,k,1,inf)

s2 =
piecewise([abs(x) < 1, atanh(x)])

f3 = [1/(2*k-1)^2 , (-1)^k/k];
s3 = symsum(f3,k,1,inf)

s3 =
[ pi^2/8, -log(2)]

符號積分

  • int(f,v) 不定積分
  • int(f,v,a,b) [a,b]上定積分

不定積分 xlnxdx\int xlnxdx

syms x
intf = int(x*log(x),x)

intf =
(x^2*(log(x) - 1/2))/2


求三重積分
12(x)x2xyx2y(x2+y2+z2)dzdydx\int_{1}^{2}\int_{\sqrt(x)}^{x^2}\int_{\sqrt{xy}}^{x^2y}(x^2+y^2+z^2)dzdydx

syms x y z
F2 = int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x^2*y),y,sqrt(x),x^2),x,1,2)
VF2 = vpa(F2)

F2 =
(14912*2^(1/4))/4641 - (6072064*2^(1/2))/348075 + (64*2^(3/4))/225 + 1610027357/6563700
 
VF2 =
224.92153573331143159790710032805


微分方程的符號解法

  命名格式常見的兩種

  • dsolve(‘eq1, … , eqn’, ‘cond1, … , condn’, ‘v’)
  • dsolve(‘eq1’, … , ‘eqn’, ‘cond1’, … , ‘condn’, ‘v’)

  輸入的三部分爲:微分方程,邊值條件,指定的獨立變量,若不指定獨立變量,則默認爲t,當y是因變量時,Dny表示y的n階導數,邊值條件必須寫成y(a) = b, Dy(c) = d …的形式

S = dsolve('Dx = y, Dy = -x')
disp(' ')
disp(['微分方程的解',blanks(2),'x',blanks(22),'y'])
disp([S.x,S.y])

S = 
    y: [1x1 sym]
    x: [1x1 sym]
 
微分方程的解  x                      y
[ C2*cos(t) + C1*sin(t), C1*cos(t) - C2*sin(t)]
y = dsolve('x*D2y - 3*Dy = x^2','y(1) = 0,y(5) = 0','x')

y =
(31*x^4)/468 - x^3/3 + 125/468


符號變換和符號卷積

Fourier變換

  • fourier(f,t,w) 時域變頻域
  • ifourier(F,w,t) 頻域變時域

單位階躍函數的傅里葉變換。

syms t w
ut = heaviside(t);
UT = fourier(ut)

UT =
pi*dirac(w) - i/w

傅里葉反變換驗證

Ut = ifourier(UT,w,t)
SUt = simplify(Ut)

SUt =
heaviside(t)


Laplace變換

Msyms t s a b
f1 = exp(-a*t)*sin(b*t);
F1 = laplace(f1,t,s);
pretty(F1)

      b
-------------
       2    2
(a + s)  + b


Z變換及其反變換

  • ztrans(f,n,z)
  • iztrans(F,z,n)
syms n z clear
gn = 6*(1-(1/2)^n);
G = ztrans(gn,n,z);
pretty(G)

6 z     6 z
----- - -----
z - 1       1
        z - -
             2


符號卷積

x(t)=etu(t),h(t)=1TetTu(t),x(t)h(t)x(t)=e^{-t}u(t),h(t)=\frac{1}{T}e^{-\frac{t}{T}}u(t),求x(t)*h(t)
方法一:定義實現

syms T t tao s
xt = exp(-t);
ht = exp(-t/T)/T;
uhtao = subs(xt,t,tao)*subs(ht,t,t-tao);
yt1 = int(uhtao,tao,0,t)

yt1 =
-(exp(-t) - exp(-t/T))/(T - 1)

方法二:Laplace變換實現

yt21 = ilaplace(laplace(ut,t,s)*laplace(ht,t,s),s,t);
yt22 = collect(yt21,'(T-1)')

yt22 =
(exp(-t/T) - exp(-t))/(T - 1)


代數方程求解

線性方程組符號解

A = sym([1 1/2 1/2 -1; 1 1 -1 1; 1 -1/4 -1 1; -8 -1 1 1]);
b = sym([0;10;0;1]);
x1 = A\b

x1 =
 1
 8
 8
 9

一般代數方程的解

  • solve(‘eq1’, ‘eq2’, … , ‘eqn’, ‘v1’, ‘v2’, … , ‘vn’)
  • solve(expr1, expr2, … , exprn, ‘v1’, ‘v2’, … , ‘vn’)
S = solve('u*y^2 + v*z + w = 0', 'y + z + w = 0','y','z')
disp('S.y'),disp(S.y),disp('S.z'),disp(S.z)

S = 
    y: [2x1 sym]
    z: [2x1 sym]
S.y
 (v + 2*u*w + (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u) - w
 (v + 2*u*w - (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u) - w
S.z
 -(v + 2*u*w + (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u)
 -(v + 2*u*w - (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u)
syms x
s = solve((x+2)^x == 2,x)        %注意==號的使用
xs = (s+2)^s                     %驗算

s =
0.69829942170241042826920133106081         %當沒有解析解時,給出近似解
xs =
2.0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章