用Python幫你進行代數運算 : Sympy

最近因為接到的Case,滿腦子中都是線性代數的東西,程式中有太多東西需要計算,以前學過的東西全都從腦子裡挖了出來,不過我通常都不背公式的,我所做的都是將當時走過的思路再走過一次,把公式重新導出來,因為公式是一個點,忘記就沒了,而思路是一條線,只要抓到了就可以得到同樣的結果

我還記得有一次,在PTT站上問一個微積分的式子是怎麼來的,因為我在書上看到他經過一個很奇怪的上下乘某個三角函數,式子就莫名奇妙的跑出來了,有個台大的學生很不以為然的回答,就是上下相乘那三角函數阿,當時讓我覺得挺無言的,這我當然也知道,看書也知道,問題是在於,如果沒有書跟你講,你是怎樣能想到這神來一筆,知道要上下乘這個函數? 所以公式的結果從來都不是重點,重點在於思路,只死記公式最後都會忘光光,但是能夠思考而走到公式這一步的話,就好像走過一條路,找到片段,又能找到終點,死記公式,就好像把你丟到一個定點,要你記住那裡長什麼樣子,一個是點,一個是一條路,當然是思路記得比較好

這種想法讓我到了應用時通常都能用上我所學到的,因為我知道那些東西從哪裡來的,即使忘記了也可以再導出來,但同時有些時候也讓我吃足了苦頭,還記得有一次考物理時,前面半節課我在導公式,後面半節用導出來的公式算,下場當然很慘,其實很多時候公式寫到一個地方,剩的就只剩整理,但是這過程卻很煩人、機械化,很容易一個正負號,一個看走眼就會讓後面的過程全部跟著錯掉,所以不得不在過程中每個符號小心的重寫一次,長久以來我一直在想,即使是整理也是有規則的,為什麼不能用電腦來算呢? 雖然我知道有matlab這類的東西,畢竟沒時間學,領域也不太一樣,不合胃口,直到前陣子在PTT的Python版上看見有人推薦一款Python的library : Sympy,他是一款Python寫的代數運算函式庫,舉個例子你寫出了一個式子,想知道它的導函數是什麼,你只要先將式子列出來,再用一個函數呼叫,他就可以把導函數算出來,這非常地合我喜好,我們現在就來介紹如何使用Sympy來幫你計算兩線在平面交一點的公式

兩線交一點

首先我們在平面上有P1和P2兩點,而從P1出發的是u向量,從P2出發的是v向量,我們想得知這兩條線在哪裡會交一點,就必須這麼算,我們設t和s為實數,我們可以找到一個等式P1 + su = P2 + tv,也就是P1以u的速度走s秒(秒只是幫助想像的假設),P2以v的速度走t秒,兩人會撞在一起,要導公式就要先找等式,這就是我們公式的等式,一開始我不知道是程式寫太多還怎樣,突然有點腦殘的想說,奇怪,這式子有兩個未知數s和t,一條式子算不出兩個未知數阿? 後來才突然想到,我忘了這是平面,所以在x分量和y分量上面我們各有一條這樣的等式,有了兩條等式,兩個未知數才可能有解

f1

f2

有了等式之後,嘿嘿,就是該交給電腦的時候了

from sympy import *

p1x = Symbol('p1x')
p1y = Symbol('p1y')

p2x = Symbol('p2x')
p2y = Symbol('p2y')

ux = Symbol('ux')
uy = Symbol('uy')

vx = Symbol('vx')
vy = Symbol('vy')

s = Symbol('s')
t = Symbol('t')

fx = p1x - p2x + s*ux - t*vx
fy = p1y - p2y + s*uy - t*vy

sol = solve((fx, fy), s, t)

print 's:'
pprint(sol[s])

print 't:'
pprint(sol[t])

就是這樣簡單直覺,你可以先去吃個飯等他算完嗎? 不,連屁股都還沒挪開椅子就算完了

formula

最後

附上一張用小畫家手導公式的惡心算式圖,高下立判,我當時算出了t,正想說要把t代回公式裡算出s時就頓時覺得頭皮發麻,好煩喔,於是就找了sympy來試用,果然一眨眼的功夫,我式子列完了,公式也算完了,就是這樣!

scribble_formula

This entry was posted in Python, 中文文章 and tagged , , , , , , . Bookmark the permalink.

One Response to 用Python幫你進行代數運算 : Sympy

  1. Zoom.Quiet says:

    赞!和 用Python做科学计算 — 用Python做科学计算
    http://hyry.dip.jp/pydoc/index.html
    相互辉印哪!