440 likes | 760 Views
Symbolic. http://apec.nui.edu.tw 長庚大學 機械系 吳俊仲 小幅修改. ˙ 基本簡介. 1.Symbolic Math 與 Matlab 的不同。 Matlab: 運算為數值運算 (numerical calculation) ex: 運用 quad 函數函數計算方程式的積分。 Symbolic Math : 運算為符號運算 (symbolic calculation) ex: 計算 or 微分式.
E N D
Symbolic http://apec.nui.edu.tw 長庚大學 機械系 吳俊仲 小幅修改
˙基本簡介 1.Symbolic Math與Matlab的不同。 Matlab: 運算為數值運算(numerical calculation) ex:運用quad函數函數計算方程式的積分。 Symbolic Math: 運算為符號運算(symbolic calculation) ex:計算 or微分式
quad(‘func’,a,b,tol):以辛普森法積分函數func,積分下限為a,上限為b,誤差設定為tol(預設為 )。 ex:計算 值 >> quad('sin(x)',0,pi) ans = 2.0000
2.建立符號物件: 要運用Symbolic Math運算,必須先建立符號物件。
ex:>> a=sym(5/3) a = 5/3 >> a+5/3 ans = 10/3 >>sqrt(a) ans= 1/3*30^(1/2) 若sym函數中的數值為小數,在建立符號後,sym會自動將 其轉換為分數。 ex:>>s=sym(0.254) ans= 127/500
在一個運算式中,只要有一項是符號物件,則matlab會把整在一個運算式中,只要有一項是符號物件,則matlab會把整 個運算結果化成符號式。 ex: >>sym(2)/7+7/12+9/7 ans= 181/84 >>whos Name Size Bytes Class ans 1x1 136 sym object Grand total is 7 elements using 136 bytes 上例表示,原本僅建立2為符號,結果運算之後的答案亦為 符號。
在符號運算當中,符號與數值的區分很重要,必須在符號運算當中,符號與數值的區分很重要,必須 要清清楚楚的瞭解,否則往後的計算會常常出現錯 誤。可用whos指令來確定。 ex:欲建立一個數學式符號f,其中一方法可用下法。 >>f=sym(‘a*x^2+b*x+c’) f= a*x^2+b*x+c >>whos Name Size Bytes Class f 1x1 146 sym object Grand total is 12 elements using 146 bytes 由上可知,只有f為符號,其中的a b c x 皆仍為數值, matlab並不會主動將其變更為符號,與之前的例子結果不 同。
因此,我們通常以下面方式建立一數學式符號f,以便之後因此,我們通常以下面方式建立一數學式符號f,以便之後 的符號運算不會出任何差錯。 >>syms a b c x >>f=sym(‘a*x^2+b*x+c’) f= a*x^2+b*x+c >>whos Name Size Bytes Class a 1x1 126 sym object b 1x1 126 sym object c 1x1 126 sym object f 1x1 146 sym object x 1x1 126 sym object Grand total is 20 elements using 650 bytes
3.建立符號式陣列 先將符號變數建立好,以此符號變數建立陣列則此陣列即為 符號陣列(symbolic array)。 ex: >>syms a b c d e >>m=[a 0 b;b 1 0;c d e] m= [ a, 0, b] [ b, 1, 0] [ c, d, e] >>det(m) ans= a*e+b^2*d-c*b 亦可對此陣列做運算,例如求其det。
4.任意精準度的計算 Symbolic Math toolbox裡提供了三種不同的精準度運算。 numeric Matlab內建的浮點數運算 rational Maple的精確值分數運算 vpa Symbolic Math內的任意精準運算
vpa任意精準度運算 vpa為variable precision arthmetic的縮寫,全名為變動精 準度的數學運算,可以使用任意精準度來算數學式。
ex:圓週率pi >>pi ans= 3.1416 Matlab預設小數點後面四位。 >>digits digits=32 vpa(pi) ans= 3.1415926535897932384626433832795 小數點後為32位
>>digits(10) digits=10 >>vpa(pi) Ans= 3.1415926535 小數點後面為10位 >>vpa(sqrt(2)+sqrt(3),15) ans= 3.146264369941972 亦可自己指定精準度來計算某個算式。
‧基本代數運算 1.代數的基本處理
Ex: >> syms a b >> expand((a+b)^3) ans = a^3+3*a^2*b+3*a*b^2+b^3 將(a+b)^ 3展開得到上式 >> factor(ans) ans = (a+b)^3 再將上式因式分解,即為原式(a+b)^3
expand亦可用於對三角函數與指數函數展開。 ex: >> syms a b >> expand(cos(a+b)) ans = cos(a)*cos(b)-sin(a)*sin(b) 上式即為cos之合角公式。 ex: >> expand(exp(a+b^2+3)) ans = exp(a)*exp(b^2)*exp(3)
Ex: >> F=expand((a+b)*(a^2+b^2+1)) F = a^3+a*b^2+a+a^2*b+b^3+b >> collect(F,a) ans = a^3+a^2*b+(1+b^2)*a+b^3+b >> collect(F,b) ans = b^3+a*b^2+(1+a^2)*b+a^3+a 以上為collect之例,將同一雙變數多項式F,變為分別為以 a為變數之多項式以及以b為變數之多項式。
simplify Ex:化簡 >> syms a b x >> simplify(exp(4*log(sqrt(a+b)))) ans = (a+b)^2 Ex:化簡 >> simplify((x^2+2*x+1)/(x+1)) ans = x+1
subs Ex:將數字2帶入多項式 中。 >> syms x a >> subs(x^2+2*x+1,2) ans = 9 >> 將符號(a+1)帶入 中,並化簡之。 >> subs(x^2+2*x+1,a+1) ans = (a+1)^2+2*a+3 >> simplify(ans) ans = a^2+4*a+4
subs函數亦可進行多個變數的代換。 Ex: >> syms a b x >> subs(sin(a+b),{a,b},{sym('R'),x}) ans = sin(R+x) 上式為分別將sin(a+b)中的ab置換成符號R及x。
>> Q=subs(sin(a+b),a,magic(2)) Q = [ sin(1+b), sin(3+b)] [ sin(4+b), sin(2+b)] Matlab會自動先計算magic(2)+b的運算,在對矩陣裡的每個 元素進行sin運算。 >> subs(Q,sym('sqrt(2)')) ans = [ sin(1+2^(1/2)), sin(3+2^(1/2))] [ sin(4+2^(1/2)), sin(2+2^(1/2))] >> eval(ans) ans = 0.6649 -0.9559 -0.7637 -0.2693
2.多項式與分式的相關運算 與多項式運算相關之指令
poly2sym,sym2poly與coeffis Ex: >> syms x y >> P=poly2sym([1 2 3 4 5],x) P = x^4+2*x^3+3*x^2+4*x+5 >> sym2poly(P) ans = • 2 3 4 5 >> coeffs(P) ans = [ 5, 4, 3, 2, 1] >>
Ex:多項式 >> syms x y >> Q=6*x^2*y^2+2*x*y-7*y^3 Q = 6*x^2*y^2+2*x*y-7*y^3 >> coeffs(Q) ans = [ 6, 2, -7] >> coeffs(Q,x) ans = [ -7*y^3, 2*y, 6*y^2] >> coeffs(Q,y) ans = [ 2*x, 6*x^2, -7] >> 若未對多項式指定某特定變數,則 matlab無法判別,即會以原多項式符 號皆當作變數,對其取係數,但不排 列大小。
Ex:多項式 >> syms x y >> coeffs((x+y)*(x^2+y^2),x) ??? Error using ==> sym.maple Error, invalid arguments to coeffs Error in ==> sym.coeffs at 35 c = maple('coeffs',p,x); 將上多項式展開後 >> coeffs(expand((x+y)*(x^2+y^2)),x) ans = [ y^3, y^2, 1, y] 利用coeffs取出多項式的係數時,多項式必須為標準型式,亦即必須為展開後的式子,否則指令無法執行。
[n,d]=numden(expr) Ex: >> [n,d]=numden(sym(12/5)) n = 12 d = 5 >>
使用numden指令時,若只給予一個變數,則此指令只會傳回分子部分。左例的n或是q,都皆為R的分子。使用numden指令時,若只給予一個變數,則此指令只會傳回分子部分。左例的n或是q,都皆為R的分子。 Ex: >> syms x >> R=(x^3+2*x^2+3*x+6)/(x^2+3) R = (x^3+2*x^2+3*x+6)/(x^2+3) >> n=numden(R) n = x^3+2*x^2+3*x+6 >> q=numden(R) q = x^3+2*x^2+3*x+6 >>
[q,r]=quorem(expr) Ex: >> [q,r]=quorem(x^5,x^2+3) q = x^3-3*x r = 9*x 以下驗證 >> q*(x^2+3)+r ans = (x^3-3*x)*(x^2+3)+9*x >> simplify(ans) ans = x^5 >>
‧方程式求解 1.簡單的solve函數 solve算是symbolic math toolbox的全能求解函數,功能與 fzero函數有很大的不同。fzero函數僅能解數值解,而solve 可解符號解。 基本指令用法
Ex:解 >> syms a b c x y >> eqn=a*x^2+b*x+c eqn = a*x^2+b*x+c >> sol=solve(eqn,x) sol = 1/2/a*(-b+(b^2-4*a*c)^(1/2)) 1/2/a*(-b-(b^2-4*a*c)^(1/2)) >> simplify(ans) ans = -1/2*(b-(b^2-4*a*c)^(1/2))/a -1/2*(b+(b^2-4*a*c)^(1/2))/a
以下驗證 >> subs(eqn,sol) ans = 1/4/a*(-b+(b^2-4*a*c)^(1/2))^2+1/2*b/a*(-b+(b^2-4*a*c)^(1/2))+c 1/4/a*(-b-(b^2-4*a*c)^(1/2))^2+1/2*b/a*(-b-(b^2-4*a*c)^(1/2))+c >> simplify(ans) ans = 0 0 >>
複數解 >> solve(x^3+x-2) ans = -1/2+1/2*i*7^(1/2) -1/2-1/2*i*7^(1/2) >> 三角函數解 >> solve(2*asin(3*x)-acos(5*x)) ans = -5/36+1/36*97^(1/2) >>
Ex:解 之x解。 >> solve(2*cos(3*x)^2-4*y,x) ans = 1/3*acos(2^(1/2)*y^(1/2)) 1/3*pi-1/3*acos(2^(1/2)*y^(1/2)) >> 以下驗證 >> subs(2*cos(3*x)^2-4*y,ans) ans = 0 0 >>
指數函數解 解 >> solve(x^(1+log2(x))-(2*x)^3) ans = 2*exp((log(2)^2+log(8)*log(2))^(1/2)) 2/exp((log(2)^2+log(8)*log(2))^(1/2)) >>
以下驗證 >> subs(x^(1+log2(x))-(2*x)^3,ans) ans = (2*exp((log(2)^2+log(8)*log(2))^(1/2)))^(1+log(2*exp((log(2)^2+log(8)*log(2))^(1/2)))/log(2))-64*exp((log(2)^2+log(8)*log(2))^(1/2))^3 (2/exp((log(2)^2+log(8)*log(2))^(1/2)))^(1+log(2/exp((log(2)^2+log(8)*log(2))^(1/2)))/log(2))-64/exp((log(2)^2+log(8)*log(2))^(1/2))^3 >> simplify(ans) ans = 0 0 >>
絕對值函數 Ex: >> syms x y >> sol(abs(x^2-4)-2) >> solve(abs(x^2-4)-2) ans = [6^(1/2),-6^(1/2),2^(1/2),-2^(1/2)] >> eval(ans) ans = 2.4495 -2.4495 1.4142 -1.4142 >>
‧求解聯立方程式 Solve亦可解決聯立方程式問題,用法與解單一方程式相同,只要多加入變數即可。
Ex:解聯立方程式 >> syms a b c d e f x y >> sol=solve(2*x+y-4,x^2+y^2-4) sol = x: [2x1 sym] y: [2x1 sym]
>> sol.x ans = 2 6/5 >> sol.y ans = 0 8/5 >> sol.x(2) ans = 6/5 >>
Ex:解聯立方程式 >> sol=solve(a*x+b*y-c,d*x+e*y-f,x,y) sol = x: [1x1 sym] y: [1x1 sym] >> [sol.x;sol.y] ans = (-b*f+c*e)/(a*e-d*b) (a*f-d*c)/(a*e-d*b)
diff(f) — 求f的微分 diff(f,v) — 對f 求v微分 diff(f,n) — 對f 求n微分 diff(f,v,n) —對f 求v的 n 階微分 例:syms a x f=sin(a*x) df=diff(f) dfa=diff(f,a,2) 微分
int(f) — 對 f求不定積分 int(f,v) — 對 f的v求不定積分 int(f,v,a,b) — 對 f的v在(a,b) 區間求定積分 findsym(f) —可以找出f中的每个变量 注意:當函数的積分不存在,Matlab返回原來的積分表達式。 積分
int(‘被積分式’,‘變數’,‘積分下限’,‘積分上限’)——定積分int(‘被積分式’,‘變數’,‘積分下限’,‘積分上限’)——定積分 例:int(-2*x/(1+x^2)^2) ans = 1/(1+x^2) int(log(x)) int(log10(x)) int(sin(x),x,-pi,pi) ——如不寫,為不定積分