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

matlab符號及其運算(1)

matlab中提供了強大的符號運算功能,可以按照推理解析的方法進行運算

1.字元型資料變數的建立

var = 'expression'

字元型變數是以矩陣的形式存在MATLAB的工作空間中的

>> C = 'china'
C =
china
>> A = '1 + sin(2) / 3'
A =
1 + sin(2) / 3
>> size(C)
ans =
     1     5
>> size(A)
ans =
     1    14

2.符號型資料變數的建立

符號物件中的符號常量、變數、函式和表示式,可以用sym和syms函式建立。使用class函式測試建立的操作物件為何種操作物件型別及是否為符號物件型別

sym函式:可以生成單個的符號變數

  • var = sym('var', set):建立一個符號變數,並設定符號物件的格式,set可以不選
    • 'position':限定var表示正的實型符號變數
    • 'real':限定var為實型符號變數
    • 'unreal':限定var為非實行符號變數
  • sym('var','clear'):清除先前設定的符號變數var
  • Num = sym(Num,flag):將一個數值轉換為符號形式,輸入引數flag為轉換的符合物件應該符合的格式型別
    • 'r':最接近有理表示,為係數預設設定
    • 'e':帶估計誤差的有理表示
    • 'f':十六進位制浮點表示
    • 'd':最接近的十進位制浮點精確表示
  • A = sym('A',dim):建立一個向量或矩陣的符號變數
  • A = sym('A',set):建立一個符號矩陣,set用於設定矩陣的維數
  • sym(A,'clear'):清除前面已建立的符號矩陣A
  • f(arg1,...,argN) = sym('f(arg1,...,argN'):根據f指定的輸入引數arg1,...,argN建立符號變數f(arg1,...,argN)
% 利用sym函式建立符號物件
>> sqrt(3)

ans =

    1.7321

>> a = sqrt(sym(3))
 
a =
 
3^(1/2)
 

syms函式:可以建立任意多個符號變數

  • syms var...varN:建立符號變數var...varN
  • syms var...varN set:set指定符號物件的格式
    • 'position':限定var表示正的實型符號變數
    • 'real':限定var為實型符號變數
  • syms var...varN clear:清除前面已經定義好的符號物件
  • syms f(arg1,...,argN):建立符號函式f,函式中包含多個符號變數

利用syms函式建立符號表達式

>> syms s(t) f(x,y)
>> f(x,y) = x + 2 * y
 
f(x, y) =
 
x + 2*y
 
>> f(1,3)
 
ans =
 
7

利用sym和syms也可生成符號矩陣

>> m1 = [1,2+x,1;3-x,1,4+y;1,2+y,0]
 
m1 =
 
[     1, x + 2,     1]
[ 3 - x,     1, y + 4]
[     1, y + 2,     0]
 
>> m2 = sym('[[1,2+x,1;3-x,1,4+y;1,2+y,0]]')
m2 =
 
[ [1, x + 2, 1], [3 - x, 1, y + 4], [1, y + 2, 0]]

3.符號計算的運算子與函式

MATLAB採用了全新的資料結構、面向物件程式設計和過載技術,使得符號計算和數值計算在形式上和風格上渾然統一。

算術運算子號:

(1)運算子號“+”,“-”,“*”,“/”,“\”,“^”分別實現符號矩陣的加法、減法、乘法、左除、右除和求冪運算

>> A = sym('[x^2 3;4 * xcos(x)]');
>> B = sym('[1/x^2 2*x;3 x^2+x]')

>> C = A + B
 
C =
 
[   1/x^2 + x^2, 2*x + 3]
[ 4*xcos(x) + 3, x^2 + x]
 
>> J = A / B
 
J =
 
[     (x*(x^4 + x^3 - 9))/(- 6*x^2 + x + 1),   -(2*x^5 - 3)/(- 6*x^3 + x^2 + x)]
[ (4*x^2*xcos(x)*(x + 1))/(- 6*x^2 + x + 1), -(8*x^2*xcos(x))/(- 6*x^2 + x + 1)]

(2)運算子號“.*”,“./”,“.\”,“/^”分別實現“元素對元素”的乘法、左除、右除和求冪運算

>> syms a b c d e f g h;
>> A = sym('[a,b;c,d]')
A =
 
[ a, b]
[ c, d]
 
>> B = sym('[e,f;g,h]')
B =
 
[ e, f]
[ g, h]
 
>> R = A * B
 
R =
 
[ a*e + b*g, a*f + b*h]
[ c*e + d*g, c*f + d*h]
 
>> R1 = A .* B
 
R1 =
 
[ a*e, b*f]
[ c*g, d*h]

(3)運算子號“ ' ”," .' "分別試下符號矩陣的共軛和非共軛轉置

>> syms a b c d;
>> A = sym('[a b;c d]');
>> R = A'
 
R =
 
[ conj(a), conj(c)]
[ conj(b), conj(d)]
 
>> R2 = A.'
 
R2 =
 
[ a, c]
[ b, d]

關係運算符號:

與數值計算中關係運算符號相區別的是,符號計算中的關係運算符還有以下兩種

  • 運算子號“==”表示對運算子兩邊的符號物件進行“相等”的比較,返回值“1”表示相等,“0”表示不等
  • 運算子號“~=”表示對運算子號兩邊的符號物件進行不相等的標記。“1”表示不相等,“0”表示相等

複數函式:

複數函式包括複數的共軛、實部、虛部和模函式,與數值計算中是一致的

矩陣代數函式:

