Matlab中的符號計算
儘管本人認為Matlab是一個優秀的數值計算軟體,不應該拿它來做符號計算,然而客觀上Matlab確實有符號工具箱且有很多人使用。因此這裡也整理了一點關於符號計算的認識。下面的說法或程式在Matlab 2013b下是成立的。更早版本的符號工具箱有一些差別。
1. 定義符號變數
syms x y
用syms命令可以一句話定義多個符號變數。還可以定義符號函式:
syms y(x1, x2)
2. 符號變數參與的計算與符號表達式求值
凡是有符號變數參加的計算,結果也是符號變數。例如:
a = 1.0;
syms b
c = a*b;
class(c)
結果顯示變數c的型別是sym。
如果現在我又想給b賦值以得到一個具體的c,用subs:
cc = subs(c, b, 1.0) % 相當於“取b=1.0,代入c式中,得:”
結果顯示cc是一個值為1的符號變數。那麼如何將其轉換成一個數值變數呢?
ccc = double(cc)
很簡單,一個double函式就可以把cc轉換成double型別了。
哈哈,有了這個技能,再也不怕先化簡後求值的數學題啦(⊙﹏⊙b汗)
3. 限定符號變數取值範圍
數學中經常會有設x(x>0)這種操作,符號計算裡可以用assume函式給變數加限制:
syms x a
assume(a ~= -1)
int(x^a, x)
結果為:
x^(a + 1)/(a + 1)
你看,Matlab就不會再去討論a=-1的情形了。適當使用asuume應該是可以簡化計算的。
4. 解方程(組)
儘管用數值方法就完全可以求解方程,但是似乎數學上的習慣不符,讓人感覺彆扭。用符號計算就比較自然了。而且數值方法也無法處理含有符號引數的情形。
這是一個求解普通一元二次方程的例子:
syms x
[solutions_x] = solve(x^2-3*x+2==0)
結果為:
solutions_x =
1
2
可見兩個解都得到了。solutions_x是個符號變數,怎麼轉換成數值呢?還是用double。
val_x = double(solutions_x)
val_x =
1
2
得到的val_x是一個2*1的double矩陣。
這是一個求解含參多元方程組的例子,其中既有符號引數又有數值引數:
c = 1.0
syms a b x y
[solutions_x, solutions_y] = solve(x + y == b+c, x - y == a-c, x, y)
結果為:
solutions_x = a/2 + b/2
solutions_y = b/2 - a/2 + 1
如果實際中的方程太複雜,都寫在括號裡很難看;或者方程也是一個符號表達式而不能直接寫出,可以這樣:
f1 = x + y == b+c;
f2 = x - y == a-c;
[solutions_x, solutions_y] = solve(f1, f2, x, y)
結果和上面一樣。只要f1,f2,……都是含有==的符號邏輯表示式就可以了。
5 解微分方程(組)
解微分方程組就不是求解符號變數,而是符號函數了。表示導數要用diff函式,舉例如下:
syms y(x)
f_y = dsolve(diff(y, 2) == x*y) % 其中diff(y, 2)表示y(對x的)的二階導數
這裡還可以用字串形式的符號表達式,寫起來更加簡便、符合人的習慣。一個例項:
syms k
assume(k>0)
X = dsolve('D2X+k*X=0','x') % 其中D是微分號,D2表示二階導數
結果:
X =
C11*cos(k^(1/2)*t) + C12*sin(k^(1/2)*t)
這裡由於未指明函式x的自變數符號,因此採用預設的t。