1. 程式人生 > >matlab符號及其運算(2)

matlab符號及其運算(2)

1.巢狀符號表達式

horner函式實現對符號表達式進行巢狀

  • R = horner(P):P為待巢狀的符號表達式,R為巢狀後的符號表達式
>> syms x y
>> horner(x^3 - 6*x^2 + 11*x - 6)
 
ans =
 
x*(x*(x - 6) + 11) - 6
 
>> horner([x^2 + x;y^3 - 2*y])
 
ans =
 
   x*(x + 1)
 y*(y^2 - 2)

2.分解符號表達式

factor函式用於實現符號表達式的分解

  • factor(X):X為多項式或多項式矩陣,係數是有理數,X最後表示成有理數低階多項式相乘的形式,如果不能有理數範圍內因式分解,則會返回X本身。
>> syms x y
>> factor(x^3 - y^3)
 
ans =
 
(x - y)*(x^2 + x*y + y^2)
 
>> factor(sym('12345678901234567890'))
 
ans =
 
2*3^2*5*101*3541*3607*3803*27961

3.化簡符號表達式

根據一定的規則對符號表達式進行化簡,函式為simplify

  • simplify(S):輸入引數S為符號表達式或符號矩陣
  • simplify(S,Name,Value):指定一個符號表達式的屬性名及對應的屬性值,並對矩陣或表示式進行化簡
>> % 對符號表達式進行化簡
>> syms x a b c
>> simplify(sin(x)^2 + cos(x)^2)
 
ans =
 
1
 
>> % 對符號矩陣進行化簡
>> simplify([(x^2 + 5*x + 6)/(x + 2),sin(x)*sin(2*x) + cos(x) * cos(2*x);(exp(-x*i)*i)/2 - (exp(x*i)*i)/2,sqrt(16)])
 
ans =
 
[  x + 3, cos(x)]
[ sin(x),      4]
 
>> % 使用IgnoreAnalyticConstraints規則對符號表達式進行化簡
>> s = (log(x^2 + 2*x + 1) - log(x + 1)) * sqrt(x^2);
>> simplify(s)
 
ans =
 
-(log(x + 1) - log((x + 1)^2))*(x^2)^(1/2)

4.替換符號表達式

當表示式結構複雜、變數較多的時候,引入一些新的變數進行代換,變化結果,從而達到解決問題的目的,這種方法稱為變數代換法。matlab提供了subs函式和subexpr函式進行變數代換或者叫做符號表達式的替換。

subs函式利用符號變數或符號表達式替換目標符號表達式中的符號變數

subexpr函式利用符號變數替換目標符號表達式的某個子符號表達式

subs函式:

subs函式可以用指定符合替換符號表達式中的某一特定符號

  • R = subs(S):用函式中的值或matlab工作區間的值替代符號表達式S中的所有變數,如果沒有指定符號變數的值,則返回值中的該符號變數不被替換
  • R = subs(S,new):用新的符號變數new代替原來的符號表達式S中的預設變數
  • R = subs(S,old,new):用新的符號變數new替換原來符號表達式S中的變數old,當new是數值形式的符號時,實際上用數值替換原來的符號計算表示式的值,結果仍為字串形式
>> syms a b
>> subs(a + b, a, 4)
 
ans =
 
b + 4

>> syms a b;
>> subs(cos(a) + sin(b),{a, b}, {sym('alpha'), 2})
 
ans =
 
sin(2) + cos(alpha)

subexpr函式:

subexpr函式將表示式中重複出現的字串用變數代換。

  • [Y,SIGMA] = subexpr(X, SIGMA):指定用變數SIGMA的值,來代替符號表達式中重複出現的字串。進行替換後,函式的返回值Y,被替換的符號變數由SIGMA返回
  • [Y,SIGMA] = subexpr(X,'SIGMA'):函式中輸入引數SIGMA為字元或字串,用來替換符號表達式中重複出現的字串。進行符號替換返回值為Y,被替換的符號變數由SIGMA返回 
>> syms a b c d x
>> solutions = solve(a * x ^ 3 + b * x ^ 2 + c * x + d == 0,...
x,'MaxDegree',3);
>> [r,sigma] = subexpr(solutions)
 
r =
 
                                                                             sigma^(1/3) - b/(3*a) - (- b^2/(9*a^2) + c/(3*a))/sigma^(1/3)
 (- b^2/(9*a^2) + c/(3*a))/(2*sigma^(1/3)) - sigma^(1/3)/2 + (3^(1/2)*(sigma^(1/3) + (- b^2/(9*a^2) + c/(3*a))/sigma^(1/3))*i)/2 - b/(3*a)
 (- b^2/(9*a^2) + c/(3*a))/(2*sigma^(1/3)) - sigma^(1/3)/2 - (3^(1/2)*(sigma^(1/3) + (- b^2/(9*a^2) + c/(3*a))/sigma^(1/3))*i)/2 - b/(3*a)
 
 
