天天看點

Matlab基礎(5)——符号運算

Matlab基礎(5)——符号運算

文章目錄

  • ​​Matlab基礎(5)——符号運算​​
  • ​​建立符号表達式​​
  • ​​符号矩陣運算​​
  • ​​符号運算​​
  • ​​代入/計算結果​​

符号運算是數值計算的擴充,在運算過程中以符号表達式或符号矩陣為運算對象,實作了符号計算和數值計算的互相結合,使應用更靈活。

建立符号表達式

建立符号表達式,需要先建立符号變量,再使用它們編寫表達式。

使用關鍵字​

​syms​

​建立符号變量:

syms a b c  % 一次可以建立多個變量,變量之間隻能用空格銜接
syms A [3 4]  % 建立符号矩陣
% A =
%  
% [ A1_1, A1_2, A1_3, A1_4]
% [ A2_1, A2_2, A2_3, A2_4]
% [ A3_1, A3_2, A3_3, A3_4]

syms 'A%d%d' [2 2]  % 可以通過占位符%d來改變預設格式
% A =
%  
% [ A11, A12]
% [ A21, A22]

syms M 3  % 3階方陣
% M =
%  
% [ M1_1, M1_2, M1_3]
% [ M2_1, M2_2, M2_3]
% [ M3_1, M3_2, M3_3]      

先将變量建立好,才能将含有該變量字元串轉化為符号表達式

syms x
str = 'x^3+2*x+1';  % 不識别2x,即*不可省略
S = eval(str);  % 将字元串轉化為符号表達式
% S =
%  
% x^3 + 2*x + 1      

也可以通過多項式部分提到的函數​

​ploy2sym(p)​

​,将系數向量轉化為符号表達式

P = [1 2 2 1];
S = poly2sym(P);
% S =
%  
% x^3 + 2*x^2 + 2*x + 1      

可以通過函數​

​sym(A)​

​​将矩陣轉化為符号表達式​​

​sym​

​格式。隻有符号表達式可以與符号表達式計算,數值表達式無法直接與符号表達式進行計算。

A = ones(2,3);
S = sym(A)  % 2*3 sym
% S =
%  
% [ 1, 1, 1]
% [ 1, 1, 1]      

使用​

​sym()​

​函數處理數值表達式時,應從盡量小的機關入手,以免産生精度上的誤差,如

>> sym(1/1234567)  % 錯誤
 
ans =
 
7650239286923505/9444732965739290427392
 
>> 1/sym(1234567)  % 正确
 
ans =
 
1/1234567

% ------------------------------------------------

>> sym(exp(pi))  % 錯誤
 
ans =
 
6513525919879993/281474976710656
 
>> exp(sym(pi))  % 正确
 
ans =
 
exp(pi)      

符号矩陣運算

轉置

Matlab預設符号屬于複數,在使用​

​'​

​​求轉置時,會自動求出共轭轉置。是以若隻想求轉置,應該使用​

​.'​

syms 'A%d%d' [2 3]
% A =
%  
% [ A11, A12, A13]
% [ A21, A22, A23]

B = A.'
% B =
%  
% [ A11, A21]
% [ A12, A22]
% [ A13, A23]      

行列式

syms 'A%d%d' 2
% A =
%  
% [ A11, A12]
% [ A21, A22]

d = det(A)
% d =
%  
% A11*A22 - A12*A21      

求逆

inv(A);  % A必須是方陣,結果用A中元素表示      

求秩

rank(A);  % 傳回一個整數      

其他

函數 說明

​inv(A)​

求矩陣的逆,結果用中的元素表示

​rank(A)​

求矩陣的秩,傳回一個整數

​eig(A)​

求特征值、特征向量

​svd(A)​

奇異值分解

​jordan(A)​

Jordan标準形運算

符号運算

因式分解

使用函數​

​factor(S)​

​實作

S = poly2sym([1 3 2]);  % S = X^2+3*x+2
factor(S)
% ans =
%  
% [ x + 2, x + 1]      

也可用于質因數分解

S = sym(276);
factor(S)  % [2 2 3 23]      

表達式展開

syms x
S = eval('(x+1)*(x+2)');
expand(S)  % x^2 + 3*x + 2      

也可以用于三角函數、指數函數、對數函數的展開

syms x y
S = eval('sin(x+y)');
expand(S)  % cos(x)*sin(y) + cos(y)*sin(x)      

表達式化簡

syms x
S = eval('sin(x)^2+cos(x)^2');
simplify(S)  % x+1      
syms x y
S = eval('1/x+1/y');
[n, d] = numden(S)
% n - 分子 n=x+y
% d - 分母 d=x*y      

代入/計算結果

syms F m a Ff
str = 'Ff+F';
S = eval(str);
S = subs(S,F,a*m)  % 用a*m代換F
% S =
%  
% Ff + a*m

res = subs(S,[a m Ff],[2 10 15])  % 分别給[a m Ff]指派為[2 10 15]
% res =
%  
% 35      
上一篇: 帶權圖建樹
下一篇: matlab 複習題