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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

SymPy—符號運算庫1PPT課件SymPy—符號運算庫1PPT課件目錄從例子開始歐拉恒等式球體體積數學表達式符號數值運算符和函數符號運算表達式變換和化簡方程2PPT課件目錄從例子開始2PPT課件目錄微分微分方程積分其他功能3PPT課件目錄微分3PPT課件SymPy是一個符號數學Python庫。它的目標是成為一個全功能的計算機代數系統(tǒng),同時保持代碼的精簡而易于理解和可擴展。SymPy完全由Python寫成,不需要任何外部庫。

可用SymPy進行數學表達式的符號推導和演算??墒褂胕sympy運行程序,isympy在IPython的基礎上添加了數學表達式的直觀顯示功能。啟動時還會自動運行下面的程序:

4PPT課件SymPy是一個符號數學Python庫。

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

、t,三個表示整數的符號k、m、n,以及三個表示數學函數的符號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從例子開始歐拉恒等式

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

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

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

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

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

試試看:

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

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

終于得到了需要的公式。可以用泰勒多項式對其進行展開:>>>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()對表達式進行泰勒級數展開??梢钥吹秸归_之后虛數項和實數項交替出現(xiàn)。根據歐拉公式,虛數項的和應該等于sin(x)的泰勒展開,而實數項的和應該等于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的實部:

下面對cos(x)進行泰勒展開,可看到其中各項和上面的結果是一致的。>>>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的實部:>>>re從例子開始

下面獲得tmp的虛部:

下面對sin(x)進行泰勒展開,其中各項也和上面的結果一致。

由于

展開式的實部和虛部分別等于cos(x)和sin(x),因此驗證了歐拉公式的正確性。>>>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介紹了如何使用數值定積分計算球體的體積,SymPy中的integrate()則可以進行符號積分。用integrate()進行不定積分運算:

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

為了計算球體體積,首先看看如何計算圓的面積,假設圓的半徑為r,則圓上任意一點的Y坐標函數為:

因此可以直接對函數y(x)在-r到r區(qū)間上進行定積分得到半圓面積。>>>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課件從例子開始為了計算球體體積,首先看看如何計從例子開始

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

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

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

然后對circle_area中的變量x在區(qū)間-r到r上進行定積分,就可以得到球體的體積公式:>>>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課件從例子開始假設X軸的坐標為x,球體的半徑從例子開始

用subs進行算式替換:

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

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

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

