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

下載本文檔

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

文檔簡介

SymPy—符號(hào)運(yùn)算庫1目錄從例子開始?xì)W拉恒等式球體體積數(shù)學(xué)表達(dá)式符號(hào)數(shù)值運(yùn)算符和函數(shù)符號(hào)運(yùn)算表達(dá)式變換和化簡方程2目錄微分微分方程積分其他功能3SymPy是一個(gè)符號(hào)數(shù)學(xué)Python庫。它的目標(biāo)是成為一個(gè)全功能的計(jì)算機(jī)代數(shù)系統(tǒng),同時(shí)保持代碼的精簡而易于理解和可擴(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)行下面的程序:

4

這段程序首先將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()

5從例子開始?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?06從例子開始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)??7從例子開始

這次將表達(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)?8從例子開始

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)>>>tmp9從例子開始下面獲得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)10從例子開始下面獲得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)11從例子開始球體體積Scipy介介紹了如何使使用數(shù)值定積積分計(jì)算球體體的體積,SymPy中中的integrate()則可以以進(jìn)行符號(hào)積積分。用integrate()進(jìn)進(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*pi12從例子開始為了計(jì)計(jì)算球球體體體積,,首先先看看看如何何計(jì)算算圓的面面積,,假設(shè)設(shè)圓的的半徑徑為r,則圓圓上任任意一一點(diǎn)的的Y坐標(biāo)標(biāo)函數(shù)數(shù)為::因此可可以直直接對(duì)對(duì)函數(shù)數(shù)y(x)在-r到到r區(qū)區(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))13從例子子開始始首先需需要定定義運(yùn)運(yùn)算中中所需需的符符號(hào),,這里里用symbols()一次創(chuàng)創(chuàng)建多多個(gè)符符號(hào)。。Integrate()沒有有計(jì)算算出積積分結(jié)結(jié)果,,而是是直接接返冋冋了輸輸入的的算式式。這這是因因?yàn)镾ymPy不知知道r是大大于0的,,重新新定定義r,就可可以得得到正正確答答案了了:接下來來對(duì)此此面積積公式式進(jìn)行行定積積分,,就可可以得得到球球體的的體積積,但但是隨隨著X軸坐坐標(biāo)的的變化化,對(duì)對(duì)應(yīng)切切面的的半徑徑也會(huì)會(huì)發(fā)生生變化化。>>>r=symbols('r',positive=True)>>>circle_area=2*integrate(sqrt(r**2-x**2),(x,-r,r))>>>printcircle_areapi*r**214從例子子開始始假設(shè)X軸的的坐標(biāo)標(biāo)為x,球體體的半半徑為為r,那那么x處球球的切切面半半徑可可以使使用前前面的的公式式y(tǒng)(x)計(jì)算算出。。因此此需要要對(duì)圓圓的面面積公公式circle_area中的的變量量r進(jìn)進(jìn)行替替代::然后對(duì)對(duì)circle_area中中的變變量x在區(qū)區(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/315從例子子開始始用subs進(jìn)行行算式式替換換:subs()可可以將將算式式中的的符號(hào)號(hào)進(jìn)行行替換換,它它有3種調(diào)調(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í)執(zhí)行的的,因因此::expression.subs([(x,y),(y,x)])并不能能對(duì)符符號(hào)x和y進(jìn)行行交換換。16數(shù)學(xué)表表達(dá)式式符號(hào)創(chuàng)建一一個(gè)符符號(hào)使使用symbols(),此函函數(shù)會(huì)會(huì)返回回一個(gè)個(gè)Symbol對(duì)象,,用于于表示示符號(hào)號(hào)變量量,其其有name屬性,,這是是符號(hào)號(hào)名,,如::其中左左邊的的x是一個(gè)個(gè)符號(hào)號(hào)對(duì)象象,而而右邊邊括號(hào)號(hào)中用用引號(hào)號(hào)包著著的x是符號(hào)號(hào)對(duì)象象的name屬性,,兩個(gè)個(gè)x不要求求一樣樣,但但是為為了易易于理理解,,通常常將符符號(hào)對(duì)對(duì)象和和name屬性顯顯示成成一樣樣,另另外name屬性是是引號(hào)號(hào)包起起來的的。如如要同同時(shí)配配置多多個(gè)符符號(hào)對(duì)對(duì)象,,symbols()中多個(gè)個(gè)name屬性可可以以以>>>x0=symbols('x0‘‘)17數(shù)學(xué)表表達(dá)式式空格或或者逗逗號(hào)分分隔,,然后后用引引號(hào)包包住,,如下下:一次配配置三三個(gè)符符號(hào),,由于于符號(hào)號(hào)對(duì)象象名和和name屬性名名經(jīng)常常一致致,所所以可可以使使用var()函函數(shù),,如::這語句句和上上個(gè)語語句功功能一一致,,在當(dāng)當(dāng)前環(huán)環(huán)境中中創(chuàng)建建了4個(gè)同名名的Symbol對(duì)象((為了了防止止誤會(huì)會(huì),使使用symbols其實(shí)更更好))。>>>var("x0,y0,x1,y1")(x0,y0,x1,y1)>>>x0,y0,x1,y1=symbols('x0,y0,x1,y1')18數(shù)學(xué)表表達(dá)式式上面的的語句句創(chuàng)建建了名名為x0、y0、x1、y1的的4個(gè)個(gè)Symbol對(duì)象象,同同時(shí)還還在當(dāng)當(dāng)前的的環(huán)境境中創(chuàng)創(chuàng)建了了4個(gè)同同名的的變量量來分分別表表示這這4個(gè)個(gè)Symbol對(duì)對(duì)象。。因?yàn)闉榉?hào)號(hào)對(duì)象象在轉(zhuǎn)轉(zhuǎn)換為為字符符串時(shí)時(shí)直接接使用用它的的name屬性,,因此此在交交互式式環(huán)境境中看看到變變量,x0的值值就是是x0,但是是査看看變量量x0的類型型時(shí)就就可以以發(fā)現(xiàn)現(xiàn),它它實(shí)際際上是是一個(gè)個(gè)Symbol對(duì)對(duì)象。。>>>x0x0>>>type(x0)>>>'x0'>>>type()str19數(shù)學(xué)表表達(dá)式式變量名名和符符號(hào)名名當(dāng)然然也可可以是是不一一樣的的,例例如::數(shù)學(xué)公公式中中的符號(hào)一一般都都有特特定的的假設(shè)設(shè),例例如m、n通常常是整整數(shù),,而z經(jīng)常常表示示復(fù)數(shù)數(shù)。在在用var()、symbols()或Symbol()創(chuàng)創(chuàng)建Symbol對(duì)對(duì)象時(shí)時(shí),可可以通通過關(guān)關(guān)鍵字字參數(shù)數(shù)指定定所創(chuàng)創(chuàng)建符號(hào)的的假設(shè)設(shè)條條件,,這些些假設(shè)設(shè)條件件會(huì)影影響到到它們們所參參與的的計(jì)算算。>>>a,b=symbols("alpha,beta")>>>a,b(alpha,beta)20數(shù)學(xué)表表達(dá)式式例如,,下面面創(chuàng)建建了兩兩個(gè)整整數(shù)符符號(hào)m和n,以以及及一個(gè)個(gè)正數(shù)數(shù)符號(hào)號(hào)x:每個(gè)符符號(hào)都都有許許多is_*屬屬性,,用以以判斷斷符號(hào)號(hào)的各各種假假設(shè)條條件。。在IPython中,,使用用自動(dòng)動(dòng)完成成功功能可可以快快速査査看這這些假假設(shè)的的名稱稱。注注意下劃劃線后后為大大寫字字母的的屬性性,用用來判判斷對(duì)對(duì)象的的類型型;而全小小寫字字母的的屬性性,則則用來來判斷斷符號(hào)號(hào)的假假設(shè)條條件。。>>>m,n=symbols("m,n",integer=True)>>>x=Symbol("x",positive=True)21數(shù)學(xué)表表達(dá)式式>>>x.is_#按了tab鍵自動(dòng)動(dòng)完成成>>>x.is_Symbol#x是一個(gè)個(gè)符號(hào)號(hào)True>>>x.is_positive#x是一一個(gè)個(gè)正正數(shù)數(shù)True>>>x.is_imaginary#因?yàn)闉閤可以以比比較較大大小小,,所所以以它它不不是是虛虛數(shù)數(shù)False>>>x.is_complex#x是一一個(gè)個(gè)復(fù)復(fù)數(shù)數(shù),,因因?yàn)闉閺?fù)復(fù)數(shù)數(shù)包包括括實(shí)實(shí)數(shù)數(shù),,而而實(shí)實(shí)數(shù)數(shù)包包括括正正數(shù)數(shù)True22數(shù)學(xué)學(xué)表表達(dá)達(dá)式式使用用assumptions0屬性性可可以以快快速速査査看看所所有有的的假假設(shè)設(shè)條條件件,,其其中中commutative為為True表表示示此此符符號(hào)號(hào)滿滿足足交交換換律律,,其其余余的的假假設(shè)設(shè)條條件件根根據(jù)據(jù)英英文文名名很很容容易易知知道道它它們們的的含含義義。在SymPy中中,,所所有有的的對(duì)對(duì)象象都都從從Basic類類繼繼承承,,實(shí)實(shí)際際上上這這些些is_*屬屬性性和和assumptions0屬屬性性都都是是在在Basic類類中中定定義義的的::>>>x.assumptions0>>>Symbol.mro()23數(shù)學(xué)學(xué)表表達(dá)達(dá)式式數(shù)值值為了了實(shí)實(shí)現(xiàn)現(xiàn)符符號(hào)號(hào)運(yùn)運(yùn)算算,,在在SymPy內(nèi)內(nèi)部部有有一一整整套套數(shù)數(shù)值值運(yùn)運(yùn)算算系系統(tǒng)統(tǒng)。。因因此此SymPy的的數(shù)數(shù)值值和和Python的的整整數(shù)數(shù)、、浮浮點(diǎn)點(diǎn)數(shù)數(shù)是是完完全全不不同同的的對(duì)對(duì)象象。。為為了了使使用用方方便便,,SymPy會(huì)會(huì)盡盡量量自動(dòng)動(dòng)將將Python的的數(shù)數(shù)值值類類型型轉(zhuǎn)轉(zhuǎn)換換為為SymPy的的數(shù)數(shù)值值類類型型。。此此外外,,SymPy提提供供了了一一個(gè)個(gè)S對(duì)對(duì)象象用用于于進(jìn)進(jìn)行行這這種種轉(zhuǎn)轉(zhuǎn)換換。。在在下下面面的的例例子子中中,,當(dāng)當(dāng)有有SymPy的的數(shù)數(shù)值值參參與與計(jì)計(jì)算算時(shí)時(shí),,結(jié)結(jié)果果將將是是SymPy的的數(shù)數(shù)值值對(duì)對(duì)象象。。24數(shù)學(xué)學(xué)表表達(dá)達(dá)式式“5/6””在在SymPy中中使使用用Rational對(duì)對(duì)象象表表示示,,它它由由兩兩個(gè)個(gè)整整數(shù)數(shù)的的商商表表示示,,數(shù)數(shù)學(xué)學(xué)上上稱稱之之為為有有理理數(shù)數(shù)。。也也可可以以直直接接通通過過Rational創(chuàng)創(chuàng)建建::>>>1/2+1/3#結(jié)果果為為浮浮點(diǎn)點(diǎn)數(shù)數(shù)0.8333333333333333>>>S(1)/2+1/S(3)#結(jié)果果為為SymPy的數(shù)數(shù)值值對(duì)對(duì)象象5/6>>>Rational(5,10)#有理理數(shù)數(shù)會(huì)會(huì)自自動(dòng)動(dòng)進(jìn)進(jìn)行行約約分分處處理理1/225數(shù)學(xué)學(xué)表表達(dá)達(dá)式式運(yùn)算算符符和和函函數(shù)數(shù)SymPy重新新定定義義了了所所有有的的數(shù)數(shù)學(xué)學(xué)運(yùn)運(yùn)算算符符和和數(shù)數(shù)學(xué)學(xué)函函數(shù)數(shù)。。例例如如Add類表表示示加加法法,,Mul類表表示示乘乘法法,,而而Pow類表表示示指指數(shù)數(shù)運(yùn)運(yùn)算算,,sin類表表示示正正弦弦函函數(shù)數(shù)。。和和Symbol對(duì)象象一一樣樣,,這這些些運(yùn)運(yùn)算算符符和和函函數(shù)數(shù)都都從從Basic類繼繼承承,,可可在在IPython中查查看看它它們們的的繼繼承承列列表表(例如如:Add.mro())??煽梢砸允故褂糜眠@這些些類類創(chuàng)創(chuàng)建建復(fù)復(fù)雜雜的的表表達(dá)達(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)26數(shù)學(xué)表達(dá)達(dá)式由于在Basic類中重新新定義了了__add__()等用于創(chuàng)創(chuàng)建表達(dá)達(dá)式的方方法,因因此可以以使用和和Python表達(dá)式相相同的方方式創(chuàng)建建SymPy的表達(dá)式式:在Basic類中定義義了兩個(gè)個(gè)很重要要的屬性性:func和args。func屬性得到到對(duì)象的的類,而而args得到其參參數(shù)。使使用這兩兩個(gè)屬性性可以觀觀察SymPy所創(chuàng)建的的表達(dá)式式。SymPy沒有減法法運(yùn)算類類,下面面看看減減法運(yùn)算算所得到到的表達(dá)達(dá)式:>>>x*y*z+sin(z)+x**yx*y*z+x**y+sin(z)27數(shù)學(xué)表達(dá)達(dá)式通過上面面的例子子可以看看出,表表達(dá)式““x-y””在SymPy中實(shí)際上上是用““Add(x,Mul(-1,y))””表示的。。同樣,,SymPy中沒有除除法類,,可使用用和上面面相同的的方法觀觀察“x/y”在SymPy中是如何何表示的的。>>>t=x-y>>>t.func#減法運(yùn)算算用加法法類Add表示>>>t.args#兩個(gè)加數(shù)數(shù)一個(gè)是是x,一個(gè)是-y(x,-y)>>>t.args[1].func#-y是用Mul表示的>>>t.args[1].args(-1,y)28數(shù)學(xué)表達(dá)達(dá)式SymPy的表達(dá)式式實(shí)際上上是一個(gè)個(gè)由Basic類的各種種對(duì)象進(jìn)進(jìn)行多層層嵌套所所得到的的樹狀結(jié)結(jié)構(gòu)。下下面的函函數(shù)使用用遞歸顯顯示這種種樹狀結(jié)結(jié)構(gòu):由于fsolve函數(shù)在調(diào)調(diào)用函數(shù)數(shù)f時(shí),傳遞遞的參數(shù)數(shù)為數(shù)組組,因此此如果直直接使用用數(shù)組中中的元素素計(jì)算的的話,計(jì)計(jì)算速度度將會(huì)有有所降低低,因此此這里先先用float函數(shù)將數(shù)數(shù)組中的的元素轉(zhuǎn)轉(zhuǎn)換為Python中的標(biāo)準(zhǔn)準(zhǔn)浮點(diǎn)數(shù)數(shù),然后后調(diào)用標(biā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:forargine.args:print_expression(arg,level+1)else:29數(shù)學(xué)表達(dá)達(dá)式例如在在SymPy中使用下下面的樹樹表示::由于其中中的各個(gè)個(gè)對(duì)象的的args屬性類型型是元組組,因此此表達(dá)式式一旦創(chuàng)創(chuàng)建就不不能再改改變。使使用不可可變的結(jié)結(jié)構(gòu)表示示表達(dá)式式有很多多優(yōu)點(diǎn),,例如可可以用表表達(dá)式作作為字典典的鍵。。>>>print_expression(sqrt(x**2+y**2))PowAddPowx2Powy21/230數(shù)學(xué)表達(dá)達(dá)式除了使用用SymPy中預(yù)先定定義好的的具有特特殊運(yùn)算算含義的的數(shù)學(xué)函函數(shù)之外外,還可可以使用用Function()創(chuàng)建自定定義的數(shù)數(shù)學(xué)函數(shù)數(shù):請(qǐng)注意Function雖然是一一個(gè)類,,但是上上面的語語句所得得到的f并不是Function類的實(shí)例例。和預(yù)預(yù)定義的的數(shù)學(xué)函函數(shù)一樣樣,f是一個(gè)類類,它從從Function類繼承::>>>f=Function("f")>>>f.__base__>>>isinstance(f,Function)False31數(shù)學(xué)表達(dá)達(dá)式當(dāng)我使用用f創(chuàng)建一個(gè)個(gè)表達(dá)式式時(shí),就就相當(dāng)于于創(chuàng)建它它的一個(gè)個(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è)個(gè)非常重重要的屬屬性,分分別表示示對(duì)象的的類和對(duì)對(duì)象的參參數(shù))f>>>t.args(x,y)>>>t+t*tf(x,y)**2+f(x,y)32符號(hào)運(yùn)算算表達(dá)式變變換和化簡simplify()可以對(duì)對(duì)數(shù)學(xué)表表達(dá)式進(jìn)進(jìn)行化簡簡,例如如:simplify()調(diào)用SymPy內(nèi)部部的多種種表達(dá)式式變換函函數(shù)對(duì)表表達(dá)式進(jìn)進(jìn)行化簡簡運(yùn)算。。但是數(shù)數(shù)學(xué)表達(dá)達(dá)式的化化簡是一件非常常復(fù)雜的的工作,,并且對(duì)對(duì)于同一一個(gè)表達(dá)達(dá)式,根根據(jù)其使使用目的的可以有有多種化化簡方案案。>>>simplify((x+2)**2-(x+1)**2)2*x+333符號(hào)運(yùn)算算radsimp()對(duì)對(duì)表達(dá)式式的分母母進(jìn)行有有理化,,它所得得到的表達(dá)式的的分母部部分將不不含無理理數(shù)。例例如:它也可以以對(duì)帶符符號(hào)的表表達(dá)式進(jìn)進(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))34符號(hào)運(yùn)算算ratsimp()對(duì)表表達(dá)式中的分分母進(jìn)行通分分運(yùn)算,即將將表達(dá)式轉(zhuǎn)換換為分子除分母的形形式:fraction()返返回一個(gè)包含含表達(dá)式的分分子和分母的的元組,用它可以獲獲得ratsimp()通分分之后的分子或分母:注意fraction()不會(huì)自動(dòng)動(dòng)對(duì)表達(dá)式進(jìn)進(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)35符號(hào)運(yùn)算cancel()對(duì)分式表達(dá)式式的分子分母母進(jìn)行約分運(yùn)運(yùn)算,可以對(duì)對(duì)純符號(hào)的分分式表達(dá)式以以及自定義函函數(shù)表達(dá)式進(jìn)進(jìn)行約分,但但是不能對(duì)內(nèi)內(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)內(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)進(jìn)行約分f(x)-136符號(hào)運(yùn)算trigsimp()對(duì)對(duì)表達(dá)式中的的三角函數(shù)進(jìn)進(jìn)行化簡。它它有兩個(gè)可選選參數(shù)--deep和recursive,默認(rèn)值都為False。當(dāng)deep參數(shù)數(shù)為True時(shí),將對(duì)表表達(dá)式中的所所有子表達(dá)式式進(jìn)行簡化運(yùn)運(yùn)算;當(dāng)recursive參數(shù)數(shù)為True時(shí),將遞歸歸使用trigsimp()進(jì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ù)化簡簡,至今不知知道deep和recursive是干嘛的f(sin(2*x)+1)37符號(hào)運(yùn)算expand_trig()可以對(duì)對(duì)三角函數(shù)的的表達(dá)式進(jìn)行行展開。它實(shí)實(shí)際上是對(duì)expand()的封裝裝,通過將expand()的trig參數(shù)數(shù)設(shè)置為True,實(shí)現(xiàn)現(xiàn)三角函數(shù)的的展開計(jì)算。輸入“expand_trig??”來來査看它調(diào)用用expand()時(shí)的的參數(shù)。expand()通用的展開運(yùn)運(yùn)算,根據(jù)用用戶設(shè)置的標(biāo)標(biāo)志參數(shù)對(duì)表表達(dá)式進(jìn)行展展幵。默認(rèn)情情況下,以下下的標(biāo)志參數(shù)數(shù)為True。mul:展開乘法>>>expand_trig(sin(2*x+y))(2*cos(x)**2-1)*sin(y)+2*sin(x)*cos(x)*cos(y)38符號(hào)運(yùn)算log:展開開對(duì)數(shù)函數(shù)參參數(shù)中的乘積積和冪運(yùn)算multinomial:展開加法法式的整數(shù)次次冪power_base:展開冪函數(shù)數(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**z39符號(hào)運(yùn)算可以將默認(rèn)為為True的的標(biāo)志參數(shù)設(shè)設(shè)置為False,強(qiáng)制制不展開對(duì)應(yīng)的表達(dá)達(dá)式。在下面面的例子中,,將mul設(shè)置為為False,因此不對(duì)對(duì)乘法進(jìn)行展展開:expand()的以下下標(biāo)志參數(shù)默默認(rèn)為Fplex:展開復(fù)數(shù)的實(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)40符號(hào)運(yùn)算func:對(duì)對(duì)一些特殊函函數(shù)進(jìn)行展開trig:展展開三角函數(shù)數(shù)expand_log()、expandmul()、expand_complex()、expand_trig()、expand_func()等函數(shù)數(shù)則通過將相相應(yīng)的標(biāo)志參參數(shù)設(shè)置為True,對(duì)對(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)41符號(hào)運(yùn)算factor()可以對(duì)對(duì)多項(xiàng)式表達(dá)達(dá)式進(jìn)行因式式分解:collect()收集集表達(dá)式中指指定符號(hào)的有有理指數(shù)次冪冪的系數(shù)。例例如,希望獲獲得如下表達(dá)達(dá)式中x的各各次冪的系數(shù)數(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)**242符號(hào)運(yùn)算首先需要對(duì)表表達(dá)式eq進(jìn)進(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)+243符號(hào)運(yùn)算默認(rèn)情況下,,collect()返返回的是一個(gè)個(gè)整理之后的的表達(dá)式,如如果我們希望望得到x的各各次冪的系數(shù)數(shù),可以設(shè)置置evaluate參數(shù)數(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**244符號(hào)運(yùn)算collect()也可可以收集表達(dá)達(dá)式的各次冪冪的系數(shù),例例如下面的程程序收集表達(dá)達(dá)式“sin(2*x)”的系系數(shù):>>>collect(a*sin(2*x)+b*sin(2*x),sin(2*x))(a+b)*sin(2*x)45符號(hào)運(yùn)算方程在SymPy中,表達(dá)式式可以直接表表示值為0的的方程。也可可以使用Eq()創(chuàng)建方程。solve()可以對(duì)方方程進(jìn)行符號(hào)號(hào)求解,它的的第一個(gè)參數(shù)數(shù)是表示方程程的表達(dá)式,,其后的參數(shù)數(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)]46符號(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)]47符號(hào)運(yùn)算由于方程的解解可能有多組組,因此solve()返回一個(gè)列列表保存所有有的解。可以以傳遞包含多多個(gè)表達(dá)式的的元組或列表表,讓solve()對(duì)對(duì)方程組進(jìn)行行求解,得到到的解是兩層層嵌套的列表表,其中每個(gè)個(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)]#有兩組解48符號(hào)運(yùn)算微分Derivative是是表示導(dǎo)函數(shù)數(shù)的類,它的的第一個(gè)參數(shù)數(shù)是需要進(jìn)行行求導(dǎo)的數(shù)學(xué)學(xué)函數(shù),第二二個(gè)參數(shù)是是求導(dǎo)的自變變量.注意Derivative所所得到的是一一個(gè)導(dǎo)函數(shù),,它并不會(huì)進(jìn)進(jìn)行求導(dǎo)運(yùn)算算:如果希望它進(jìn)進(jìn)行實(shí)際的運(yùn)運(yùn)算,計(jì)算出導(dǎo)函函數(shù),可以調(diào)調(diào)用其doit()方法:>>>t=Derivative(sin(x),x)#創(chuàng)建了一個(gè)導(dǎo)導(dǎo)函數(shù)對(duì)象>>>tDerivative(sin(x),x)>>>t.doit()cos(x)49符號(hào)運(yùn)算也可以直接使使用diff()函數(shù)或或表達(dá)式的diff()方法來計(jì)算算導(dǎo)函數(shù):使用Derivative對(duì)象可以以表示自定義義的數(shù)學(xué)函數(shù)數(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)50符號(hào)運(yùn)算由于SymPy不知知道如何對(duì)對(duì)自定義的的數(shù)學(xué)函數(shù)數(shù)進(jìn)行求導(dǎo)導(dǎo),因此它它的diff()方方法會(huì)返回回和上面相相同的結(jié)果果:添加更多的的符號(hào)參數(shù)數(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ù)數(shù)(或者偏偏導(dǎo))Derivative(f(x),x,x,x)#也可以寫作作51符號(hào)運(yùn)算也可以表示示多個(gè)變量量的導(dǎo)函數(shù)數(shù),例如::diff()求解的格式式和Derivative聲明的格式式類似,例例如下面的的語句計(jì)算算sin(xy)對(duì)x兩次求導(dǎo)導(dǎo)、對(duì)y三三次求導(dǎo)的的結(jié)果:>>>Derivative(f(x,y),x,2,y,3)#對(duì)x求二階導(dǎo)且且對(duì)y求三階導(dǎo)數(shù)數(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))52符號(hào)運(yùn)算微分方程dsolve()可可以對(duì)微分分方程進(jìn)行行符號(hào)求解解。它的第第一個(gè)參數(shù)數(shù)是一個(gè)帶帶未知函數(shù)數(shù)的表達(dá)式式,第二二個(gè)參數(shù)是是需要進(jìn)行行求解的未未知函數(shù)。。例如下面面的程序?qū)?duì)微分方程程進(jìn)進(jìn)行求解。。得到的的結(jié)果是一一個(gè)自然指指數(shù)函數(shù),,它有一個(gè)個(gè)待定系數(shù)數(shù)c1。>>>f=Function("f")>>>dsolve(Derivative(f(x),x)-f(x),f(x))f(x)==C1*exp(x)53符號(hào)運(yùn)算用dsolve()解微分方方程時(shí)可以以傳遞一個(gè)個(gè)hint參數(shù),指指定微分方方程的解法法。該參數(shù)數(shù)的默認(rèn)值為“default”,表示由SymPy自動(dòng)挑選選解法。可可以將hint參數(shù)數(shù)設(shè)置為“best””,讓dsolve()嘗嘗試所有己己知解法,,并返回最最簡單的解解,例如下下面對(duì)微分分方程:進(jìn)行求解。。得到的結(jié)結(jié)果是一個(gè)個(gè)一般方程程,它描述述了f(x)和自變變量之間的關(guān)關(guān)系。一般般把這種函函數(shù)稱為隱隱函數(shù):54符號(hào)運(yùn)算如果設(shè)置hint參參數(shù)為“best””,就能得得到更簡單單的顯函數(shù)數(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))55符號(hào)運(yùn)算積分integrate()可以以計(jì)算定積積分和不定定積分:integrate(f,x):計(jì)算算不定積分分integrate(f,(x,a,b)):計(jì)算定積積分如果要對(duì)多多個(gè)變量計(jì)計(jì)算多重積積分,只需需要將被積積分的變量量依次列出出即可:Integrate(f,x,y):計(jì)算雙重重不定積分分Integrate(f,(x,a,b),(y,c,d)):計(jì)算雙重重定積分56符號(hào)運(yùn)算和Derivative對(duì)象象表示微分分表達(dá)式類類似,Integral對(duì)對(duì)象表示積積分表達(dá)式式,它的參參數(shù)和integrate()類似似,例如::調(diào)用積分對(duì)對(duì)象的doit()方法可以以對(duì)其進(jìn)行行求值計(jì)算算:>>>e=Integral(x*sin(x),x)>>>eIntegral(x*sin(x),x)>>>e.doit()-x*cos(x)+sin(x))57符號(hào)號(hào)運(yùn)運(yùn)算算有些些積積分分表表達(dá)達(dá)式式無無法法進(jìn)進(jìn)行行符符號(hào)號(hào)化化簡簡,,這這時(shí)時(shí)可可以以調(diào)調(diào)用用其其evalf()方方法法或或用用求求值值函函數(shù)數(shù)N()對(duì)對(duì)其其進(jìn)進(jìn)行行數(shù)數(shù)值值運(yùn)運(yùn)算算::由于于無無法法進(jìn)進(jìn)行行符符號(hào)號(hào)定定積積分分,,可用用evalf()和和N()對(duì)對(duì)其其進(jìn)進(jìn)行行數(shù)數(shù)值值運(yùn)運(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)#可以以指指定定精精度度58符號(hào)號(hào)運(yùn)運(yùn)算算SymPy的的數(shù)數(shù)值值計(jì)計(jì)算算功功能能還還不不夠夠強(qiáng)強(qiáng)大大,,不不能能對(duì)對(duì)應(yīng)應(yīng)如如下下這這種種情情況況的的無無限限積積分分:將積積分分上上限限修修改改為為10000也也沒沒能能計(jì)計(jì)算算出出近近似似結(jié)結(jié)果果,,上上限限為為1000時(shí)時(shí)得得到到了了π/2的的近近似似值值,,不不過過還還遠(yuǎn)遠(yuǎn)遠(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.5702331219687759符號(hào)號(hào)運(yùn)運(yùn)算算as_sum()方方法法可可以以將將定定積積分分轉(zhuǎn)轉(zhuǎn)換換為為近近似似求求和和公公式式,,它它將將積積分分區(qū)區(qū)域域分分割割成成N個(gè)個(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.94658536278040860其他他功功能能用SymPy做計(jì)計(jì)算算器器SymPy有三三種種內(nèi)內(nèi)建建的的數(shù)數(shù)值值類類型型::浮浮點(diǎn)點(diǎn)數(shù)數(shù)、、有有理理數(shù)數(shù)和和整整數(shù)數(shù)。。有理理數(shù)數(shù)類類用用一一對(duì)對(duì)整整數(shù)數(shù)表表示示一一個(gè)個(gè)有有理理數(shù)數(shù)::分分子子和和分分母母,,所所以以Rational(1,2)代表表1/2,Rational(5,2)代表表5/2等等等。。有些些特特殊殊的的常常數(shù)數(shù),,像像e和pi,它它們們被被視視為為符符號(hào)號(hào)(1+pi將不不被被數(shù)數(shù)值值求求解解,,它它將將保保持持為為1+pi),并并且且可可以以有有任任意意精精度度::>>>pi**2pi**261其他他功功能能evalf將表表達(dá)達(dá)式式求求解解為為浮浮點(diǎn)點(diǎn)數(shù)數(shù)。。這還還有有一一個(gè)個(gè)類類表表示示數(shù)數(shù)學(xué)學(xué)上上的的無無限限,,叫叫作作oo:>>>pi.evalf()>>>(pi+exp(1)).evalf(50)>>>oo>99999True>>>oo+10000oo62其他他功功能能極限限極限限在在sympy中使使用用很很簡簡單單,,它它們們的的語語法法是是limit(function,variable,point),所以以計(jì)計(jì)算算當(dāng)當(dāng)x趨近近于于0時(shí)f(x)的極極限限,,可可以以給給出出limit(f,x,0):也可可以以計(jì)計(jì)算算在在無無窮窮的的極極限限::>>>fromsympyimport*>>>x=Symbol("x")>>>limit(sin(x)/x,x,0)1>>>limit(sin(x)/x,x,oo)063其他他功功能能級(jí)數(shù)數(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??y2345yyyy64其他他功功能能求和和計(jì)算算給給定定求求和和變變量量界界限限的的f的總總和和(Summation)summation(f,(i,a,b))變量量i從a到b計(jì)算算f的和和.如果果不不能能計(jì)計(jì)算算總總和和,,它它將將打打印印相相應(yīng)應(yīng)的的求求和和公公式式。。求求值值可可引引入入額額外外的的極極限限計(jì)計(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))265其他功能能>>>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+

溫馨提示

  • 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)論