octave符號計算及注意事項(和MATLAB還是有些區別的)(上)

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. 符號:可以認爲是在作業本上寫的 x  y  zx\; y \;z,比如常常見到的化簡題目,一直化簡,最後才帶值計算
  2. 變量:在計算過程中是已知的,比如 x=1  y=2x=1\;y=2

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 符號表達式的四則運算

基本的運算就是 +,-,*,/,^
比如兩個多項式乘法,顯示很友好,就像手寫的一樣

x2x+7x^2 - x + 72x2+3x52*x^2 + 3*x - 5相乘

>> 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, 如 a3b3a^3 - b^3

>> 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, 如上 fgf*g

>> expand(f*g)
ans = (sym)

     4    3      2
  2*x  + x  + 6*x  + 26*x - 35

注意:collect在octave中沒有,含義是按某個字母合併同類項

1.2.4 符號表達式化簡

符號表達式化簡simplify, 如化簡 (x2+y2)2+(x2y2)2(x^2+y^2)^2 + (x^2-y^2)^2
注意: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 看一個例子

λ\lambda使得齊次線性方程組有非零解
{(1λ)x12x2+4x3=02x1+(3λ)x2+x3=0x1+x2+(1λ)x3=0\begin{cases} (1-\lambda)x_1-2x_2+4x_3 = 0 \\ 2x_1+(3-\lambda)x_2 + x_3 = 0 \\ x_1 + x_2 + (1-\lambda)x_3 = 0 \end{cases}

>> 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輸出很友好
數值計算:得到結果的一個有限小數,當然有些問題只有數值計算才能解決。

如有問題請留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章