文章目錄
符號對象和表達式
基本符號對象和運算符
生成符號對象的規則
- 必須藉助
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
(y
在x
的右邊,w
在x
的左邊)
>> 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)
表達式限定在集合set
,set
可以爲’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 clear
,sym(‘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 展開,Value 與Name 必須成對出現。Value 一般爲’Order’ ,Name 爲一個整數n ,表示階段誤差階次爲n |
求兩個重要極限
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)
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]
求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)]
隱函數求導。
設,求
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))
在x = 0
處展開的5
階和8
階Maclaurin
級數。
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]
上定積分
不定積分
syms x
intf = int(x*log(x),x)
intf =
(x^2*(log(x) - 1/2))/2
求三重積分
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
符號卷積
方法一:定義實現
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