高數計算,我Python替你承包了
在學習與科研中,經常會遇到一些數學運算問題,使用計算機完成運算具有速度快和準確性高的優勢。Python的Numpy包具有強大的科學運算功能,且具有其他許多主流科學計算語言不具備的免費、開源、輕量級和靈活的特點。本文使用Python語言的NumPy庫,解決數學運算問題中的線性方程組問題、積分問題、微分問題及矩陣化簡問題,結果準確快捷,具有一定的借鑒意義。
SymPy一個用于符號型數學計算(symbolic mathematics)的Python庫。它旨在成為一個功能齊全的計算機代數系統(Computer Algebra System,CAS),同時保持代碼簡潔、易于理解和擴展。SymPy完全是用Python寫的,并不需要外部的庫。
首先,我們通過pip安裝一下sympy這個計算庫吧!
pip install sympy
可用SymPy進行數學表達式的符號推導和演算。可使用isympy運行程序,isympy在 IPython的基礎上添加了數學表達式的直觀顯示 功能。啟動時還會自動運行下面的程序:
這段程序首先將Python的除法操作符“/” 從整數除法改為普通除法。然后從SymPy庫載 入所有符號,并且定義了四個通用的數學符號x 、y、z 、t,三個表示整數的符號k、m、n, 以及三個表示數學函數的符號f、g、h。
歐拉恒等式
此公式被稱為歐拉恒等式,其中e是自然 常數,i是虛數單位, 是圓周率。此公式被譽 為數學中最奇妙的公式,它將5個基本數學常數 用加法、乘法和冪運算聯系起來。 從SymPy庫載入的符號中,E表示自然常 數,I表示虛數單位,pi表示圓周率,因此上面 的公式可以直接如下計算:
print(E**(I*pi)+1)
輸出結果為:0
SymPy除了可以直接計算公式的值之外, 還可以幫助做數學公式的推導和證明。歐拉恒等 式可以將 代入下面的歐拉公式得到:
在SymPy中可以使用expand()將表達式展 開e^ix,用它展開看(expand()中x是復數):
print(expand(exp(I*x), complex=True) )
輸出:
為了指定x為實數,需要重新定義x
x = Symbol("x", real=True)
print(expand(exp(I*x), complex=True))
輸出:
數學表達式
創建一個符號使用symbols(),此函數會 返回一個Symbol對象,用于表示符號變量, 其有name屬性,這是符號名,如:
x0=symbols('x0')
其中左邊的x是一個符號對象,而右邊括 號中用引號包著的x是符號對象的name屬性, 兩個x不要求一樣,但是為了易于理解,通常將 符號對象和name屬性顯示成一樣,另外name 屬性是引號包起來的。如要同時配置多個符號 對象,symbols()中多個name屬性可以以空格或者逗號分隔,然后用引號包住,如下:
一次配置三個符號,由于符號對象名和 name屬性名經常一致,所以可以使用var() 函數,如:
上面的語句創建了名為x0、y0、x1、y1的4 個Symbol對象,同時還在當前的環境中創建 了 4個同名的變量來分別表示這4個Symbol對象。 因為符號對象在轉換為字符串時直接使用它的 name 屬性,因此在交互式環境中看到變量,x0的 值就是x0,但是査看變量x0的類型時就可以發現 ,它實際上是一個Symbol對象。
type(x0)
數學公式中的符號一般都有特定的假設,例 如m、n通常是整數,而z經常表示復數。在用 var()、symbols()或Symbol()創建Symbol對 象時,可以通過關鍵字參數指定所創建符號的假 設條件,這些假設條件會影響到它們所參與的計 算。
例如,下面創建了兩個整數符號m和n, 以 及一個正數符號x:
每個符號都有許多is_*屬性,用以判斷符 號的各種假設條件。
SymPy的表達式實際上是一個由Basic類 的各種對象進行多層嵌套所得到的樹狀結構。 下面的函數使用遞歸顯示這種樹狀結構:
除了使用SymPy中預先定義好的具有特殊 運算含義的數學函數之外,還可以使用 Function()創建自定義的數學函數:
f = Function("f")
當我使用f創建一個表達式時,就相當于創 建它的一個實例:
t = f(x,y)
isinstance(t, Function)
t.func
f的實例t可以參與表達式運算:
t+t*t
f(x, y)**2 + f(x, y)
表達式變換和化簡
simplify()可以對數學表達式進行化簡:
simplify((x+2)**2 - (x+1)**2)
輸出:2*x + 3
radsimp()可以對表達式進行分母有理化,它所得到的表達式分母將沒有無理數:
radsimp(1/(sqrt(5)+2*sqrt(2)))
輸出:(-sqrt(5) + 2*sqrt(2))/3
fraction()獲得ratsimp()通分之后的分子或分母(它不能自動對表達式進行通分):
fraction(ratsimp(1/x+1/y))
輸出:(x + y, x*y)
cancel()對分式的分子分母進行約分計算(不能對內部函數的表達式進行約分):
cancel((x**2-1)/(1+x))
輸出:x-1
cancel(sin((x**2-1)/(1+x)))
輸出:sin(x**2/(x + 1) - 1/(x + 1))
trigsimp()是用來對三角函數進行化簡用的:
trigsimp(sin(x)**2+2*sin(x)*cos(x)+cos(x)**2)
輸出:sin(2*x) + 1
expand_trig()展開三角函數表達式:
expand_trig(sin(2*x+y))
輸出:(2*cos(x)**2 - 1)*sin(y) + 2*sin(x)*cos(x)*cos(y)
log()展開乘積和冪運算:
x,y=symbols("x,y",positive=True)
expand(log(x*y**2))
輸出:log(x) + 2*log(y)
factor()對多項表達式進行因式分解:
factor(15*x**2+2*y-3*x-10*x*y)
輸出:(3*x - 2*y)*(5*x - 1)
integrate()可以用來計算積分,它包含定積分和不定積分:
integrate(f,x):計算不定積分∫ fdx
integrate(f,(x,a,b)):計算定積分∫a/b fdx
當然有時候我們也有多重積分要運算,不要擔心,我們還可以用
Integrate(f,x,y)來計算雙重積分:∫ ∫ fdxdy
Integrate(f,(x,a,b),(y,c,d)):計算雙重定積分(x上下限ab,y上下限cd)
輸出:-x*cos(x) + sin(x))
當然,sympy還可以求極限,我們大學學的第一個內容!
語法:limit(function, variable, point),如果是求趨于0,那就把第三個變量改成0,limit(f,x,0),如果是求趨于無窮,第三個變量改成oo(字母)limit(sin(x)/x, x, oo)
輸出:1
輸出:0
其他還有一些求導,矩陣的算法,平面幾何算法,詳細見一下sympy文檔,這里因為時間問題,我們就不再去介紹了,有問題的可以私聊小編!
下期見!
Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。