Python科學(xué)計(jì)算與數(shù)據(jù)處理課件_第1頁
Python科學(xué)計(jì)算與數(shù)據(jù)處理課件_第2頁
Python科學(xué)計(jì)算與數(shù)據(jù)處理課件_第3頁
Python科學(xué)計(jì)算與數(shù)據(jù)處理課件_第4頁
Python科學(xué)計(jì)算與數(shù)據(jù)處理課件_第5頁
已閱讀5頁,還剩141頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

SymPy—符號(hào)運(yùn)算庫1PPT課件SymPy—符號(hào)運(yùn)算庫1PPT課件目錄從例子開始?xì)W拉恒等式球體體積數(shù)學(xué)表達(dá)式符號(hào)數(shù)值運(yùn)算符和函數(shù)符號(hào)運(yùn)算表達(dá)式變換和化簡(jiǎn)方程2PPT課件目錄從例子開始2PPT課件目錄微分微分方程積分其他功能3PPT課件目錄微分3PPT課件SymPy是一個(gè)符號(hào)數(shù)學(xué)Python庫。它的目標(biāo)是成為一個(gè)全功能的計(jì)算機(jī)代數(shù)系統(tǒng),同時(shí)保持代碼的精簡(jiǎn)而易于理解和可擴(kuò)展。SymPy完全由Python寫成,不需要任何外部庫。

可用SymPy進(jìn)行數(shù)學(xué)表達(dá)式的符號(hào)推導(dǎo)和演算。可使用isympy運(yùn)行程序,isympy在IPython的基礎(chǔ)上添加了數(shù)學(xué)表達(dá)式的直觀顯示功能。啟動(dòng)時(shí)還會(huì)自動(dòng)運(yùn)行下面的程序:

4PPT課件SymPy是一個(gè)符號(hào)數(shù)學(xué)Python庫。

這段程序首先將Python的除法操作符“/”從整數(shù)除法改為普通除法。然后從SymPy庫載入所有符號(hào),并且定義了四個(gè)通用的數(shù)學(xué)符號(hào)x、y、z

、t,三個(gè)表示整數(shù)的符號(hào)k、m、n,以及三個(gè)表示數(shù)學(xué)函數(shù)的符號(hào)f、g、h。from__future__importdivisionfromsympyimport*x,y,z,t=symbols('x,y,z,t')k,m,n=symbols('k,m,n',integer=True)f,g,h=symbols('f,g,h',cls=Function)#init_printing()

5PPT課件from__future__impo從例子開始?xì)W拉恒等式

此公式被稱為歐拉恒等式,其中e是自然常數(shù),i是虛數(shù)單位,是圓周率。此公式被譽(yù)為數(shù)學(xué)中最奇妙的公式,它將5個(gè)基本數(shù)學(xué)常數(shù)用加法、乘法和冪運(yùn)算聯(lián)系起來。

從SymPy庫載入的符號(hào)中,E表示自然常數(shù),I表示虛數(shù)單位,pi表示圓周率,因此上面的公式可以直接如下計(jì)算:

>>>E**(I*pi)+1?06PPT課件從例子開始?xì)W拉恒等式>>>E**(I*pi)+16PPT課從例子開始SymPy除了可以直接計(jì)算公式的值之外,還可以幫助做數(shù)學(xué)公式的推導(dǎo)和證明。歐拉恒等式可以將

代入下面的歐拉公式得到:

在SymPy中可以使用expand()將表達(dá)式展開,用它展幵

試試看:

沒有成功,只是換了一種寫法而已。當(dāng)expand()的complex參數(shù)為True時(shí),表達(dá)式將被分為實(shí)數(shù)和虛數(shù)兩個(gè)部分:>>>expand(E**(I*x))exp(I*x)??7PPT課件從例子開始SymPy除了可以直接計(jì)算公式從例子開始

這次將表達(dá)式展開了,但是得到的結(jié)果相當(dāng)復(fù)雜。顯然,expand()將x當(dāng)做復(fù)數(shù)了。為了指定x為實(shí)數(shù),需要重新定義x:

