latex 符号_sympy: 符号运算-1
本文主要參考資料來自sympy的官網:
Introduction - SymPy 1.4 documentation?docs.sympy.org一般,我們使用計算機軟件進行數學計算,主要是數值計算,就算有變量,也是代入具體數值來算的,我們在初中到大學學到的符號計算,很多時候無法用計算機來進行,比如下面的多項式化簡:
上面的式中沒有任何一個具體數值,完全是符號進行計算,這時我們只能手算了。當然,我們可以用商業軟件mathematics, 但是非常昂貴,幸好我們還有python,有了開源的sympy模塊,我們可以做到如下功能:
- core symbolic mathematics: 基礎運算,包括:化簡Simplification,各種函數運算等;
- Polynomials:多項式運算及求解
- Calculus:極限、微分、積分
- Solving equations:各種方程求解
- Combinatorics:組合學
- Discrete math:離散數學
- Matrices:矩陣運算
- Geometry:幾何學
- Physics:物理學
- Statistics:統計學
- Cryptography:密碼學
下面我們分幾個專題來介紹其功能,這篇介紹基礎的運算。
在進行符號運算前,必須先定義符號,下面的例子我們定義了兩個符號x,y:
import sympy as sy x,y = sy.symbols('x y') #符號間用空格隔開 print(type(x)) print(type(y))輸出:
sympy.core.symbol.Symbol sympy.core.symbol.Symbol2. Symbols expression: 符號表達式
當一個表達式中有任何一個變量是sympy symbol,就變成一個symbols expression,它不會直接進行運算,除非你使用subs()方法代入具體的數值,看下面的例子:
import sympy as sy x,y=sy.symbols("x y") f=x**2+3*x-5 print(f"f(x)={f}") #直接打印f是顯示表達式 xx=3 print(f"f({xx})={f.subs({x:xx})}") #代入具體數值來計算最終的結果 yy=4 f1=(x**2+y**2)**0.5 print(f"f1(x,y)={f1}") #直接打印f1是顯示表達式 print(f"f1({xx},{yy})={f1.subs({x:xx, y:yy})}") #代入具體數值來計算最終的結果結果:
f(x)=x**2 + 3*x - 5 f(3)=13 f1(x,y)=(x**2 + y**2)**0.5 f1(3,4)=5.000000000000003. Substitution : 代換
上面的例子,顯示了如何在表達式中代入具體的數值,但是替換還可以有更多的可能,看下面的例子:
, ---> import sympy as sy a,x,t=sy.symbols("a x t") f=sy.cos(x) print(f"f(t)={f.subs({x: a**t})}")輸出:
f(t)=cos(a**t)4. evalf:計算出具體的值
不單單用sympy symbols組成的表達式,用sympy functions或sympy Rational組成的表達式,都是不會直接計算出實際的數值,這時候可以用evalf函數來實際計算出具體的數值,看下例:
import sympy as sy y = sy.sqrt(2)+sy.Rational(3,8) print(f"{y}={y.evalf()}")輸出:
3/8 + sqrt(2)=1.789213562373105. 更漂亮和專業的輸出
在ipython中,運行:sympy.init_printing()后,可以以比較漂亮的格式來打印(用sympy.pprint()函數)輸出公式,比如:
import sympy as sy sy.init_printing() sy.pprint(x**2+sy.Rational(1,3))輸出:
2 1 x + ─3如果在jupyter notebook中,可以用下面的方法用latex來輸出漂亮的公式:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x,y=sy.symbols("x y") f=x**2+3*x-5 display(Latex(f"$$f(x)={sy.latex(f)}$$"))xx=3 sy.pprint(f"f({xx})={f.subs({x:xx})}") yy=4 f1=sy.sqrt(x**2+y**2)display(Latex(f"$$f_1(x,y)={sy.latex(f1)}$$")) sy.pprint(f"f1({xx},{yy})={f1.subs({x:xx, y:yy})}")輸出:
關于latex的介紹,參見我的另一個專欄。
6. Simplification : 化簡
對于sympy來說,最強大的一點就是對公式進行化簡,下面顯示幾個例子:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x = sy.symbols("x") y = (x**3 + x**2 - x - 1)/(x**2 + 2*x + 1) display(Latex(f"$${sy.latex(y)}={sy.latex(sy.simplify(y))}$$"))輸出:
這里是用simplify()函數,絕大部分情況下它很好用,就是有幾個問題:
- 它不能控制我們最終想要的形式,比如想要多項式(和式a+b+c)的最簡式,還是多項乘積(a*b*c)的最簡式,這可以用后面介紹的兩個函數來取代;
- 它速度比較慢,同樣,可以用其他更快的函數取代,但是通用性沒有它好。
當我們需要化簡為和式的表達式時,可以用expand()函數,參見下例:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x = sy.symbols("x") y = (x + 1)**2 display(Latex(f"$${sy.latex(y)}={sy.latex(sy.expand(y))}$$"))輸出:
當我們需要化簡為乘積表達式時,可以用factor()函數,參見下例:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x = sy.symbols("x") y = x**3 - x**2 + x - 1 display(Latex(f"$${sy.latex(y)}={sy.latex(sy.factor(y))}$$"))輸出:
當我們的表達式各項有相同的變量,我們可以用collect()函數來合并同階的項,看下例:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x,y,z = sy.symbols("x y z") f = x*y + x - 3 + 2*x**2 - z*x**2 + x**3 display(Latex(f"$${sy.latex(f)}={sy.latex(sy.collect(f,x))}$$"))輸出:
當我們需要把表達式轉換為
這樣的最簡式的時候,可以用cancel()函數,它會上下消除相同的項,見下例,另,cancel()函數最后分子分母都化簡為多項式的和式,如果要化簡為乘積式,可以用factor()函數。from IPython.display import display, Latex import sympy as sy sy.init_printing()x,y,z = sy.symbols("x y z") f = (x*y**2 - 2*x*y*z + x*z**2 + y**2 - 2*y*z + z**2)/(x**2 - 1) display(Latex(f"$${sy.latex(f)}={sy.latex(sy.cancel(f))}={sy.latex(sy.factor(f))}$$"))輸出:
下面看看apart()函數,可以用來把分數表示的多項式因式分解,看例子:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x,y,z = sy.symbols("x y z") f = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x) display(Latex(f"$${sy.latex(f)}={sy.latex(sy.apart(f))}$$")) print(sy.latex(f), sy.latex(sy.apart(f)))輸出:
對于三角函數,可以用:trigsimp()函數來化簡,比如下例:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x,y,z = sy.symbols("x y z") f = sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4 display(Latex(f"$${sy.latex(f)}={sy.latex(sy.trigsimp(f))}$$"))反過來,可以用expand_trig()函數來展開三角函數,看下例:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x,y,z = sy.symbols("x y z") f = sin(x+y) display(Latex(f"$${sy.latex(f)}={sy.latex(sy.expand_trig(f))}$$"))輸出:
對于指數函數的化簡,比較麻煩,因為一般指數函數的形式:
,對于底: 和指數: ,當它們取不同類型的值或范圍的時候,其結果是不一樣的,比如:- :當 都是正數,且 是實數,可以化簡為: ,但是 其他情況就不行,比如設 , ,則 ,而 ,兩邊不相等;
- :當 是整數時,可以化簡為: ,但是其他情況下,就不行,比如:設: , 而 ,兩者不相同;
- :對于任何情況都合適。
缺省情況下,sympy假設symbols都是屬于復數類型,這樣上面的一些指數表達式就無法進行簡化,而我們可以在定義symbols的時候,指定其屬于什么類型,這樣一些簡化就可以進行,看下面的例子:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x, y = symbols('x y', positive=True) #定義為正實數 a, b = symbols('a b', real=True) #定義為實數 z, t, c = symbols('z t c')f1 = t**c*z**c f2 = x**a*x**b f3 = x**a*y**a display(Latex(f"$${sy.latex(f1)}={sy.latex(sy.powsimp(f1))}$$")) display(Latex(f"$${sy.latex(f2)}={sy.latex(sy.powsimp(f2))}$$")) display(Latex(f"$${sy.latex(f3)}={sy.latex(sy.powsimp(f3))}$$"))輸出:
注意上面第一個式子,由于
是復數,所以簡化沒法進行;而第二、第三個式子中由于設定符號
都符合要求,所以可以進行簡化。除了這些以外,還有:expand_power_exp(), expand_power_base(), powdenest(), expand_log(), logcombine()等函數可以進行化簡,參看下面的資料:
Simplification - SymPy 1.4 documentation?docs.sympy.orgSimplification - SymPy 1.4 documentation
總結
以上是生活随笔為你收集整理的latex 符号_sympy: 符号运算-1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac地址转换_mac电脑格式转化工具
- 下一篇: html网页之间怎么切换效果,HTML教