20多條總結學完SymPy庫

SymPy庫

Sympy是一個數學符號庫,包括了積分,微分方程等各種數學運算方法,爲python提供了強大的數學運算支持。對於圖像來說,雖然都是做離散的計算,操作最多的還是numpy裏的數組,但實際上,這個庫包含了積分微分,三角等最基本的數學運算,可以說是工科最基本的,用起來媲美matlab。

主要函數和用法:

1.sympy裏未知數變量需要像matlab一樣做一個額外的定義:x=symbols(“x”)

如果x爲實數需要symbol(“x”,real=True),定義正數需要positive=True

2.Expnd(fomat,param2)函數可以幫助我們展開式子。比如把e的i和pi次準換成歐拉公式形式。但是注意其第二個參數是確定他輸入式子中的未知數是實數還是虛數,這回影響展開結果。輸入complex=True就會把結果分爲實數和虛數兩個部分。

3.泰勒公式”:series(式子,未知數名,在那個點展開,展開幾項)

4.re()取出一個數的實數部分

5.不定積分:Integrate(式子,對什麼未知數積分)。做定積分:Integrate(式子,(未知數名,下限,上限)

6.**表示平方sqrt()表示根號。

7.在sympy中,式子用等號賦給了一個變量,這並不是簡單的賦值,事實上在這個庫當中,每一個式子賦給變量相當於創建了一個關於式子的一個對象。你可以用點操作操作出裏面大量的函數的

8.包括了.sub(原變量,新變量)替換函數。但是這是順序交換的,sub([(x,y),(y,x)])不能交換xy變量

7..diff(未知數,幾階導數)函數求導。調用.doit()求得最終結果式子 。

8.可以用as_finite_diff()函數求離散的h,2h,3h。。。。的導數。

11.Lambdify([未知數],式子變量,數據形式)可以把一個式子用確切的數值計算出來。數據形式可以是numpy的,需要對最後一個參數的modules=”numpy”

12.式子類創建的式子對象中args屬性保存了所有的加法項Var()函數可以快速創建未知數,創建的都是symbol對象。值得注意的是,在sympy中,是存在大寫開頭的Symbol()和小寫開頭的symbol(),前者是一個類,創建Symbol對象。後者是一個操作函數,功能和結果一樣,只是實現方法上是有區別的。還有一點尤爲重要,x變量symbol和傳統意義上的變量是不同的。他不接受賦值,不能x0=5。爲了表達方便纔是用了x0.name=x0,使他得到了一個x0的變量名,而並不是說他是一個傳統意義上的變量x0。另外,x0的值就是x0。最後一點很重要,變量名是我們最後看這玩意在寫代碼時候的名字,符號名是他點name屬性裏存着的真實名字。比如一個人在外面外號叫老張,但其實真名是張三。無論你在編譯器裏是怎麼給他變成別的外號了,最終運行結果都會顯示最真實的名字。(PS:這個設計初衷可能是好的,但是儘量還是不要去碰觸這個會產生歧義和誤導的東西。)

13.在python中是int這個類定義出來的123,456,這些整型的對象。但是這些對象在sympy中是不存在的,他獨立提供了一套sympy.core.number.Rational類來做。可以直接用Rational(5,10)做一個Rational對象1/2,也可以直接用S函數來做,得到的也是一樣的。在sympy中似乎都對這些類有了操作函數,但是我們還是可以通過這些類來直觀的創建。相類似,浮點型用N()和Float(數字,有效數學)來做。

14.Add()連加,Mul()連乘,Pow(x,y)指數即x的y次,這些都是繼承於Basic類的。

15.用點args得到所有參數,func()可以得到整個式子屬於什麼類或者單個屬於什麼類。並可以通過點args[n].args查看最具體的那一個變量,可見一個式子內部是由list存儲的,這裏不能說是字符型,但我猜測如此。

16.dotprint()可以查看樹形的式子組成,書p370圖6-2

17.構造抽象函數Function(),直接用f=Function(“f”),注意有一點,在python之中和C中的不同之處,c的創建對象實例有點像定義一個變量,和函數調用是不一樣的,所以發現奇奇怪怪的比如student zhangsan;我們就知道這肯定是創建zhangsan這個對象。而python的是和函數的一樣的,所以注意分辨。再要注意的是,這個Function創建的是類而不是對象實例。也就是說f是一個繼承下來的類。還需要用t=f(x,y)去創建函數t這個對象。最終我們才能得到t這個抽象函數。抽象函數的作用就不多說了。非常有用。

18.通配符:通配符可以查找出可以與模板相匹配的項目,比如查找出一個wild(“a”)還有b後就可以%sympy_latex(3*x*(x+y)**2).match(a*b**2)最終得到和末班a*b**2匹配的a和b,分別爲,剩下find()在樹狀圖裏找,replace()可以替換。至於%文本顯示是爲了方便看,這句魔法指令詳解可以看p371的解釋,不必太在意,這種會用就行。

19.simplify()可以把一個式子化簡到最簡的狀態,這裏還有許多根據目的化成假分數啊,等等,包括cancel等函數,但是用到查官方文檔纔是正解。

20.解方程:可以直接表示值爲0的方程,也可以用Eq()去創建,返回的理論上也是一個對象實例。但是正常情況下不需要這麼去做,直接使用solve(式子)就可以得到最終的結果。有些是單個未知數的就會是[解1,。。。解n]形式多個組合的就會使[(x0,y0).....(xn,yn)]

21.解微分方程:用dsolve(式子,要求的f(x))就可以直接得到f(x)。

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