Matlab學習筆記(1) - 符號變數及其運算
符號變數及其運算
緒:什麼是符號計算?
所謂符號計算是指在運算時,無須事先對變數賦值,而將所得到結果以標準的符號形式來表示。
例如,在符號變數運算過程中pi就用pi表示,而不是具體的近似數值在這裡插入程式碼片3.14或3.1415926。使用符號變數進行運算能最大限度地減少運算過程中因舍入而造成的誤差。符號變數也便於進行運算過程的演示。
1.字元型資料變數的建立
var = ‘expression
字元型變數是以矩陣的形式存在於Matlab的工作空間中的
示例
>> var = 'hello world'
var =
hello world
>> size(var)
ans =
1 11
>> y = '1 + sin(2*x)'
y =
1 + sin(2*x)
2.符號型資料變數的建立
符號物件中的符號常量、變數、函式和表示式,可以用sym和syms函式建立。使用class函式測試建立的操作物件為何種操作物件型別及是否為符號物件型別。
以下為Matlab自帶的sym函式解釋:
>> help sym
sym Construct symbolic numbers, variables and objects.
S = sym(A) constructs an object S, of class 'sym', from A.
If the input argument is a string, the result is a symbolic number
or variable. If the input argument is a numeric scalar or matrix,
the result is a symbolic representation of the given numeric values.
If the input is a function handle the result is the symbolic form
of the body of the function handle.
x = sym('x') creates the symbolic variable with name 'x' and stores the
result in x. x = sym('x','real') also assumes that x is real, so that
conj(x) is equal to x. alpha = sym('alpha') and r = sym('Rho','real')
are other examples. Similarly, k = sym('k','positive') makes k a
positive (real) variable. x = sym('x','clear') restores x to a
formal variable with no additional properties (i.e., insures that x
is NEITHER real NOR positive).
See also: SYMS.
A = sym('A',[N1 N2 ... Nk]) creates an N1-by-N2-...-by-Nk array of
symbolic scalar variables. Elements of vectors have names of the form Ai and elements
of matrices and higher-dimensional arrays have names of the form
Ai1_..._ik where each ij ranges over 1:Nj.
The form can be controlled exactly by using '%d' in the first
input (eg 'A%d%d' will make names Ai1i2).
A = sym('A',N) creates an N-by-N matrix.
sym(A,ASSUMPTION) makes or clears assumptions on A as described in
the previous paragraph.
Statements like pi = sym('pi') and delta = sym('1/10') create symbolic
numbers which avoid the floating point approximations inherent in the
values of pi and 1/10. The pi created in this way temporarily replaces
the built-in numeric function with the same name.
S = sym(A,flag) converts a numeric scalar or matrix to symbolic form.
The technique for converting floating point numbers is specified by
the optional second argument, which may be 'f', 'r', 'e' or 'd'.
The default is 'r'.
'f' stands for 'floating point'. All values are transformed from
double precision to exact numeric values N*2^e for integers N and e.
'r' stands for 'rational'. Floating point numbers obtained by
evaluating expressions of the form p/q, p*pi/q, sqrt(p/q), 2^q and 10^q
for modest sized integers p and q are converted to the corresponding
symbolic form. This effectively compensates for the roundoff error
involved in the original evaluation, but may not represent the floating
point value precisely. If no simple rational approximation can be
found, the 'f' form is used.
'e' stands for 'estimate error'. The 'r' form is supplemented by a
term involving the variable 'eps' which estimates the difference
between the theoretical rational expression and its actual floating
point value. For example, sym(3*pi/4,'e') is 3*pi/4-103*eps/249.
'd' stands for 'decimal'. The number of digits is taken from the
current setting of DIGITS used by VPA. Using fewer than 16 digits
reduces accuracy, while more than 16 digits may not be warranted.
For example, with digits(10), sym(4/3,'d') is 1.333333333, while
with digits(20), sym(4/3,'d') is 1.3333333333333332593,
which does not end in a string of 3's, but is an accurate decimal
representation of the double-precision floating point number nearest
to 4/3.
See also syms, class, digits, vpa.
sym 的參考頁
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函式建立符號物件
>> %利用sym函式建立符號物件
>> sqrt(3)
ans =
1.7321
>> a = sqrt(sym(3))
a =
3^(1/2)
>> a = sym(sqrt(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函式建立符號表達式
>> %利用sym函式建立符號表達式
>> syms s(t) f(x,y)
>> s(t) = 3*t + 2
s(t) =
3*t + 2
>> s(2)
ans =y
8
>> f(x,y) = x + 3*y
f(x, y) =
x + 3*y
>> f(2,3)
ans =
11
也可以利用sym和syms生成符號矩陣
示例:
>> %利用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)運算子號“+”,“-”,“*”,“/”,“\”,“^”分別實現符號矩陣的加法、減法、乘法、左除、右除和求冪運算
示例:
%利用sym實現矩陣的加法
>> 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]
(2)運算子號“.*”,“./”,“.\”,“.^”分別實現“元素對元素”的乘法、左除、右除和求冪運算
>> %利用syms實現矩陣的點乘
>> 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;
>> R = A'
R =
[ conj(a), conj(c)]
[ conj(b), conj(d)]
>> R1 = A.'
R1 =
[ a, c]
[ b, d]
關係運算符號:
與數值計算中關係運算符號相區別的是,符號計算中的關係運算符還有以下兩種:
- 運算子號“==”表示對運算子兩邊的符號物件進行“相等”的比較,返回值“1”表示相等,“0”表示不等
- 運算子號“~=”表示對運算子號兩邊的符號物件進行不相等的標記。“1”表示不相等,“0”表示相等
複數函式:
複數函式包括複數的共軛、實部、虛部和模函式,與數值計算中是一致的
矩陣代數函式:
符號計算中,常用的矩陣代數函式有:diag函式,triu函式,tril函式,inv函式,det函式,rank函式,rref函式,null函式,colspace函式,ploy函式、expm函式,eig函式和svd函式
%利用diag函式取符號矩陣對角線元素向量
>> f = sym('[1 2 1; 2 3 5;1 7 9]')
f =
[ 1, 2, 1]
[ 2, 3, 5]
[ 1, 7, 9]
>> a = diag(f)
a =
1
3
9
4.尋找符號變數
Matlab中的符號物件可以是符號常量也可以是符號變數,findsym函式可以找到符號表達式中的符號變數
- findsym(s,n):尋找符號表達式s中的n個符號變數,若沒有指定n,則返回s中的全部符號變數。
%利用findsym函式尋找符號表達式中的符號變數
>> syms a 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:得到當前採用的數值計算的精度
%Matlab符號函式的的精度
>> digits
Digits = 32
>> a = sym(1.3,'d')
a =
1.3000000000000000444089209850063
>> digits(50)
>> a = sym(1.3,'d')
a =
1.3000000000000000444089209850062616169452667236328
vpa函式:用於進行可控精度運算
- R = vpa(A):計算符號矩陣A的近似解,精度為函式digits(d)指定的有效位數
- R = vpa(A,d):計算符號矩陣A的近似解,有效位數由引數d指定
%使用vpa函式進行可控精度運算
>> a = vpa(hilb(2))
a =
[ 1.0, 0.5]
[ 0.5, 0.33333333333333333333333333333333]
>> b = vpa(hilb(3),6)
b =
[ 1.0, 0.5, 0.333333]
[ 0.5, 0.333333, 0.25]
[ 0.333333, 0.25, 0.2]
6.顯示符號表達式
符號表達式的顯示過程中,預設採用Matlab形式的顯示,除了預設的顯示方式外,還可以使用pretty函式,允許使用者將符號表達式顯示為符合一般數學表達習慣的數學表示式。
pretty(x):將符號表達式用書寫方式顯示出來,使用預設的寬
%顯示符號表達式
>> sym 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函式用於實現將符號表達式中的同類項進行合併
ss
- 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函式用於將符號表達式展開
s
- expand(s):表示式S中如果包含函式,Matlab會利用恆等式變型將其寫成相應的形s式。
- expand(s,Name,Value):設定展開式的引數名Name及其對應的引數值Value
%展開符號表達式
>> syms x y
>> expand((x - 2) * (x - 4))
ans =
x^2 - 6*x + 8
>> expand(cos(x + y))
ans =
cos(x)*cos(y) - sin(x)*sin(y)