sigma =
 
((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2)
 

5.符號函式的操作

matlab提供了把兩個符號函式符合成一個符號函式的功能函式,同時也提供了對符號函式表示式的逆功能函式

compose函式:函式表示式的符合運算

  • compose(f,g):返回函式當f=f(x)和g=g(y)時的符合函式f(g(y)).x為由函式findsym確定的f的符號變數,y有函式findsym確定的g的符號變數
  • compose(f,g,z):返回f = f(x) 和 g = g(y) 時的符號函式f(g(z)),返回的函式以z為自變數。
  • compose(f,g,x,z):返回符合函式f(g(z)),x為函式f的獨立變數。
  • compose(f,g,x,y,z):返回複合函式f(g(z)),並且x為函式f的獨立變數,y為函式g的獨立變數
>> syms x y z t u
>> f = 1/(1 + x^2);
>> g = sin(y);
>> h = x^t;
>> p = exp(-y/u);
>> a = compose(f,g)
 
a =
 
1/(sin(y)^2 + 1)
 
>> c = compose(h,g,x,z)
 
c =
 
sin(z)^t

finverse函式:實現符號表達式的反函式操作

  • g = finverse(f):計算輸入引數的反函式,f為符號表達式,返回值g也是一個符號表達式
  • g = finverse(f,var):輸入引數var為一個符號變數,是函式f中的變數,且該函式的返回值g是var為自變數。

 

>> syms t x
>> f1 = finverse(log(t))
 
f1 =
 
exp(t)
 
>> f2 = finverse(cos(2 * t) + 1)
 
f2 =
 
acos(t - 1)/2

6.符號微積分

符號表達式的極限:

求微分的基本思想是當自變數趨近某個值時,求函式值的變化。“無窮逼近”是為基本的一個基本思想。

matlab中用limit函式求表示式的極限

  • limit(expr, x, a):求符號函式expr(x)的極限值。即計算當變數x趨近於常量a時,expr(x)的極限值
  • limit(expr,a):求符號函式expr(x)的極限值。變數為函式findsym(expr)確定的預設變數
  • limit(expr):求符號函式expr(x)的極限值。預設趨近於0
  • limit(expr, x, a, 'left'):求符號函式expr的極限值。left表示變數x從左邊趨近於a,換成‘right',就是從右邊趨近去a
>> syms x;
>> f1 = sym((cos(x) + sin(x) - x)/x)
 
f1 =
 
(cos(x) - x + sin(x))/x
 
>> limit(f1,x,inf)
 
ans =
 
-1
 
>> limit(f1,x,0)
 
ans =
 
NaN

符號表達式的微分:

diff可以完成一元或多元函式的任意階數的微分,對於自變數的個數多餘一個的符號矩陣,微分為Jocabian矩陣,採用jacobian函式實現微分

(1) diff函式

  • diff(expr):沒有指定變數和導數階數,則系統按findsym函式指示的預設變數對符號表達式expr求一階導數
  • diff(expr,v):指定符號表達式的變數v
  • diff(expr,sym('v')):計算符號表達式expr的一階導數,以符號變數v為自變數
  • diff(expr,n):對符號表達式expr求n階導數
  • diff(expr,v,n):計算符號表達式expr的n階導數,以符號變數v為自變數
>> syms x
>> f = exp(-2*x) * cos(2*x^0.5)
 
f =
 
exp(-2*x)*cos(2*x^(1/2))
 
>> g = diff(f,4)
 
g =
 
16*exp(-2*x)*cos(2*x^(1/2)) - (24*exp(-2*x)*cos(2*x^(1/2)))/x - (11*exp(-2*x)*cos(2*x^(1/2)))/x^2 - (15*exp(-2*x)*cos(2*x^(1/2)))/(4*x^3) + (32*exp(-2*x)*sin(2*x^(1/2)))/x^(1/2) + (4*exp(-2*x)*sin(2*x^(1/2)))/x^(3/2) + (3*exp(-2*x)*sin(2*x^(1/2)))/x^(5/2) + (15*exp(-2*x)*sin(2*x^(1/2)))/(8*x^(7/2))
 
>> pretty(g)
                  exp(-2 x) #2 24   exp(-2 x) #2 11
exp(-2 x) #2 16 - --------------- - ---------------
                         x                  2
                                           x

     exp(-2 x) #2 15   exp(-2 x) #1 32   exp(-2 x) #1 4
   - --------------- + --------------- + --------------
              3            sqrt(x)             3/2
           4 x                                x

     exp(-2 x) #1 3   exp(-2 x) #1 15
   + -------------- + ---------------
           5/2                7/2
          x                8 x

where

   #1 == sin(2 sqrt(x))

   #2 == cos(2 sqrt(x))

(2) jacobian函式

matlab中,提供了jacobian函式用於求多元函式的導數。

  • jacobian(f,v):計算數量或向量f對於向量v的jacobian矩陣。函式的返回值第i行第j列的數位df(i)/dv(j).當f為數量時,該函式返回f的梯度。引數v可以是數量,jacobian(f,v)等價於diff(f,v).
>> syms x y z
>> f = [x*y*z; y; x+z];
>> v = [x, y, z];
>> R = jacobian(f,v)
 
R =
 
[ y*z, x*z, x*y]
[   0,   1,   0]
[   1,   0,   1]
 
>> b = jacobian(x+z,v)
 
b =
 
[ 1, 0, 1]

符號表達式的積分:

int函式求符號表達式的積分

  • int(f):沒有指定變數和階數,按預設的變數求不定積分
  • int(f,v):以v為自變數,對被積分函式或符號表達式f求不定積分
  • int(f,a,b):符號表達式採用預設變數,該函式求預設變數從a到b時符號表達式f的定積分數值,如果f為符號矩陣,則積分對各個元素分別進行積分
  • int(f,v,a,b):求變數v在區間a到b之間的定積分
>> syms a x t z
>> int(-2 * x/(1 + x^2)^2)
 
ans =
 
1/(x^2 + 1)
 
>> int(x/(1 + z^2), x)
 
ans =
 
x^2/(2*(z^2 + 1))

級數求和:

在matlab中提供了symsum函式用於求符號表達式的和。其呼叫格式為:

  • F = symsum(f,k,a,b):求符號表達式f中變數k從a到b時的有限和
  • F = symsum(f,k):計算符號表達式f中指定變數為k的有限項和
>> syms k x
>> S1 = symsum(k^2,k,0,10)
 
S1 =
 
385
 
>> S2 = symsum(1/k^2,k,1,Inf)
 
S2 =
 
pi^2/6

泰勒級數:

taylor函式用於求符號表達式的泰勒級數展開式

  • taylor(f,var):指定符號變數為var,求Maclaurin多項式
  • taylor(f,var,a):返回符號多項式f中的指定符號自變數var的n-1階的Maclaurin多項式近似式,其中var可以是字串或符號變數
  • taylor(_,Name,Value):指定一個或多個屬性名及其屬性值,實現對符號表達式進行泰勒級數
>> syms x
>> tayor(exp(x))
>> taylor(exp(x))
 
ans =
 
x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1
 
>> taylor(sin(x))
 
ans =
 
x^5/120 - x^3/6 + x

7.符號積分變換

傅立葉變換及其反變換:

F(\omega ) = \int_{-\infty }^{\infty }f(t)e^{-jwt}dt

f(t) = \frac{1}{2\pi }\int_{-\infty }^{\infty }F(\omega )e^{jwt}d\omega

  • Fw = fourier(f, t, w):求時域上函式f的傅立葉變換Fw
  • f = ifourier(Fw,w,t):求頻域上函式Fw的傅立葉反變換f
>> syms w x y z a b c d t
>> f = exp(-x^2);
>> fourier(f,x,y)
 
ans =
 
pi^(1/2)*exp(-y^2/4)
 
>> F = sqrt(sym(pi)) * exp(-y^2/4);
>> ifourier(F,y,z)
 
ans =
 
exp(-z^2)

拉普拉斯變換及其反變換:

F(s ) = \int_{0 }^{\infty }f(t)e^{-st}dt

f(t) = \frac{1}{j2\pi }\int_{c-\infty }^{c+\infty }F(s)e^{st}ds

  • Fs = laplace(f,trans_var,eval_point):求時域上函式f的拉普拉斯變換Fs
  • f = ilaplace(Fs,trains_var,eval_point):求頻域上函式f的拉普拉斯反變換f
>> syms a b c d w x y z t s
>> f = 1/sqrt(x);
>> laplace(f,x,y)
 
ans =
 
pi^(1/2)/y^(1/2)
 
>> F = 1/y^2;
>> ilaplace(F,y,x)
 
ans =
 
x
 

z變換及其反變換:

F(z) = \sum_{n=0 }^{\infty}f(n)z^{-n}

f(n) = Z^{-1}\left \{ F(z) \right \}

  • Fz = ztrans(f, trans_index,eval_point):求時域函式f的Z變換Fz
  • f = iztrans(Fz, trans_index,eval_point):求頻域函式Fz的Z逆變換f
>> syms a b c d w x y z k t n
>> f = sin(k);
>> ztrans(f, k, x)
 
ans =
 
(x*sin(1))/(x^2 - 2*cos(1)*x + 1)
 
>> F = 2*x/(x-2)^2;
>> iztrans(F,x,k)
 
ans =
 
2^k + 2^k*(k - 1)