1. 程式人生 > >Matlab中的符號計算

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。