符號計算中,常用的矩陣代數函式有:diag函式,triu函式,tril函式,inv函式,det函式,rank函式,rref函式,null函式,colspace函式,ploy函式、expm函式,eig函式和svd函式。

>> f = sym('[1 2 1; 2 3 5;1 7 9]')
f =
 
[ 1, 2, 1]
[ 2, 3, 5]
[ 1, 7, 9]
 
>> [U,S,V] = svd(f)
 
U =
 
[ 0.16282766200529790566464473003047, 0.36344034057570734984922459430431,  0.91727764135407896387284636832453]
[ 0.46068074153566191523968894576701, 0.79411905473576600135312190977843, -0.39641919893431769076779069408513]
[ 0.87250238215379167379020797827246, -0.4871201553495680712962919278634, 0.038125416563908403817930647866644]

注意:符號工具箱僅支援元素為符號常量的符號矩陣的SVD分解

4.尋找符號變數

matlab中的符號物件可以是符號常量也可以是符號變數,findsym函式可以找到符號表達式中的符號變數

  • findsym(s):尋找符號表達式s中所有的符號變數
  • findsym(s,n):尋找符號表達式n個在字母表中與x最接近的變數
>> syms s b x y;
>> f = a ^ 2 + 6 * b + cos(x - 2) + log(5 + y) + 4 - 5i
 
f =
 
a^2 + 6*b + cos(x - 2) + log(y + 5) + (4 - 5i)
>> findsym(f)
ans =

a,b,x,y

>> findsym(f,2)
ans =

x,y

5.符號精度計算

符號計算的一個顯著特點是:由於計算過程中不會出現舍入誤差,從而可以得到任意精度的數值解。因此,如果想要使得計算結果精確,就可以犧牲計算時間和儲存空間,用符號計算來獲得計算精度。

在符號運算工具箱中,有三種不同型別的算術運算。

  • 數值型別:MATLAB的浮點算術運算,最快的運算,需要的計算機記憶體很小,但是結果不精確
  • 有理數型別:Maple的精度符號計算
  • VPA型別:Maple的任意精度算術運算。

digits函式:digits函式用於設定所用數值的精度

  • digits(d):符號物件的近似解的精度為d位有效數字,引數d的預設值為32位
  • d = digits:得到當前採用的數值計算的精度
>> digits
 
Digits = 32
 
>> a1 = sym(1.6,'d')
 
a1 =
 
1.6000000000000000888178419700125
 
>> digits(42)
>> digits
 
Digits = 42
 
>> a2 = sym(1.6,'d')
 
a2 =
 
1.60000000000000008881784197001252323389053

vpa函式:用於進行可控精度運算

  • R = vpa(A):計算符號矩陣A的近似解,精度為函式digits(d)指定的有效位數
  • R = vpa(A,d):計算符號矩陣A的近似解,有效位數由引數d指定 
>> a = vpa(hilb(2))
 
a =
 
[ 1.0,                                          0.5]
[ 0.5, 0.333333333333333333333333333333333333333333]
 
>> b = vpa(hilb(3),6)
 
b =
 
[      1.0,      0.5, 0.333333]
[      0.5, 0.333333,     0.25]
[ 0.333333,     0.25,      0.2]
 
>> c = vpa(pi)
 
c =
 
3.14159265358979323846264338327950288419717

6.顯示符號表達式

符號表達式的顯示過程中,預設採用MATLAB形式的顯示,除了預設的顯示方式外,還可以使用pretty函式,允許使用者將符號表達式顯示為符合一般數學表達習慣的數學表示式。

  • pretty(X):將符號表達式用書寫方式顯示出來,使用預設的寬
>> syms x
>> s = solve(x^4 + 2*x + 1,x,'MaxDegree',3);
>> pretty(s)
/         -1         \
|                    |
|           2    1   |
|    #2 - ---- + -   |
|         9 #2   3   |
|                    |
|   1         #2   1 |
| ---- - #1 - -- + - |
| 9 #2         2   3 |
|                    |
|        1    #2   1 |
| #1 + ---- - -- + - |
\      9 #2    2   3 /

where

                 /   2       \
         sqrt(3) | ---- + #2 | 1i
                 \ 9 #2      /
   #1 == ------------------------
                     2

         / sqrt(11) sqrt(27)   17 \1/3
   #2 == | ----------------- - -- |
         \         27          27 /

7.合併符號表達式

collect函式用於實現將符號表達式中的同類項進行合併

  • R = collect(S):將表示式S中相同次冪的項合併,系統預設為按照x的相同次冪項進行合併
  • R = collect(S,v):將表示式S按照v的次冪項進行合併,輸入引數S可以是表示式,也可以是一個符號矩陣
>> syms x y
>> collect((exp(x) + x) * (x + 2))
 
ans =
 
x^2 + (exp(x) + 2)*x + 2*exp(x)
 
>> collect(x^2*y + y*x - x^2 - 2*x,x)
 
ans =
 
(y - 1)*x^2 + (y - 2)*x

8.展開符號表達式

expand函式用於實現將符號表達式展開。

  • expand(S):表示式S中如果包含函式,matlab會利用恆等式變型將其寫成相應的形式。
  • expand(S,Name,Value):設定展開式的引數名Name及其對應的引數值Value
>> syms x y a b c t
>> expand((x - 2) * (x - 4))
 
ans =
 
x^2 - 6*x + 8
 
>> expand(cos(x + y))
 
ans =
 
cos(x)*cos(y) - sin(x)*sin(y)