終于得到了需要的公式。可以用泰勒多項(xiàng)式對(duì)其進(jìn)行展開:>>>expand(exp(I*x),complex=True)I*exp(-im(x))*sin(re(x))+exp(-im(x))*cos(re(x))?>>>x=Symbol("x",real=True)>>>expand(exp(I*x),complex=True)Isin(x)+cos(x)?8PPT課件從例子開始>>>expand(exp(I從例子開始

series()對(duì)表達(dá)式進(jìn)行泰勒級(jí)數(shù)展開??梢钥吹秸归_之后虛數(shù)項(xiàng)和實(shí)數(shù)項(xiàng)交替出現(xiàn)。根據(jù)歐拉公式,虛數(shù)項(xiàng)的和應(yīng)該等于sin(x)的泰勒展開,而實(shí)數(shù)項(xiàng)的和應(yīng)該等于cos(x)的泰勒展開。>>>tmp=series(exp(I*x),x,0,10)>>>printtmp1+I*x-x**2/2-I*x**3/6+x**4/24+I*x**5/120-x**6/720-I*x**7/5040+x**8/40320+I*x**9/362880+O(x**10)>>>tmp9PPT課件從例子開始>>>tmp=series(exp(I*x),從例子開始

下面獲得tmp的實(shí)部:

下面對(duì)cos(x)進(jìn)行泰勒展開,可看到其中各項(xiàng)和上面的結(jié)果是一致的。>>>re(tmp)x**8/40320-x**6/720+x**4/24-x**2/2+re(O(x**10))+1>>>series(cos(x),x,0,10)1-x**2/2+x**4/24-x**6/720+x**8/40320+O(x**10)10PPT課件從例子開始下面獲得tmp的實(shí)部:>>>re從例子開始

下面獲得tmp的虛部:

下面對(duì)sin(x)進(jìn)行泰勒展開,其中各項(xiàng)也和上面的結(jié)果一致。

由于

展開式的實(shí)部和虛部分別等于cos(x)和sin(x),因此驗(yàn)證了歐拉公式的正確性。>>>im(tmp)x**9/362880-x**7/5040+x**5/120-x**3/6+x+im(O(x**10))>>>series(sin(x),x,0,10)x-x**3/6+x**5/120-x**7/5040+x**9/362880+O(x**10)11PPT課件從例子開始下面獲得tmp的虛部:>>>im(從例子開始球體體積Scipy介紹了如何使用數(shù)值定積分計(jì)算球體的體積,SymPy中的integrate()則可以進(jìn)行符號(hào)積分。用integrate()進(jìn)行不定積分運(yùn)算:

如果指定變量x的取值范圍,integrate()就能進(jìn)行定積分運(yùn)算:>>>integrate(x*sin(x),x)-x*cos(x)+sin(x)>>>integrate(x*sin(x),(x,0,2*pi))-2*pi12PPT課件從例子開始球體體積>>>integrate(x*sin(x從例子開始

為了計(jì)算球體體積,首先看看如何計(jì)算圓的面積,假設(shè)圓的半徑為r,則圓上任意一點(diǎn)的Y坐標(biāo)函數(shù)為:

因此可以直接對(duì)函數(shù)y(x)在-r到r區(qū)間上進(jìn)行定積分得到半圓面積。>>>x,y,r=symbols('x,y,r')>>>f=2*integrate(sqrt(r*r-x**2),(x,-r,r))>>>printf2*Integral(sqrt(r**2-x**2),(x,-r,r))13PPT課件從例子開始為了計(jì)算球體體積,首先看看如何計(jì)從例子開始

首先需要定義運(yùn)算中所需的符號(hào),這里用symbols()一次創(chuàng)建多個(gè)符號(hào)。Integrate()沒有計(jì)算出積分結(jié)果,而是直接返冋了輸入的算式。這是因?yàn)镾ymPy不知道r是大于0的,重新定義r,就可以得到正確答案了:

接下來對(duì)此面積公式進(jìn)行定積分,就可以得到球體的體積,但是隨著X軸坐標(biāo)的變化,對(duì)應(yīng)切面的半徑也會(huì)發(fā)生變化。>>>r=symbols('r',positive=True)>>>circle_area=2*integrate(sqrt(r**2-x**2),(x,-r,r))>>>printcircle_areapi*r**214PPT課件從例子開始首先需要定義運(yùn)算中所需的符號(hào),這從例子開始

假設(shè)X軸的坐標(biāo)為x,球體的半徑為r,那么x處球的切面半徑可以使用前面的公式y(tǒng)(x)計(jì)算出。因此需要對(duì)圓的面積公式circle_area中的變量r進(jìn)行替代:

然后對(duì)circle_area中的變量x在區(qū)間-r到r上進(jìn)行定積分,就可以得到球體的體積公式:>>>circle_area=circle_area.subs(r,sqrt(r**2-x**2))>>>printcircle_areapi*(r**2-x**2)>>>printintegrate(circle_area,(x,-r,r))4*pi*r**3/315PPT課件從例子開始假設(shè)X軸的坐標(biāo)為x,球體的半徑從例子開始

用subs進(jìn)行算式替換:

subs()可以將算式中的符號(hào)進(jìn)行替換,它有3種調(diào)用方式:expression.subs(x,y):將算式中的x替換成y.expression.subs({x:y,u:v}):使用字典進(jìn)行多次替換.expression.subs([(x,y),(u,v)]):使用列表進(jìn)行多次替換.

請(qǐng)注意多次替換是順序執(zhí)行的,因此:expression.subs([(x,y),(y,x)])

并不能對(duì)符號(hào)x和y進(jìn)行交換。16PPT課件從例子開始用subs進(jìn)行算式替換:16PPT課件數(shù)學(xué)表達(dá)式符號(hào)創(chuàng)建一個(gè)符號(hào)使用symbols(),此函數(shù)會(huì)返回一個(gè)Symbol對(duì)象,用于表示符號(hào)變量,其有name屬性,這是符號(hào)名,如:其中左邊的x是一個(gè)符號(hào)對(duì)象,而右邊括號(hào)中用引號(hào)包著的x是符號(hào)對(duì)象的name屬性,兩個(gè)x不要求一樣,但是為了易于理解,通常將符號(hào)對(duì)象和name屬性顯示成一樣,另外name屬性是引號(hào)包起來的。如要同時(shí)配置多個(gè)符號(hào)對(duì)象,symbols()中多個(gè)name屬性可以以>>>

x0=symbols('x0‘)17PPT課件數(shù)學(xué)表達(dá)式符號(hào)>>>

x0=symbols('x0‘)17P數(shù)學(xué)表達(dá)式空格或者逗號(hào)分隔,然后用引號(hào)包住,如下:一次配置三個(gè)符號(hào),由于符號(hào)對(duì)象名和name屬性名經(jīng)常一致,所以可以使用var()函數(shù),如:

這語句和上個(gè)語句功能一致,在當(dāng)前環(huán)境中創(chuàng)建了4個(gè)同名的Symbol對(duì)象(為了防止誤會(huì),使用symbols其實(shí)更好)。

>>>var("x0,y0,x1,y1")(x0,y0,x1,y1)>>>x0,y0,x1,y1=symbols('x0,y0,x1,y1')18PPT課件數(shù)學(xué)表達(dá)式空格或者逗號(hào)分隔,然后用引號(hào)包住,如下:>數(shù)學(xué)表達(dá)式

上面的語句創(chuàng)建了名為x0、y0、x1、y1的4個(gè)Symbol對(duì)象,同時(shí)還在當(dāng)前的環(huán)境中創(chuàng)建了4個(gè)同名的變量來分別表示這4個(gè)Symbol對(duì)象。因?yàn)榉?hào)對(duì)象在轉(zhuǎn)換為字符串時(shí)直接使用它的name屬性,因此在交互式環(huán)境中看到變量,x0的值就是x0,但是査看變量x0的類型時(shí)就可以發(fā)現(xiàn),它實(shí)際上是一個(gè)Symbol對(duì)象。>>>x0x0>>>type(x0)sympy.core.symbol.Symbol>>>'x0'>>>type()str19PPT課件數(shù)學(xué)表達(dá)式上面的語句創(chuàng)建了名為x0、y0、數(shù)學(xué)表達(dá)式

變量名和符號(hào)名當(dāng)然也可以是不一樣的,例如:

數(shù)學(xué)公式中的符號(hào)一般都有特定的假設(shè),例如m、n通常是整數(shù),而z經(jīng)常表示復(fù)數(shù)。在用var()、symbols()或Symbol()創(chuàng)建Symbol對(duì)象時(shí),可以通過關(guān)鍵字參數(shù)指定所創(chuàng)建符號(hào)的假設(shè)條件,這些假設(shè)條件會(huì)影響到它們所參與的計(jì)算。>>>a,b=symbols("alpha,beta")>>>a,b(alpha,beta)20PPT課件數(shù)學(xué)表達(dá)式變量名和符號(hào)名當(dāng)然也可以是不一數(shù)學(xué)表達(dá)式

例如,下面創(chuàng)建了兩個(gè)整數(shù)符號(hào)m和n,以及一個(gè)正數(shù)符號(hào)x:

每個(gè)符號(hào)都有許多is_*屬性,用以判斷符號(hào)的各種假設(shè)條件。在IPython中,使用自動(dòng)完成功能可以快速査看這些假設(shè)的名稱。注意下劃線后為大寫字母的屬性,用來判斷對(duì)象的類型;

而全小寫字母的屬性,則用來判斷符號(hào)的假設(shè)條件。>>>m,n=symbols("m,n",integer=True)>>>x=Symbol("x",positive=True)21PPT課件數(shù)學(xué)表達(dá)式例如,下面創(chuàng)建了兩個(gè)整數(shù)符號(hào)m數(shù)學(xué)表達(dá)式>>>x.is_#按了tab鍵自動(dòng)完成

>>>x.is_Symbol#x是一個(gè)符號(hào)True>>>x.is_positive#x是一個(gè)正數(shù)True>>>x.is_imaginary#因?yàn)閤可以比較大小,所以它不是虛數(shù)False>>>x.is_complex#x是一個(gè)復(fù)數(shù),因?yàn)閺?fù)數(shù)包括實(shí)數(shù),而實(shí)數(shù)包括正數(shù)True

22PPT課件數(shù)學(xué)表達(dá)式>>>x.is_#按了tab鍵自動(dòng)完成22P數(shù)學(xué)表達(dá)式

使用assumptions0屬性可以快速査看所有的假設(shè)條件,其中commutative為True表示此符號(hào)滿足交換律,其余的假設(shè)條件根據(jù)英文名很容易知道它們的含義。

在SymPy中,所有的對(duì)象都從Basic類繼承,實(shí)際上這些is_*屬性和assumptions0屬性都是在Basic類中定義的:>>>x.assumptions0>>>Symbol.mro()23PPT課件數(shù)學(xué)表達(dá)式使用assumptions0數(shù)學(xué)表達(dá)式數(shù)值

為了實(shí)現(xiàn)符號(hào)運(yùn)算,在SymPy內(nèi)部有一整套數(shù)值運(yùn)算系統(tǒng)。因此SymPy的數(shù)值和Python的整數(shù)、浮點(diǎn)數(shù)是完全不同的對(duì)象。為了使用方便,SymPy會(huì)盡量自動(dòng)將Python的數(shù)值類型轉(zhuǎn)換為SymPy的數(shù)值類型。此外,SymPy提供了一個(gè)S對(duì)象用于進(jìn)行這種轉(zhuǎn)換。在下面的例子中,當(dāng)有SymPy的數(shù)值參與計(jì)算時(shí),結(jié)果將是SymPy的數(shù)值對(duì)象。24PPT課件數(shù)學(xué)表達(dá)式數(shù)值24PPT課件數(shù)學(xué)表達(dá)式

“5/6”在SymPy中使用Rational對(duì)象表示,它由兩個(gè)整數(shù)的商表示,數(shù)學(xué)上稱之為有理數(shù)。也可以直接通過Rational創(chuàng)建:>>>1/2+1/3#結(jié)果為浮點(diǎn)數(shù)0.8333333333333333>>>S(1)/2+1/S(3)#結(jié)果為SymPy的數(shù)值對(duì)象5/6>>>Rational(5,10)#有理數(shù)會(huì)自動(dòng)進(jìn)行約分處理1/225PPT課件數(shù)學(xué)表達(dá)式>>>1/2+1/3#結(jié)果為浮點(diǎn)數(shù)>>>數(shù)學(xué)表達(dá)式運(yùn)算符和函數(shù)SymPy重新定義了所有的數(shù)學(xué)運(yùn)算符和數(shù)學(xué)函數(shù)。例如Add類表示加法,Mul類表示乘法,而Pow類表示指數(shù)運(yùn)算,sin類表示正弦函數(shù)。和Symbol對(duì)象一樣,這些運(yùn)算符和函數(shù)都從Basic類繼承,可在IPython中查看它們的繼承列表(例如:Add.mro())??梢允褂眠@些類創(chuàng)建復(fù)雜的表達(dá)式:

>>>var("x,y,z,n")>>>Add(x,y,z)x+y+z>>>Add(Mul(x,y,z),Pow(x,y),sin(z))x*y*z+x**y+sin(z)26PPT課件數(shù)學(xué)表達(dá)式運(yùn)算符和函數(shù)>>>var("x,y,z,n")2數(shù)學(xué)表達(dá)式由于在Basic類中重新定義了__add__()等用于創(chuàng)建表達(dá)式的方法,因此可以使用和Python表達(dá)式相同的方式創(chuàng)建SymPy的表達(dá)式:在Basic類中定義了兩個(gè)很重要的屬性:func和args。func屬性得到對(duì)象的類,而args得到其參數(shù)。使用這兩個(gè)屬性可以觀察SymPy所創(chuàng)建的表達(dá)式。SymPy沒有減法運(yùn)算類,下面看看減法運(yùn)算所得到的表達(dá)式:>>>x*y*z+sin(z)+x**yx*y*z+x**y+sin(z)27PPT課件數(shù)學(xué)表達(dá)式由于在Basic類中重新定義了數(shù)學(xué)表達(dá)式通過上面的例子可以看出,表達(dá)式“x-y”在SymPy中實(shí)際上是用“Add(x,Mul(-1,y))”表示的。同樣,SymPy中沒有除法類,可使用和上面相同的方法觀察“x/y”在SymPy中是如何表示的。>>>t=x-y>>>t.func#減法運(yùn)算用加法類Add表示sympy.core.add.Add>>>t.args#兩個(gè)加數(shù)一個(gè)是x,一個(gè)是-y(x,-y)>>>t.args[1].func#-y是用Mul表示的sympy.core.mul.Mul>>>t.args[1].args(-1,y)28PPT課件數(shù)學(xué)表達(dá)式>>>t=x-y28PPT課件數(shù)學(xué)表達(dá)式

SymPy的表達(dá)式實(shí)際上是一個(gè)由Basic類的各種對(duì)象進(jìn)行多層嵌套所得到的樹狀結(jié)構(gòu)。下面的函數(shù)使用遞歸顯示這種樹狀結(jié)構(gòu):由于fsolve函數(shù)在調(diào)用函數(shù)f時(shí),傳遞的參數(shù)為數(shù)組,因此如果直接使用數(shù)組中的元素計(jì)算的話,計(jì)算速度將會(huì)有所降低,因此這里先用float函數(shù)將數(shù)組中的元素轉(zhuǎn)換為Python中的標(biāo)準(zhǔn)浮點(diǎn)數(shù),然后調(diào)用標(biāo)準(zhǔn)math庫中的函數(shù)進(jìn)行運(yùn)算。

defprint_expression(e,level=0):spaces=""*levelifisinstance(e,(Symbol,Number)):printspaces+str(e)returniflen(e.args)>0:printspaces+e.func.__name__forargine.args:print_expression(arg,level+1)else:printspaces+e.func.__name__29PPT課件數(shù)學(xué)表達(dá)式SymPy的表達(dá)式實(shí)際上是一個(gè)數(shù)學(xué)表達(dá)式例如在SymPy中使用下面的樹表示:由于其中的各個(gè)對(duì)象的args屬性類型是元組,因此表達(dá)式一旦創(chuàng)建就不能再改變。使用不可變的結(jié)構(gòu)表示表達(dá)式有很多優(yōu)點(diǎn),例如可以用表達(dá)式作為字典的鍵。

>>>print_expression(sqrt(x**2+y**2))PowAddPowx2Powy21/230PPT課件數(shù)學(xué)表達(dá)式例如在SymPy中使數(shù)學(xué)表達(dá)式除了使用SymPy中預(yù)先定義好的具有特殊運(yùn)算含義的數(shù)學(xué)函數(shù)之外,還可以使用Function()創(chuàng)建自定義的數(shù)學(xué)函數(shù):請(qǐng)注意Function雖然是一個(gè)類,但是上面的語句所得到的f并不是Function類的實(shí)例。和預(yù)定義的數(shù)學(xué)函數(shù)一樣,f是一個(gè)類,它從Function類繼承:

>>>f=Function("f")>>>f.__base__sympy.core.function.AppliedUndef>>>isinstance(f,Function)False31PPT課件數(shù)學(xué)表達(dá)式除了使用SymPy中預(yù)先定義好數(shù)學(xué)表達(dá)式當(dāng)我使用f創(chuàng)建一個(gè)表達(dá)式時(shí),就相當(dāng)于創(chuàng)建它的一個(gè)實(shí)例:

f的實(shí)例t可以參與表達(dá)式運(yùn)算:>>>t=f(x,y)>>>isinstance(t,Function)True>>>type(t)f>>>t.func#(其中func和args是Basic類的兩個(gè)非常重要的屬性,分別表示對(duì)象的類和對(duì)象的參數(shù))f>>>t.args(x,y)>>>t+t*tf(x,y)**2+f(x,y)32PPT課件數(shù)學(xué)表達(dá)式當(dāng)我使用f創(chuàng)建一個(gè)表達(dá)式時(shí),就相符號(hào)運(yùn)算表達(dá)式變換和化簡(jiǎn)simplify()可以對(duì)數(shù)學(xué)表達(dá)式進(jìn)行化簡(jiǎn),例如:

simplify()調(diào)用SymPy內(nèi)部的多種表達(dá)式變換函數(shù)對(duì)表達(dá)式進(jìn)行化簡(jiǎn)運(yùn)算。但是數(shù)學(xué)表達(dá)式的化簡(jiǎn)是一件非常復(fù)雜的工作,并且對(duì)于同一個(gè)表達(dá)式,根據(jù)其使用目的可以有多種化簡(jiǎn)方案。>>>simplify((x+2)**2-(x+1)**2)2*x+333PPT課件符號(hào)運(yùn)算表達(dá)式變換和化簡(jiǎn)>>>simplify((x+2)符號(hào)運(yùn)算radsimp()對(duì)表達(dá)式的分母進(jìn)行有理化,它所得到的表達(dá)式的分母部分將不含無理數(shù)。例如:

它也可以對(duì)帶符號(hào)的表達(dá)式進(jìn)行處理:>>>radsimp(1/(sqrt(5)+2*sqrt(2)))(-sqrt(5)+2*sqrt(2))/3>>>radsimp(1/(y*sqrt(x)+x*sqrt(y)))(-sqrt(x)*y+x*sqrt(y))/(x*y*(x-y))34PPT課件符號(hào)運(yùn)算radsimp()對(duì)表達(dá)式的分母符號(hào)運(yùn)算

ratsimp()對(duì)表達(dá)式中的分母進(jìn)行通分運(yùn)算,即將表達(dá)式轉(zhuǎn)換為分子除分母的形式:fraction()返回一個(gè)包含表達(dá)式的分子和分母的元組,用它可以獲得ratsimp()通分之后的分

子或分母:

注意fraction()不會(huì)自動(dòng)對(duì)表達(dá)式進(jìn)行通分運(yùn)算,因此:>>>ratsimp(x/(x+y)+y/(x-y))2*y**2/(x**2-y**2)+1>>>fraction(ratsimp(1/x+1/y))(x+y,x*y)>>>fraction(1/x+1/y)(1/y+1/x,1)35PPT課件符號(hào)運(yùn)算ratsimp()對(duì)表達(dá)式中的分符號(hào)運(yùn)算cancel()對(duì)分式表達(dá)式的分子分母進(jìn)行約分運(yùn)算,可以對(duì)純符號(hào)的分式表達(dá)式以及自定義函數(shù)表達(dá)式進(jìn)行約分,但是不能對(duì)內(nèi)部函數(shù)的表達(dá)式進(jìn)行約分。

>>>cancel((x**2-1)/(1+x))x-1>>>cancel(sin((x**2-1)/(1+x)))#cancel不能對(duì)函數(shù)內(nèi)部的表達(dá)式進(jìn)行約分sin(x**2/(x+1)-1/(x+1))>>>cancel((f(x)**2-1)/(f(x)+1))#

#能對(duì)自定義函數(shù)表達(dá)式進(jìn)行約分f(x)-136PPT課件符號(hào)運(yùn)算cancel()對(duì)分式表達(dá)式的分符號(hào)運(yùn)算

trigsimp()對(duì)表達(dá)式中的三角函數(shù)進(jìn)行化簡(jiǎn)。它有兩個(gè)可選參數(shù)--deep和recursive,默認(rèn)

值都為False。當(dāng)deep參數(shù)為True時(shí),將對(duì)表達(dá)式中的所有子表達(dá)式進(jìn)行簡(jiǎn)化運(yùn)算;當(dāng)recursive參數(shù)為True時(shí),將遞歸使用trigsimp()進(jìn)行最大限度的化簡(jiǎn):>>>trigsimp(sin(x)**2+2*sin(x)*cos(x)+cos(x)**2)sin(2*x)+1>>>trigsimp(f(sin(x)**2+2*sin(x)*cos(x)+cos(x)**2))#也能對(duì)自定義函數(shù)中的三角函數(shù)化簡(jiǎn),至今不知道deep和recursive是干嘛的f(sin(2*x)+1)37PPT課件符號(hào)運(yùn)算trigsimp()對(duì)表達(dá)式中的三符號(hào)運(yùn)算expand_trig()可以對(duì)三角函數(shù)的表達(dá)式進(jìn)行展開。它實(shí)際上是對(duì)expand()的封裝,通過將expand()的trig參數(shù)設(shè)置為True,實(shí)現(xiàn)三角函數(shù)的展開計(jì)算。輸入“expand_trig??”來査看它調(diào)用expand()時(shí)的參數(shù)。expand()通用的展開運(yùn)算,根據(jù)用戶設(shè)置的標(biāo)志參數(shù)對(duì)表達(dá)式進(jìn)行展幵。默認(rèn)情況下,以下的標(biāo)志參數(shù)為True。

mul:展開乘法>>>expand_trig(sin(2*x+y))(2*cos(x)**2-1)*sin(y)+2*sin(x)*cos(x)*cos(y)38PPT課件符號(hào)運(yùn)算expand_trig()可以對(duì)符號(hào)運(yùn)算log:展開對(duì)數(shù)函數(shù)參數(shù)中的乘積和冪運(yùn)算multinomial:展開加法式的整數(shù)次冪power_base:展開冪函數(shù)的底數(shù)乘積>>>x,y=symbols("x,y",positive=True)>>>expand(log(x*y**2))log(x)+2*log(y)>>>expand((x+y)**3)x**3+3*x**2*y+3*x*y**2+y**3>>>expand(x**(y+z))x**y*x**z39PPT課件符號(hào)運(yùn)算log:展開對(duì)數(shù)函數(shù)參數(shù)中的乘積和冪運(yùn)算>符號(hào)運(yùn)算

可以將默認(rèn)為True的標(biāo)志參數(shù)設(shè)置為False,強(qiáng)制不展開對(duì)應(yīng)的表達(dá)式。在下面的例子中,將mul設(shè)置為False,因此不對(duì)乘法進(jìn)行展開:expand()的以下標(biāo)志參數(shù)默認(rèn)為Fplex:展開復(fù)數(shù)的實(shí)部和虛部,默認(rèn)不展開復(fù)數(shù)的實(shí)部和虛部:

>>>x,y,z=symbols("x,y,z",positive=True)>>>expand(x*log(y*z),mul=False)x*(log(y)+log(z))>>>x,y=symbols("x,y",complex=True)>>>expand(x*y,complex=True)re(x)*re(y)+I*re(x)*im(y)+I*re(y)*im(x)-im(x)*im(y)40PPT課件符號(hào)運(yùn)算可以將默認(rèn)為True的標(biāo)志參數(shù)設(shè)符號(hào)運(yùn)算

func:對(duì)一些特殊函數(shù)進(jìn)行展開

trig:展開三角函數(shù)expand_log()、expandmul()、expand_complex()、expand_trig()、expand_func()等函數(shù)則通過將相應(yīng)的標(biāo)志參數(shù)設(shè)置為True,對(duì)expand()進(jìn)行封裝。>>>expand(gamma(1+x),func=True)x*gamma(x)>>>expand(sin(x+y),trig=True)sin(x)*cos(y)+sin(y)*cos(x)41PPT課件符號(hào)運(yùn)算func:對(duì)一些特殊函數(shù)進(jìn)行展開>>>符號(hào)運(yùn)算

factor()可以對(duì)多項(xiàng)式表達(dá)式進(jìn)行因式分解:collect()收集表達(dá)式中指定符號(hào)的有理指數(shù)次冪的系數(shù)。例如,希望獲得如下表達(dá)式中x的各次冪的系數(shù):>>>factor(15*x**2+2*y-3*x-10*x*y)(3*x-2*y)*(5*x-1)>>>factor(expand((x+y)**20))(x+y)**20>>>a,b=symbols('a,b')>>>eq=(1+a*x)**3+(1+b*x)**242PPT課件符號(hào)運(yùn)算factor()可以對(duì)多項(xiàng)式表達(dá)符號(hào)運(yùn)算

首先需要對(duì)表達(dá)式eq進(jìn)行展開,得到的表達(dá)式eq2是一系列乘式的和:

然后調(diào)用collect(),對(duì)表達(dá)式eq2中x的冪的系數(shù)進(jìn)行收集:>>>eq2=expand(eq)

>>>eq2a**3*x**3+3*a**2*x**2+3*a*x+b**2*x**2+2*b*x+2>>>collect(eq2,x)a**3*x**3+x**2*(3*a**2+b**2)+x*(3*a+2*b)+243PPT課件符號(hào)運(yùn)算首先需要對(duì)表達(dá)式eq進(jìn)行展開,得符號(hào)運(yùn)算

默認(rèn)情況下,collect()返回的是一個(gè)整理之后的表達(dá)式,如果我們希望得到x的各次冪的系數(shù),可以設(shè)置evaluate參數(shù)為False,讓它返回一個(gè)以x的冪為鍵、值為系數(shù)的字典:

>>>p=collect(eq2,x,evaluate=False)>>>p[S(1)]#常數(shù)項(xiàng),注意需要用SymPy中的數(shù)值1,或者使用p[x**0]2>>>p[x**2]#x的2次項(xiàng)系數(shù)b**2+3*a**2

44PPT課件符號(hào)運(yùn)算默認(rèn)情況下,collect()返符號(hào)運(yùn)算collect()也可以收集表達(dá)式的各次冪的系數(shù),例如下面的程序收集表達(dá)式“sin(2*x)”的系數(shù):>>>collect(a*sin(2*x)+b*sin(2*x),sin(2*x))(a+b)*sin(2*x)

45PPT課件符號(hào)運(yùn)算collect()也可以收集表達(dá)符號(hào)運(yùn)算方程

在SymPy中,表達(dá)式可以直接表示值為0的方程。也可以使用Eq()創(chuàng)建方程。solve()可以對(duì)方程進(jìn)行符號(hào)求解,它的第一個(gè)參數(shù)是表示方程的表達(dá)式,其后的參數(shù)是表示方程中未知變量的符號(hào)。下面的例子使用solve()對(duì)一元二次方程進(jìn)行求解:>>>a,b,c=symbols("a,b,c")>>>solve(a*x**2+b*x+c,x)[(-b+sqrt(-4*a*c+b**2))/(2*a),-(b+sqrt(-4*a*c+b**2))/(2*a)]

46PPT課件符號(hào)運(yùn)算方程>>>a,b,c=symbols("a,b符號(hào)運(yùn)算

使用Eq創(chuàng)建一個(gè)方程對(duì)象并求解:>>>my_eq=Eq(a*x**2+b*x+c,0)>>>solve(my_eq,x)[(-b+sqrt(-4*a*c+b**2))/(2*a),-(b+sqrt(-4*a*c+b**2))/(2*a)]

47PPT課件符號(hào)運(yùn)算

使用Eq創(chuàng)建一個(gè)方程對(duì)象并求解:>>>符號(hào)運(yùn)算

由于方程的解可能有多組,因此solve()返回一個(gè)列表保存所有的解??梢詡鬟f包含多個(gè)表達(dá)式的元組或列表,讓solve()對(duì)方程組進(jìn)行求解,得到的解是兩層嵌套的列表,其中每個(gè)元組表示方程組的一組解:#對(duì)方程組求解(用元組將幾個(gè)方程組成一個(gè)組)>>>solve((x**2+x*y+1,y**2+x*y+2),x,y)[(-sqrt(3)*I/3,-2*sqrt(3)*I/3),(sqrt(3)*I/3,2*sqrt(3)*I/3)]#有兩組解

48PPT課件符號(hào)運(yùn)算由于方程的解可能有多組,因此so符號(hào)運(yùn)算微分Derivative是表示導(dǎo)函數(shù)的類,它的第一個(gè)參數(shù)是需要進(jìn)行求導(dǎo)的數(shù)學(xué)函數(shù),第二個(gè)參數(shù)是求導(dǎo)的自變量.注意Derivative所得到的是一個(gè)導(dǎo)函數(shù),它并不會(huì)進(jìn)行求導(dǎo)運(yùn)算:

如果希望它進(jìn)行實(shí)際的運(yùn)算,計(jì)算出導(dǎo)函數(shù),可以調(diào)用其doit()方法:

>>>t=Derivative(sin(x),x)

#創(chuàng)建了一個(gè)導(dǎo)函數(shù)對(duì)象>>>tDerivative(sin(x),x)>>>t.doit()cos(x)49PPT課件符號(hào)運(yùn)算微分>>>t=Derivative(sin(x符號(hào)運(yùn)算

也可以直接使用diff()函數(shù)或表達(dá)式的diff()方法來計(jì)算導(dǎo)函數(shù):

使用Derivative對(duì)象可以表示自定義的數(shù)學(xué)函數(shù)的導(dǎo)函數(shù),例如:>>>diff(sin(2*x),x)2*cos(2*x)>>>sin(2*x).diff(x)2*cos(2*x)>>>diff(sin(2*x),x,2)-4*sin(2*x)>>>diff(sin(2*x),x,3)-8*cos(2*x)>>>Derivative(f(x),x)Derivative(f(x),x)50PPT課件符號(hào)運(yùn)算也可以直接使用diff()函數(shù)或符號(hào)運(yùn)算

由于SymPy不知道如何對(duì)自定義的數(shù)學(xué)函數(shù)進(jìn)行求導(dǎo),因此它的diff()方法會(huì)返回和上面相同的結(jié)果:

添加更多的符號(hào)參數(shù)可以表示高階導(dǎo)函數(shù),例如:

>>>f(x).diff(x)#方法中的x表示對(duì)x符號(hào)進(jìn)行求導(dǎo)Derivative(f(x),x)>>>Derivative(f(x),x,3)

#表示f(x)對(duì)x求三階導(dǎo)數(shù)(或者偏導(dǎo))Derivative(f(x),x,x,x)#也可以寫作51PPT課件符號(hào)運(yùn)算由于SymPy不知道如何對(duì)自定義符號(hào)運(yùn)算

也可以表示多個(gè)變量的導(dǎo)函數(shù),例如:

diff()求解的格式和Derivative聲明的格式類似,例如下面的語句計(jì)算sin(xy)對(duì)x兩次求導(dǎo)、對(duì)y三次求導(dǎo)的結(jié)果:>>>Derivative(f(x,y),x,2,y,3)

#對(duì)x求二階導(dǎo)且對(duì)y求三階導(dǎo)數(shù)(5階數(shù))Derivative(f(x,y),x,x,y,y,y)>>>diff(sin(x*y),x,2,y,3)x*(x**2*y**2*cos(x*y)+6*x*y*sin(x*y)-6*cos(x*y))52PPT課件符號(hào)運(yùn)算也可以表示多個(gè)變量的導(dǎo)函數(shù),例如:>>>符號(hào)運(yùn)算微分方程dsolve()可以對(duì)微分方程進(jìn)行符號(hào)求解。它的第一個(gè)參數(shù)是一個(gè)帶未知函數(shù)的表達(dá)式,第二個(gè)參數(shù)是需要進(jìn)行求解的未知函數(shù)。例如下面的程序?qū)ξ⒎址匠?/p>

進(jìn)行求解。得到的結(jié)果是一個(gè)自然指數(shù)函數(shù),它有一個(gè)待定系數(shù)c1。

>>>f=Function("f")>>>dsolve(Derivative(f(x),x)-f(x),f(x))f(x)==C1*exp(x)53PPT課件符號(hào)運(yùn)算微分方程>>>f=Function("f")53PP符號(hào)運(yùn)算

用dsolve()解微分方程時(shí)可以傳遞一個(gè)hint參數(shù),指定微分方程的解法。該參數(shù)的默認(rèn)值為“default”,表示由SymPy自動(dòng)挑選解法。可以將hint參數(shù)設(shè)置為“best”,讓dsolve()嘗試所有己知解法,并返回最簡(jiǎn)單的解,例如下面對(duì)微分方程:

進(jìn)行求解。得到的結(jié)果是一個(gè)一般方程,它描述了f(x)和自變量之間的關(guān)系。一般把這種函數(shù)稱為隱函數(shù):54PPT課件符號(hào)運(yùn)算用dsolve()解微分方程時(shí)可符號(hào)運(yùn)算

如果設(shè)置hint參數(shù)為“best”,就能得到更簡(jiǎn)單的顯函數(shù)表達(dá)式:>>>x=symbols("x",real=True)#定義符號(hào)x為實(shí)數(shù)>>>eq1=dsolve(f(x).diff(x)+f(x)**2+f(x),f(x))>>>eq1f(x)==-C1/(C1-exp(x))>>>eq2=dsolve(f(x).diff(x)+f(x)**2+f(x),f(x),hint="best")>>>eq2f(x)==-C1/(C1-exp(x))55PPT課件符號(hào)運(yùn)算>>>x=symbols(符號(hào)運(yùn)算積分integrate()可以計(jì)算定積分和不定積分:integrate(f,x):計(jì)算不定積分integrate(f,(x,a,b)):計(jì)算定積分如果要對(duì)多個(gè)變量計(jì)算多重積分,只需要將被積分的變量依次列出即可:Integrate(f,x,y):計(jì)算雙重不定積分Integrate(f,(x,a,b),(y,c,d)):計(jì)算雙重定積分56PPT課件符號(hào)運(yùn)算積分56PPT課件符號(hào)運(yùn)算

和Derivative對(duì)象表示微分表達(dá)式類似,Integral對(duì)象表示積分表達(dá)式,它的參數(shù)和integrate()類似,例如:

調(diào)用積分對(duì)象的doit()方法可以對(duì)其進(jìn)行求值計(jì)算:>>>e=Integral(x*sin(x),x)>>>eIntegral(x*sin(x),x)>>>e.doit()-x*cos(x)+sin(x))57PPT課件符號(hào)運(yùn)算和Derivative對(duì)象表示微符號(hào)運(yùn)算

有些積分表達(dá)式無法進(jìn)行符號(hào)化簡(jiǎn),這時(shí)可以調(diào)用其evalf()方法或用求值函數(shù)N()對(duì)其進(jìn)行數(shù)值運(yùn)算:

由于無法進(jìn)行符號(hào)定積分,可用evalf()和N()對(duì)其進(jìn)行數(shù)值運(yùn)算:>>>e2=Integral(sin(x)/x,(x,0,1))>>>e2.doit()Si(1)#Si>>>e2.evalf()0.946083070367183>>>N(e2)0.946083070367183>>>N(e2,100)#可以指定精度0.946083070367183014941353313823…58PPT課件符號(hào)運(yùn)算有些積分表達(dá)式無法進(jìn)行符號(hào)化簡(jiǎn),符號(hào)運(yùn)算SymPy的數(shù)值計(jì)算功能還不夠強(qiáng)大,不能對(duì)應(yīng)如下這種情況的無限積分:

將積分上限修改為10000也沒能計(jì)算出近似結(jié)果,上限為1000時(shí)得到了π/2的近似值,不過還遠(yuǎn)遠(yuǎn)不夠精確:

>>>N(Integral(sin(x)/x,(x,0,oo)))#oo表示正無窮-0.e+0>>>N(Integral(sin(x)/x,(x,0,10000)))0.e+0>>>N(Integral(sin(x)/x,(x,0,1000)))1.5702331219687759PPT課件符號(hào)運(yùn)算SymPy的數(shù)值計(jì)算功能還不夠強(qiáng)符號(hào)運(yùn)算as_sum()方法可以將定積分轉(zhuǎn)換為近似求和公式,它將積分區(qū)域分割成n個(gè)小矩形的面積之和:>>>e=Integral(sin(x)/x,(x,0,1))>>>e.as_sum(5)2*sin(9/10)/9+2*sin(7/10)/7+2*sin(1/2)/5+2*sin(3/10)/3+2*sin(1/10)>>>N(e.as_sum(5))0.94658536278040860PPT課件符號(hào)運(yùn)算as_sum()方法可以將定積分其他功能用SymPy做計(jì)算器SymPy有三種內(nèi)建的數(shù)值類型:浮點(diǎn)數(shù)、有理數(shù)和整數(shù)。有理數(shù)類用一對(duì)整數(shù)表示一個(gè)有理數(shù):分子和分母,所以Rational(1,2)代表1/2,Rational(5,2)代表5/2等等。有些特殊的常數(shù),像e和pi,它們被視為符號(hào)(1+pi將不被數(shù)值求解,它將保持為1+pi),并且可以有任意精度:>>>pi**2pi**261PPT課件其他功能用SymPy做計(jì)算器>>>pi**261PPT課件其他功能

evalf將表達(dá)式求解為浮點(diǎn)數(shù)。這還有一個(gè)類表示數(shù)學(xué)上的無限,叫作oo:>>>pi.evalf()3.14159265358979>>>(pi+exp(1)).evalf(50)5.8598744820488384738229308546321653819544164930751>>>oo>99999True>>>oo+10000oo62PPT課件其他功能>>>pi.evalf()其他功能極限極限在sympy中使用很簡(jiǎn)單,它們的語法是limit(function,variable,point),所以計(jì)算當(dāng)x趨近于0時(shí)f(x)的極限,可以給出limit(f,x,0):也可以計(jì)算在無窮的極限:>>>fromsympyimport*>>>x=Symbol("x")>>>limit(sin(x)/x,x,0)1>>>limit(sin(x)/x,x,oo)063PPT課件其他功能極限>>>fromsympyimport*其他功能級(jí)數(shù)展開使用.series(var,point,order):>>>(1/cos(x)).series(x,0,10)1+x**2/2+5*x**4/24+61*x**6/720+277*x**8/8064+O(x**10)>>>e=1/(x+y)>>>s=e.series(x,0,5)>>>print(s)1/y-x/y**2+x**2/y**3-x**3/y**4+x**4/y**5+O(x**5)>>>pprint(s)2341xxxx?5?─-──+──-──+──+O?x?y2345yyyy64PPT課件其他功能級(jí)數(shù)展開>>>(1/cos(x)).series(其他功能求和計(jì)算給定求和變量界限的f的總和(Summation)summation(f,(i,a,b))變量i從a到b計(jì)算f的和.如果不能計(jì)算總和,它將打印相應(yīng)的求和公式。求值可引入額外的極限計(jì)算:>>>fromsympyimportsummation,oo,symbols,log>>>i,n,m=symbols('inm',integer=True)>>>summation(2*i-1,(i,1,n))n**2>>>summation(1/2**i,(i,0,oo))265PPT課件其他功能求和>>>fromsympyimportsum其他功能

>>>summation(1/log(n)**n,(n,2,oo))Sum(log(n)**(-n),(n,2,oo))>>>summation(i,(i,0,n),(n,0,m))m**3/6+m**2/2+m/3>>>summation(i,(i,0,n))n**2/2+n/2>>>summation(n**2/2+n/2,(n,0,m))m**3/6+m**2/2+m/3>>>fromsympy.abcimportx>>>fromsympyimportfactorial>>>summation(x**n/factorial(n),(n,0,oo))exp(x)

66PPT課件其他功能 >>>summation(1/log(n)**n其他功能矩陣矩陣從Matrix類創(chuàng)建,它可以包含符號(hào):>>>x=Symbol('x')>>>y=Symbol('y')>>>A=Matrix([[1,x],[y,1]])>>>AMatrix([[1,x],[y,1]])>>>A**2Matrix([[x*y+1,2*x],[2*y,x*y+1]])67PPT課件其他功能矩陣>>>x=Symbol('x')67PP其他功能模式匹配使用.match()方法,和Wild類對(duì)表達(dá)式實(shí)行模式匹配。這個(gè)方法將返回一個(gè)發(fā)生替換的字典,如下:>>>fromsympyimportSymbol,Wild>>>x=Symbol('x')>>>p=Wild('p')>>>(5*x**2).match(p*x**2){p_:5}>>>q=Wild('q')>>>(x**2).match(p*x**q){q_:2,p_:1}68PPT課件其他功能模式匹配>>>fromsympyimport其他功能如果匹配失敗,將返回None:可以指定Wild類的排除參數(shù)去保證一些東西不出現(xiàn)在結(jié)果之中:>>>print(x+1).match(p**x)None>>>p=Wild('p',exclude=[1,x])>>>print(x+1).match(x+p)#1isexcludedNone>>>print(x+1).match(p+1)#xisexcludedNone>>>print(x+1).match(x+2+p)#-1isnotexcluded{p_:-1}69PPT課件其他功能如果匹配失敗,將返回None:>>其他功能Numpy.geometry平面幾何模塊這個(gè)模塊可以創(chuàng)建二維幾何圖形的對(duì)象,如直線,線段,圓等,并計(jì)算這些對(duì)象的各種信息,例如橢圓的面積,判斷一組點(diǎn)是否共線,或者求兩條直線的交點(diǎn)等等。下面有幾個(gè)簡(jiǎn)單的例子:#創(chuàng)建了3個(gè)表示平面上的點(diǎn)的對(duì)象>>>A=Point(0,0)>>>B=Point(5,0)>>>C=Point(3,2)#用上面創(chuàng)建的三個(gè)點(diǎn)當(dāng)三角形的頂點(diǎn),創(chuàng)建了一個(gè)表示三角形的對(duì)象t>>>t=Triangle(A,B,C)70PPT課件其他功能Numpy.geometry平面幾何模塊#創(chuàng)建了3個(gè)其他功能s

#三角形對(duì)象的incenter屬性用于獲取其內(nèi)心(內(nèi)切圓的圓心)>>>D=t.incenter>>>DPoint(5*(3+sqrt(13))/(2*sqrt(2)+sqrt(13)+5),10/(2*sqrt(2)+sqrt(13)+5))#利用Circle()創(chuàng)建了經(jīng)過C,D,B三個(gè)點(diǎn)的圓,另外Circle()也可以通過制定圓心和半徑來創(chuàng)建一個(gè)圓。還有要注意的是circle()返回的對(duì)象是一個(gè)類似元組對(duì)象,所以引用這個(gè)對(duì)象的時(shí)候要使用引用元組的方法>>>p=Circle(C,D,B)>>>

i=Segment(*ersection(Line(A,B)))

#首先用Line()創(chuàng)建了一個(gè)直線對(duì)象,類似的無限的直線對(duì)象;利用圓的intersection()方法,可以計(jì)算出圓與直線的兩個(gè)交點(diǎn);最后使用Segment()將傳入的這個(gè)交點(diǎn)生成一個(gè)弦對(duì)象(弦對(duì)象是一種有長(zhǎng)度的線段)71PPT課件其他功能

#三角形對(duì)象的incenter屬性用于獲取其內(nèi)心(其他功能

使用這些平面幾何模塊計(jì)算實(shí)在是太慢了!作圖??#利用弦對(duì)象的length屬性獲取其長(zhǎng)度(表示方法復(fù)雜),然后用evalf()方法計(jì)算出。>>>i.length.evalf()1.39444872453601>>>j=Segment(*ersection(Line(A,C)))>>>j.length.evalf()1.3944487245360172PPT課件其他功能#利用弦對(duì)象的length屬性獲取其長(zhǎng)度(表示方法復(fù)73PPT課件73PPT課件SymPy—符號(hào)運(yùn)算庫74PPT課件SymPy—符號(hào)運(yùn)算庫1PPT課件目錄從例子開始?xì)W拉恒等式球體體積數(shù)學(xué)表達(dá)式符號(hào)數(shù)值運(yùn)算符和函數(shù)符號(hào)運(yùn)算表達(dá)式變換和化簡(jiǎn)方程75PPT課件目錄從例子開始2PPT課件目錄微分微分方程積分其他功能76PPT課件目錄微分3PPT課件SymPy是一個(gè)符號(hào)數(shù)學(xué)Python庫。它的目標(biāo)是成為一個(gè)全功能的計(jì)算機(jī)代數(shù)系統(tǒng),同時(shí)保持代碼的精簡(jiǎn)而易于理解和可擴(kuò)展。SymPy完全由Python寫成,不需要任何外部庫。

可用SymPy進(jìn)行數(shù)學(xué)表達(dá)式的符號(hào)推導(dǎo)和演算??墒褂胕sympy運(yùn)行程序,isympy在IPython的基礎(chǔ)上添加了數(shù)學(xué)表達(dá)式的直觀顯示功能。啟動(dòng)時(shí)還會(huì)自動(dòng)運(yùn)行下面的程序:

77PPT課件SymPy是一個(gè)符號(hào)數(shù)學(xué)Python庫。

這段程序首先將Python的除法操作符“/”從整數(shù)除法改為普通除法。然后從SymPy庫載入所有符號(hào),并且定義了四個(gè)通用的數(shù)學(xué)符號(hào)x、y、z

、t,三個(gè)表示整數(shù)的符號(hào)k、m、n,以及三個(gè)表示數(shù)學(xué)函數(shù)的符號(hào)f、g、h。from__future__importdivisionfromsympyimport*x,y,z,t=symbols('x,y,z,t')k,m,n=symbols('k,m,n',integer=True)f,g,h=symbols('f,g,h',cls=Function)#init_printing()

78PPT課件from__future__impo從例子開始?xì)W拉恒等式

此公式被稱為歐拉恒等式,其中e是自然常數(shù),i是虛數(shù)單位,是圓周率。此公式被譽(yù)為數(shù)學(xué)中最奇妙的公式,它將5個(gè)基本數(shù)學(xué)常數(shù)用加法、乘法和冪運(yùn)算聯(lián)系起來。

從SymPy庫載入的符號(hào)中,E表示自然常數(shù),I表示虛數(shù)單位,pi表示圓周率,因此上面的公式可以直接如下計(jì)算:

>>>E**(I*pi)+1?079PPT課件從例子開始?xì)W拉恒等式>>>E**(I*pi)+16PPT課從例子開始SymPy除了可以直接計(jì)算公式的值之外,還可以幫助做數(shù)學(xué)公式的推導(dǎo)和證明。歐拉恒等式可以將

代入下面的歐拉公式得到:

在SymPy中可以使用expand()將表達(dá)式展開,用它展幵

試試看:

沒有成功,只是換了一種寫法而已。當(dāng)expand()的complex參數(shù)為True時(shí),表達(dá)式將被分為實(shí)數(shù)和虛數(shù)兩個(gè)部分:>>>expand(E**(I*x))exp(I*x)??80PPT課件從例子開始SymPy除了可以直接計(jì)算公式從例子開始

這次將表達(dá)式展開了,但是得到的結(jié)果相當(dāng)復(fù)雜。顯然,expand()將x當(dāng)做復(fù)數(shù)了。為了指定x為實(shí)數(shù),需要重新定義x:

終于得到了需要的公式??梢杂锰├斩囗?xiàng)式對(duì)其進(jìn)行展開:>>>expand(exp(I*x),complex=True)I*exp(-im(x))*sin(re(x))+exp(-im(x))*cos(re(x))?>>>x=Symbol("x",real=True)>>>expand(exp(I*x),complex=True)Isin(x)+cos(x)?81PPT課件從例子開始>>>expand(exp(I從例子開始

series()對(duì)表達(dá)式進(jìn)行泰勒級(jí)數(shù)展開??梢钥吹秸归_之后虛數(shù)項(xiàng)和實(shí)數(shù)項(xiàng)交替出現(xiàn)。根據(jù)歐拉公式,虛數(shù)項(xiàng)的和應(yīng)該等于sin(x)的泰勒展開,而實(shí)數(shù)項(xiàng)的和應(yīng)該等于cos(x)的泰勒展開。>>>tmp=series(exp(I*x),x,0,10)>>>printtmp1+I*x-x**2/2-I*x**3/6+x**4/24+I*x**5/120-x**6/720-I*x**7/5040+x**8/40320+I*x**9/362880+O(x**10)>>>tmp82PPT課件從例子開始>>>tmp=series(exp(I*x),從例子開始

下面獲得tmp的實(shí)部:

下面對(duì)cos(x)進(jìn)行泰勒展開,可看到其中各項(xiàng)和上面的結(jié)果是一致的。>>>re(tmp)x**8/40320-x**6/720+x**4/24-x**2/2+re(O(x**10))+1>>>series(cos(x),x,0,10)1-x**2/2+x**4/24-x**6/720+x**8/40320+O(x**10)83PPT課件從例子開始下面獲得tmp的實(shí)部:>>>re從例子開始

下面獲得tmp的虛部:

下面對(duì)sin(x)進(jìn)行泰勒展開,其中各項(xiàng)也和上面的結(jié)果一致。

由于

展開式的實(shí)部和虛部分別等于cos(x)和sin(x),因此驗(yàn)證了歐拉公式的正確性。>>>im(tmp)x**9/362880-x**7/5040+x**5/120-x**3/6+x+im(O(x**10))>>>series(sin(x),x,0,10)x-x**3/6+x**5/120-x**7/5040+x**9/362880+O(x**10)84PPT課件從例子開始下面獲得tmp的虛部:>>>im(從例子開始球體體積Scipy介紹了如何使用數(shù)值定積分計(jì)算球體的體積,SymPy中的integrate()則可以進(jìn)行符號(hào)積分。用integrate()進(jìn)行不定積分運(yùn)算:

如果指定變量x的取值范圍,integrate()就能進(jìn)行定積分運(yùn)算:>>>integrate(x*sin(x),x)-x*cos(x)+sin(x)>>>integrate(x*sin(x),(x,0,2*pi))-2*pi85PPT課件從例子開始球體體積>>>integrate(x*sin(x從例子開始

為了計(jì)算球體體積,首先看看如何計(jì)算圓的面積,假設(shè)圓的半徑為r,則圓上任意一點(diǎn)的Y坐標(biāo)函數(shù)為:

因此可以直接對(duì)函數(shù)y(x)在-r到r區(qū)間上進(jìn)行定積分得到半圓面積。>>>x,y,r=symbols('x,y,r')>>>f=2*integrate(sqrt(r*r-x**2),(x,-r,r))>>>printf2*Integral(sqrt(r**2-x**2),(x,-r,r))86PPT課件從例子開始為了計(jì)算球體體積,首先看看如何計(jì)從例子開始

首先需要定義運(yùn)算中所需的符號(hào),這里用symbols()一次創(chuàng)建多個(gè)符號(hào)。Integrate()沒有計(jì)算出積分結(jié)果,而是直接返冋了輸入的算式。這是因?yàn)镾ymPy不知道r是大于0的,重新定義r,就可以得到正確答案了:

接下來對(duì)此面積公式進(jìn)行定積分,就可以得到球體的體積,但是隨著X軸坐標(biāo)的變化,對(duì)應(yīng)切面的半徑也會(huì)發(fā)生變化。>>>r=symbols('r',positive=True)>>>circle_area=2*integrate(sqrt(r**2-x**2),(x,-r,r))>>>printcircle_areapi*r**287PPT課件從例子開始首先需要定義運(yùn)算中所需的符號(hào),這從例子開始

假設(shè)X軸的坐標(biāo)為x,球體的半徑為r,那么x處球的切面半徑可以使用前面的公式y(tǒng)(x)計(jì)算出。因此需要對(duì)圓的面積公式circle_area中的變量r進(jìn)行替代:

然后對(duì)circle_area中的變量x在區(qū)間-r到r上進(jìn)行定積分,就可以得到球體的體積公式:>>>circle_area=circle_area.subs(r,sqrt(r**2-x**2))>>>printcircle_areapi*(r**2-x**2)>>>printintegrate(circle_area,(x,-r,r))4*pi*r**3/388PPT課件從例子開始假設(shè)X軸的坐標(biāo)為x,球體的半徑從例子開始

用subs進(jìn)行算式替換:

subs()可以將算式中的符號(hào)進(jìn)行替換,它有3種調(diào)用方式:expression.subs(x,y):將算式中的x替換成y.expression.subs({x:y,u:v}):使用字典進(jìn)行多次替換.expression.subs([(x,y),(u,v)]):使用列表進(jìn)行多次替換.

請(qǐng)注意多次替換是順序執(zhí)行的,因此:expression.subs([(x,y),(y,x)])

并不能對(duì)符號(hào)x和y進(jìn)行交換。89PPT課件從例子開始用subs進(jìn)行算式替換:16PPT課件數(shù)學(xué)表達(dá)式符號(hào)創(chuàng)建一個(gè)符號(hào)使用symbols(),此函數(shù)會(huì)返回一個(gè)Symbol對(duì)象,用于表示符號(hào)變量,其有name屬性,這是符號(hào)名,如:其中左邊的x是一個(gè)符號(hào)對(duì)象,而右邊括號(hào)中用引號(hào)包著的x是符號(hào)對(duì)象的name屬性,兩個(gè)x不要求一樣,但是為了易于理解,通常將符號(hào)對(duì)象和name屬性顯示成一樣,另外name屬性是引號(hào)包起來的。如要同時(shí)配置多個(gè)符號(hào)對(duì)象,symbols()中多個(gè)name屬性可以以>>>

x0=symbols('x0‘)90PPT課件數(shù)學(xué)表達(dá)式符號(hào)>>>

x0=symbols('x0‘)17P數(shù)學(xué)表達(dá)式空格或者逗號(hào)分隔,然后用引號(hào)包住,如下:一次配置三個(gè)符號(hào),由于符號(hào)對(duì)象名和name屬性名經(jīng)常一致,所以可以使用var()函數(shù),如:

這語句和上個(gè)語句功能一致,在當(dāng)前環(huán)境中創(chuàng)建了4個(gè)同名的Symbol對(duì)象(為了防止誤會(huì),使用symbols其實(shí)更好)。

>>>var("x0,y0,x1,y1")(x0,y0,x1,y1)>>>x0,y0,x1,y1=symbols('x0,y0,x1,y1')91PPT課件數(shù)學(xué)表達(dá)式空格或者逗號(hào)分隔,然后用引號(hào)包住,如下:>數(shù)學(xué)表達(dá)式

上面的語句創(chuàng)建了名為x0、y0、x1、y1的4個(gè)Symbol對(duì)象,同時(shí)還在當(dāng)前的環(huán)境中創(chuàng)建了4個(gè)同名的變量來分別表示這4個(gè)Symbol對(duì)象。因?yàn)榉?hào)對(duì)象在轉(zhuǎn)換為字符串時(shí)直接使用它的name屬性,因此在交互式環(huán)境中看到變量,x0的值

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論