matlab符號及其運算(2)
阿新 • • 發佈:2018-11-17
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.符號積分變換
傅立葉變換及其反變換:
- 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)
拉普拉斯變換及其反變換:
- 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變換及其反變換:
- 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)