octave中符號計算需要額外安裝symbolic庫,下面是安裝方法,不安裝無法使用
https://blog.csdn.net/weixin_39956356/article/details/106732134
目錄
1 octave符號計算簡介
octave主要科學計算有兩大類,數值計算和符號計算,今天這裏分享的是符號計算,語法和MATLAB很像,或者說連參數完全一致。但是不能認爲octave是MATLAB的盜版,octave是GNU的開源項目,代碼開源,爲了讓MATLAB使用者不會感到有太大差距,也仿着做了octave。MATLAB在93年收購了Maple,在此基礎上設計了符號工具箱,可以認爲MATLAB是行業領先者,是行業的標準,而octave遵循這個標準,完成開發,有些地方比MATLAB做的還更有意思。
我寫了注意的是octave和MATLAB有差別的地方
下面簡單介紹兩個概念,這裏只是泛泛的講,方便理解
- 符號:可以認爲是在作業本上寫的 ,比如常常見到的化簡題目,一直化簡,最後才帶值計算
- 變量:在計算過程中是已知的,比如
1.1 符號計算及符號表達式的創建
有兩種創建方式,不過第二種方式更常用
第一種:一次只能創建一個
符號量名(不給默認ans) = sym(符號字符串)
>> b = sym('b')
b = (sym) b
第二種:一次可以創建多個,注意中間不要用逗號
syms a b c d
符號表達式,這裏分享最常用最容易理解的一種,即用已經定義的符號變量組成的表達式
# 一個求長方體體積的表達,生成的V自然而然的是符號變量
>> syms x y z
>> V = x*y*z
V = (sym) x*y*z
1.2 基本的符號運算
1.2.1 符號表達式的四則運算
基本的運算就是 +,-,*,/,^
比如兩個多項式乘法,顯示很友好,就像手寫的一樣
和相乘
>> f = x^2 - x + 7
f = (sym)
2
x - x + 7
>> g = 2*x^2 + 3*x - 5
g = (sym)
2
2*x + 3*x - 5
>> f * g
ans = (sym)
/ 2 \ / 2 \
\x - x + 7/*\2*x + 3*x - 5/
1.2.2 符號表達式的提取分子,分母
注意:numden
在octave沒有像MATLAB那樣化簡
>> f = (x^2+3)/(2*x+1) + 3*x/(x-1)
f = (sym)
2
3*x x + 3
----- + -------
x - 1 2*x + 1
>> [n, d] = numden(f)
n = (sym)
2
3*x x + 3
----- + -------
x - 1 2*x + 1
d = (sym) 1
1.2.3 因式分解和展開
因式分解factor
, 如
>> A = a^3 - b^3
A = (sym)
3 3
a - b
>> factor(A)
ans = (sym)
/ 2 2\
(a - b)*\a + a*b + b /
再舉個例子,240的分解如下
>> factor(sym('240'))
ans = (sym)
4 1 1
2 *3 *5
因式展開expand
, 如上
>> expand(f*g)
ans = (sym)
4 3 2
2*x + x + 6*x + 26*x - 35
注意:collect
在octave中沒有,含義是按某個字母合併同類項
1.2.4 符號表達式化簡
符號表達式化簡simplify
, 如化簡
注意:simple
在octave中沒有,MATLAB也棄用了
>> s = (x^2+y^2)^2 + (x^2-y^2)^2
s = (sym)
2 2
/ 2 2\ / 2 2\
\x - y / + \x + y /
>> simplify(s)
ans = (sym)
4 4
2*x + 2*y
1.2.5 符號表達式與數值表達式的轉化
如數值表達式3.14轉成符號表達式
>> sym(3.14)
warning: passing floating-point values to sym is dangerous, see "help sym"
warning: called from
double_to_sym_heuristic at line 50 column 7
sym at line 379 column 13
ans = (sym)
157
---
50
注意:有警告,不能傳入浮點數,解決辦法有兩種,下面兩種都可以
>> sym(314)/100
>> sym(3.14, 'r')
如符號表達式3.14轉成數值
>> phi = '(1+sqrt(5))/2'
phi = (1+sqrt(5))/2
>> eval(phi)
ans = 1.6180
2 符號表達式默認C位變量
比如長方體體積的表達V = x*y*z
,我們想知道里面的有幾個符號變量,誰是C位?,爲什麼要知道誰是C位了(最核心的變量呢?),比如在求導,積分中默認是對C位變量求導,積分。除非指定其他變量
規定:離字母x最近的爲C位變量。這裏就是x了
>> findsym(V) # 一共有三個符號變量
ans = x,y,z
>> findsym(V, 1) # C位變量
ans = x
2.1 符號矩陣
數值計算關於矩陣的都可以用,不過結果是表達式而已。 比如求行列式的值det,秩rank,跡trace,上下三角矩陣tril,triu,
>> A = [sin(x) cos(x); acos(x) asin(x)]
A = (sym 2x2 matrix)
[sin(x) cos(x) ]
[ ]
[acos(x) asin(x)]
>> det(A)
ans = (sym) sin(x)*asin(x) - cos(x)*acos(x)
3 看一個例子
求使得齊次線性方程組有非零解
>> syms lambda
>> A = [1-lambda -2 4; 2 3-lambda 1; 1 1 1-lambda]
A = (sym 3x3 matrix)
[1 - lambda -2 4 ]
[ ]
[ 2 3 - lambda 1 ]
[ ]
[ 1 1 1 - lambda]
>> factor(det(A))
ans = (sym) -lambda*(lambda - 3)*(lambda - 2)
結果就是0, 2, 3.
4 總結
符號計算:更像是進行推導證明,結果是很精確的,而且octave輸出很友好
數值計算:得到結果的一個有限小數,當然有些問題只有數值計算才能解決。
如有問題請留言。