latex 符号_sympy: 符号运算-1
本文主要參考資料來自sympy的官網(wǎng):
Introduction - SymPy 1.4 documentation?docs.sympy.org一般,我們使用計(jì)算機(jī)軟件進(jìn)行數(shù)學(xué)計(jì)算,主要是數(shù)值計(jì)算,就算有變量,也是代入具體數(shù)值來算的,我們在初中到大學(xué)學(xué)到的符號(hào)計(jì)算,很多時(shí)候無法用計(jì)算機(jī)來進(jìn)行,比如下面的多項(xiàng)式化簡:
上面的式中沒有任何一個(gè)具體數(shù)值,完全是符號(hào)進(jìn)行計(jì)算,這時(shí)我們只能手算了。當(dāng)然,我們可以用商業(yè)軟件mathematics, 但是非常昂貴,幸好我們還有python,有了開源的sympy模塊,我們可以做到如下功能:
- core symbolic mathematics: 基礎(chǔ)運(yùn)算,包括:化簡Simplification,各種函數(shù)運(yùn)算等;
- Polynomials:多項(xiàng)式運(yùn)算及求解
- Calculus:極限、微分、積分
- Solving equations:各種方程求解
- Combinatorics:組合學(xué)
- Discrete math:離散數(shù)學(xué)
- Matrices:矩陣運(yùn)算
- Geometry:幾何學(xué)
- Physics:物理學(xué)
- Statistics:統(tǒng)計(jì)學(xué)
- Cryptography:密碼學(xué)
下面我們分幾個(gè)專題來介紹其功能,這篇介紹基礎(chǔ)的運(yùn)算。
在進(jìn)行符號(hào)運(yùn)算前,必須先定義符號(hào),下面的例子我們定義了兩個(gè)符號(hào)x,y:
import sympy as sy x,y = sy.symbols('x y') #符號(hào)間用空格隔開 print(type(x)) print(type(y))輸出:
sympy.core.symbol.Symbol sympy.core.symbol.Symbol2. Symbols expression: 符號(hào)表達(dá)式
當(dāng)一個(gè)表達(dá)式中有任何一個(gè)變量是sympy symbol,就變成一個(gè)symbols expression,它不會(huì)直接進(jìn)行運(yùn)算,除非你使用subs()方法代入具體的數(shù)值,看下面的例子:
import sympy as sy x,y=sy.symbols("x y") f=x**2+3*x-5 print(f"f(x)={f}") #直接打印f是顯示表達(dá)式 xx=3 print(f"f({xx})={f.subs({x:xx})}") #代入具體數(shù)值來計(jì)算最終的結(jié)果 yy=4 f1=(x**2+y**2)**0.5 print(f"f1(x,y)={f1}") #直接打印f1是顯示表達(dá)式 print(f"f1({xx},{yy})={f1.subs({x:xx, y:yy})}") #代入具體數(shù)值來計(jì)算最終的結(jié)果結(jié)果:
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 : 代換
上面的例子,顯示了如何在表達(dá)式中代入具體的數(shù)值,但是替換還可以有更多的可能,看下面的例子:
, ---> 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:計(jì)算出具體的值
不單單用sympy symbols組成的表達(dá)式,用sympy functions或sympy Rational組成的表達(dá)式,都是不會(huì)直接計(jì)算出實(shí)際的數(shù)值,這時(shí)候可以用evalf函數(shù)來實(shí)際計(jì)算出具體的數(shù)值,看下例:
import sympy as sy y = sy.sqrt(2)+sy.Rational(3,8) print(f"{y}={y.evalf()}")輸出:
3/8 + sqrt(2)=1.789213562373105. 更漂亮和專業(yè)的輸出
在ipython中,運(yùn)行:sympy.init_printing()后,可以以比較漂亮的格式來打印(用sympy.pprint()函數(shù))輸出公式,比如:
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})}")輸出:
關(guān)于latex的介紹,參見我的另一個(gè)專欄。
6. Simplification : 化簡
對于sympy來說,最強(qiáng)大的一點(diǎn)就是對公式進(jìn)行化簡,下面顯示幾個(gè)例子:
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()函數(shù),絕大部分情況下它很好用,就是有幾個(gè)問題:
- 它不能控制我們最終想要的形式,比如想要多項(xiàng)式(和式a+b+c)的最簡式,還是多項(xiàng)乘積(a*b*c)的最簡式,這可以用后面介紹的兩個(gè)函數(shù)來取代;
- 它速度比較慢,同樣,可以用其他更快的函數(shù)取代,但是通用性沒有它好。
當(dāng)我們需要化簡為和式的表達(dá)式時(shí),可以用expand()函數(shù),參見下例:
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))}$$"))輸出:
當(dāng)我們需要化簡為乘積表達(dá)式時(shí),可以用factor()函數(shù),參見下例:
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))}$$"))輸出:
當(dāng)我們的表達(dá)式各項(xiàng)有相同的變量,我們可以用collect()函數(shù)來合并同階的項(xiàng),看下例:
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))}$$"))輸出:
當(dāng)我們需要把表達(dá)式轉(zhuǎn)換為
這樣的最簡式的時(shí)候,可以用cancel()函數(shù),它會(huì)上下消除相同的項(xiàng),見下例,另,cancel()函數(shù)最后分子分母都化簡為多項(xiàng)式的和式,如果要化簡為乘積式,可以用factor()函數(shù)。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()函數(shù),可以用來把分?jǐn)?shù)表示的多項(xiàng)式因式分解,看例子:
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)))輸出:
對于三角函數(shù),可以用:trigsimp()函數(shù)來化簡,比如下例:
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()函數(shù)來展開三角函數(shù),看下例:
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))}$$"))輸出:
對于指數(shù)函數(shù)的化簡,比較麻煩,因?yàn)橐话阒笖?shù)函數(shù)的形式:
,對于底: 和指數(shù): ,當(dāng)它們?nèi)〔煌愋偷闹祷蚍秶臅r(shí)候,其結(jié)果是不一樣的,比如:- :當(dāng) 都是正數(shù),且 是實(shí)數(shù),可以化簡為: ,但是 其他情況就不行,比如設(shè) , ,則 ,而 ,兩邊不相等;
- :當(dāng) 是整數(shù)時(shí),可以化簡為: ,但是其他情況下,就不行,比如:設(shè): , 而 ,兩者不相同;
- :對于任何情況都合適。
缺省情況下,sympy假設(shè)symbols都是屬于復(fù)數(shù)類型,這樣上面的一些指數(shù)表達(dá)式就無法進(jìn)行簡化,而我們可以在定義symbols的時(shí)候,指定其屬于什么類型,這樣一些簡化就可以進(jìn)行,看下面的例子:
from IPython.display import display, Latex import sympy as sy sy.init_printing()x, y = symbols('x y', positive=True) #定義為正實(shí)數(shù) a, b = symbols('a b', real=True) #定義為實(shí)數(shù) 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))}$$"))輸出:
注意上面第一個(gè)式子,由于
是復(fù)數(shù),所以簡化沒法進(jìn)行;而第二、第三個(gè)式子中由于設(shè)定符號(hào)
都符合要求,所以可以進(jìn)行簡化。除了這些以外,還有:expand_power_exp(), expand_power_base(), powdenest(), expand_log(), logcombine()等函數(shù)可以進(jìn)行化簡,參看下面的資料:
Simplification - SymPy 1.4 documentation?docs.sympy.orgSimplification - SymPy 1.4 documentation
總結(jié)
以上是生活随笔為你收集整理的latex 符号_sympy: 符号运算-1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac地址转换_mac电脑格式转化工具
- 下一篇: 联想平板刷机机器人_消费终端年出货量破1