x0=symbols('x0‘)17PPT課件數學表達式符號>>>

x0=symbols('x0‘)17P數學表達式空格或者逗號分隔,然后用引號包住,如下:一次配置三個符號,由于符號對象名和name屬性名經常一致,所以可以使用var()函數,如:

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

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

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

變量名和符號名當然也可以是不一樣的,例如:

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

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

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

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

>>>x.is_Symbol#x是一個符號True>>>x.is_positive#x是一個正數True>>>x.is_imaginary#因為x可以比較大小,所以它不是虛數False>>>x.is_complex#x是一個復數,因為復數包括實數,而實數包括正數True

22PPT課件數學表達式>>>x.is_#按了tab鍵自動完成22P數學表達式

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

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

為了實現(xiàn)符號運算,在SymPy內部有一整套數值運算系統(tǒng)。因此SymPy的數值和Python的整數、浮點數是完全不同的對象。為了使用方便,SymPy會盡量自動將Python的數值類型轉換為SymPy的數值類型。此外,SymPy提供了一個S對象用于進行這種轉換。在下面的例子中,當有SymPy的數值參與計算時,結果將是SymPy的數值對象。24PPT課件數學表達式數值24PPT課件數學表達式

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

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

SymPy的表達式實際上是一個由Basic類的各種對象進行多層嵌套所得到的樹狀結構。下面的函數使用遞歸顯示這種樹狀結構:由于fsolve函數在調用函數f時,傳遞的參數為數組,因此如果直接使用數組中的元素計算的話,計算速度將會有所降低,因此這里先用float函數將數組中的元素轉換為Python中的標準浮點數,然后調用標準math庫中的函數進行運算。

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課件數學表達式SymPy的表達式實際上是一個數學表達式例如在SymPy中使用下面的樹表示:由于其中的各個對象的args屬性類型是元組,因此表達式一旦創(chuàng)建就不能再改變。使用不可變的結構表示表達式有很多優(yōu)點,例如可以用表達式作為字典的鍵。

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

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

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

simplify()調用SymPy內部的多種表達式變換函數對表達式進行化簡運算。但是數學表達式的化簡是一件非常復雜的工作,并且對于同一個表達式,根據其使用目的可以有多種化簡方案。>>>simplify((x+2)**2-(x+1)**2)2*x+333PPT課件符號運算表達式變換和化簡>>>simplify((x+2)符號運算radsimp()對表達式的分母進行有理化,它所得到的表達式的分母部分將不含無理數。例如:

它也可以對帶符號的表達式進行處理:>>>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課件符號運算radsimp()對表達式的分母符號運算

ratsimp()對表達式中的分母進行通分運算,即將表達式轉換為分子除分母的形式:fraction()返回一個包含表達式的分子和分母的元組,用它可以獲得ratsimp()通分之后的分

子或分母:

注意fraction()不會自動對表達式進行通分運算,因此:>>>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課件符號運算ratsimp()對表達式中的分符號運算cancel()對分式表達式的分子分母進行約分運算,可以對純符號的分式表達式以及自定義函數表達式進行約分,但是不能對內部函數的表達式進行約分。

>>>cancel((x**2-1)/(1+x))x-1>>>cancel(sin((x**2-1)/(1+x)))#cancel不能對函數內部的表達式進行約分sin(x**2/(x+1)-1/(x+1))>>>cancel((f(x)**2-1)/(f(x)+1))#

#能對自定義函數表達式進行約分f(x)-136PPT課件符號運算cancel()對分式表達式的分符號運算

trigsimp()對表達式中的三角函數進行化簡。它有兩個可選參數--deep和recursive,默認

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

mul:展開乘法>>>expand_trig(sin(2*x+y))(2*cos(x)**2-1)*sin(y)+2*sin(x)*cos(x)*cos(y)38PPT課件符號運算expand_trig()可以對符號運算log:展開對數函數參數中的乘積和冪運算multinomial:展開加法式的整數次冪power_base:展開冪函數的底數乘積>>>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課件符號運算log:展開對數函數參數中的乘積和冪運算>符號運算

可以將默認為True的標志參數設置為False,強制不展開對應的表達式。在下面的例子中,將mul設置為False,因此不對乘法進行展開:expand()的以下標志參數默認為Fplex:展開復數的實部和虛部,默認不展開復數的實部和虛部:

>>>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課件符號運算可以將默認為True的標志參數設符號運算

func:對一些特殊函數進行展開

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

factor()可以對多項式表達式進行因式分解:collect()收集表達式中指定符號的有理指數次冪的系數。例如,希望獲得如下表達式中x的各次冪的系數:>>>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課件符號運算factor()可以對多項式表達符號運算

首先需要對表達式eq進行展開,得到的表達式eq2是一系列乘式的和:

然后調用collect(),對表達式eq2中x的冪的系數進行收集:>>>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課件符號運算首先需要對表達式eq進行展開,得符號運算

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

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

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

45PPT課件符號運算collect()也可以收集表達符號運算方程

在SymPy中,表達式可以直接表示值為0的方程。也可以使用Eq()創(chuàng)建方程。solve()可以對方程進行符號求解,它的第一個參數是表示方程的表達式,其后的參數是表示方程中未知變量的符號。下面的例子使用solve()對一元二次方程進行求解:>>>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課件符號運算方程>>>a,b,c=symbols("a,b符號運算

使用Eq創(chuàng)建一個方程對象并求解:>>>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課件符號運算

使用Eq創(chuàng)建一個方程對象并求解:>>>符號運算

由于方程的解可能有多組,因此solve()返回一個列表保存所有的解。可以傳遞包含多個表達式的元組或列表,讓solve()對方程組進行求解,得到的解是兩層嵌套的列表,其中每個元組表示方程組的一組解:#對方程組求解(用元組將幾個方程組成一個組)>>>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課件符號運算由于方程的解可能有多組,因此so符號運算微分Derivative是表示導函數的類,它的第一個參數是需要進行求導的數學函數,第二個參數是求導的自變量.注意Derivative所得到的是一個導函數,它并不會進行求導運算:

如果希望它進行實際的運算,計算出導函數,可以調用其doit()方法:

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

#創(chuàng)建了一個導函數對象>>>tDerivative(sin(x),x)>>>t.doit()cos(x)49PPT課件符號運算微分>>>t=Derivative(sin(x符號運算

也可以直接使用diff()函數或表達式的diff()方法來計算導函數:

使用Derivative對象可以表示自定義的數學函數的導函數,例如:>>>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課件符號運算也可以直接使用diff()函數或符號運算

由于SymPy不知道如何對自定義的數學函數進行求導,因此它的diff()方法會返回和上面相同的結果:

添加更多的符號參數可以表示高階導函數,例如:

>>>f(x).diff(x)#方法中的x表示對x符號進行求導Derivative(f(x),x)>>>Derivative(f(x),x,3)

#表示f(x)對x求三階導數(或者偏導)Derivative(f(x),x,x,x)#也可以寫作51PPT課件符號運算由于SymPy不知道如何對自定義符號運算

也可以表示多個變量的導函數,例如:

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

#對x求二階導且對y求三階導數(5階數)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課件符號運算也可以表示多個變量的導函數,例如:>>>符號運算微分方程dsolve()可以對微分方程進行符號求解。它的第一個參數是一個帶未知函數的表達式,第二個參數是需要進行求解的未知函數。例如下面的程序對微分方程

進行求解。得到的結果是一個自然指數函數,它有一個待定系數c1。

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

用dsolve()解微分方程時可以傳遞一個hint參數,指定微分方程的解法。該參數的默認值為“default”,表示由SymPy自動挑選解法??梢詫int參數設置為“best”,讓dsolve()嘗試所有己知解法,并返回最簡單的解,例如下面對微分方程:

進行求解。得到的結果是一個一般方程,它描述了f(x)和自變量之間的關系。一般把這種函數稱為隱函數:54PPT課件符號運算用dsolve()解微分方程時可符號運算

如果設置hint參數為“best”,就能得到更簡單的顯函數表達式:>>>x=symbols("x",real=True)#定義符號x為實數>>>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課件符號運算>>>x=symbols(符號運算積分integrate()可以計算定積分和不定積分:integrate(f,x):計算不定積分integrate(f,(x,a,b)):計算定積分如果要對多個變量計算多重積分,只需要將被積分的變量依次列出即可:Integrate(f,x,y):計算雙重不定積分Integrate(f,(x,a,b),(y,c,d)):計算雙重定積分56PPT課件符號運算積分56PPT課件符號運算

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

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

有些積分表達式無法進行符號化簡,這時可以調用其evalf()方法或用求值函數N()對其進行數值運算:

由于無法進行符號定積分,可用evalf()和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課件符號運算有些積分表達式無法進行符號化簡,符號運算SymPy的數值計算功能還不夠強大,不能對應如下這種情況的無限積分:

將積分上限修改為10000也沒能計算出近似結果,上限為1000時得到了π/2的近似值,不過還遠遠不夠精確:

>>>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課件符號運算SymPy的數值計算功能還不夠強符號運算as_sum()方法可以將定積分轉換為近似求和公式,它將積分區(qū)域分割成n個小矩形的面積之和:>>>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課件符號運算as_sum()方法可以將定積分其他功能用SymPy做計算器SymPy有三種內建的數值類型:浮點數、有理數和整數。有理數類用一對整數表示一個有理數:分子和分母,所以Rational(1,2)代表1/2,Rational(5,2)代表5/2等等。有些特殊的常數,像e和pi,它們被視為符號(1+pi將不被數值求解,它將保持為1+pi),并且可以有任意精度:>>>pi**2pi**261PPT課件其他功能用SymPy做計算器>>>pi**261PPT課件其他功能

evalf將表達式求解為浮點數。這還有一個類表示數學上的無限,叫作oo:>>>pi.evalf()3.14159265358979>>>(pi+exp(1)).evalf(50)5.8598744820488384738229308546321653819544164930751>>>oo>99999True>>>oo+10000oo62PPT課件其他功能>>>pi.evalf()其他功能極限極限在sympy中使用很簡單,它們的語法是limit(function,variable,point),所以計算當x趨近于0時f(x)的極限,可以給出limit(f,x,0):也可以計算在無窮的極限:>>>fromsympyimport*>>>x=Symbol("x")>>>limit(sin(x)/x,x,0)1>>>limit(sin(x)/x,x,oo)063PPT課件其他功能極限>>>fromsympyimport*其他功能級數展開使用.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課件其他功能級數展開>>>(1/cos(x)).series(其他功能求和計算給定求和變量界限的f的總和(Summation)summation(f,(i,a,b))變量i從a到b計算f的和.如果不能計算總和,它將打印相應的求和公式。求值可引入額外的極限計算:>>>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)建,它可以包含符號:>>>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類對表達式實行模式匹配。這個方法將返回一個發(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類的排除參數去保證一些東西不出現(xiàn)在結果之中:>>>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平面幾何模塊這個模塊可以創(chuàng)建二維幾何圖形的對象,如直線,線段,圓等,并計算這些對象的各種信息,例如橢圓的面積,判斷一組點是否共線,或者求兩條直線的交點等等。下面有幾個簡單的例子:#創(chuàng)建了3個表示平面上的點的對象>>>A=Point(0,0)>>>B=Point(5,0)>>>C=Point(3,2)#用上面創(chuàng)建的三個點當三角形的頂點,創(chuàng)建了一個表示三角形的對象t>>>t=Triangle(A,B,C)70PPT課件其他功能Numpy.geometry平面幾何模塊#創(chuàng)建了3個其他功能s

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

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

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

#三角形對象的incenter屬性用于獲取其內心(其他功能

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

可用SymPy進行數學表達式的符號推導和演算??墒褂胕sympy運行程序,isympy在IPython的基礎上添加了數學表達式的直觀顯示功能。啟動時還會自動運行下面的程序:

77PPT課件SymPy是一個符號數學Python庫。

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

、t,三個表示整數的符號k、m、n,以及三個表示數學函數的符號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從例子開始歐拉恒等式

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

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

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

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

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

試試看:

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

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

終于得到了需要的公式??梢杂锰├斩囗検綄ζ溥M行展開:>>>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()對表達式進行泰勒級數展開??梢钥吹秸归_之后虛數項和實數項交替出現(xiàn)。根據歐拉公式,虛數項的和應該等于sin(x)的泰勒展開,而實數項的和應該等于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的實部:

下面對cos(x)進行泰勒展開,可看到其中各項和上面的結果是一致的。>>>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的實部:>>>re從例子開始

下面獲得tmp的虛部:

下面對sin(x)進行泰勒展開,其中各項也和上面的結果一致。

由于

展開式的實部和虛部分別等于cos(x)和sin(x),因此驗證了歐拉公式的正確性。>>>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介紹了如何使用數值定積分計算球體的體積,SymPy中的integrate()則可以進行符號積分。用integrate()進行不定積分運算:

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

為了計算球體體積,首先看看如何計算圓的面積,假設圓的半徑為r,則圓上任意一點的Y坐標函數為:

因此可以直接對函數y(x)在-r到r區(qū)間上進行定積分得到半圓面積。>>>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課件從例子開始為了計算球體體積,首先看看如何計從例子開始

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

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

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

然后對circle_area中的變量x在區(qū)間-r到r上進行定積分,就可以得到球體的體積公式:>>>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課件從例子開始假設X軸的坐標為x,球體的半徑從例子開始

用subs進行算式替換:

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

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

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

x0=symbols('x0‘)90PPT課件數學表達式符號>>>

x0=symbols('x0‘)17P數學表達式空格或者逗號分隔,然后用引號包住,如下:一次配置三個符號,由于符號對象名和name屬性名經常一致,所以可以使用var()函數,如:

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

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

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

溫馨提示

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

評論

0/150

提交評論