日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

latex 符号_sympy: 符号运算-1

發(fā)布時間:2025/3/12 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 latex 符号_sympy: 符号运算-1 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文主要參考資料來自sympy的官網(wǎng):

Introduction - SymPy 1.4 documentation?docs.sympy.org

一般,我們使用計算機軟件進行數(shù)學(xué)計算,主要是數(shù)值計算,就算有變量,也是代入具體數(shù)值來算的,我們在初中到大學(xué)學(xué)到的符號計算,很多時候無法用計算機來進行,比如下面的多項式化簡:

上面的式中沒有任何一個具體數(shù)值,完全是符號進行計算,這時我們只能手算了。當(dāng)然,我們可以用商業(yè)軟件mathematics, 但是非常昂貴,幸好我們還有python,有了開源的sympy模塊,我們可以做到如下功能:

  • core symbolic mathematics: 基礎(chǔ)運算,包括:化簡Simplification,各種函數(shù)運算等;
  • Polynomials:多項式運算及求解
  • Calculus:極限、微分、積分
  • Solving equations:各種方程求解
  • Combinatorics:組合學(xué)
  • Discrete math:離散數(shù)學(xué)
  • Matrices:矩陣運算
  • Geometry:幾何學(xué)
  • Physics:物理學(xué)
  • Statistics:統(tǒng)計學(xué)
  • Cryptography:密碼學(xué)

下面我們分幾個專題來介紹其功能,這篇介紹基礎(chǔ)的運算。

  • Symbols : 符號
  • 在進行符號運算前,必須先定義符號,下面的例子我們定義了兩個符號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.Symbol

    2. Symbols expression: 符號表達(dá)式

    當(dāng)一個表達(dá)式中有任何一個變量是sympy symbol,就變成一個symbols expression,它不會直接進行運算,除非你使用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ù)值來計算最終的結(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ù)值來計算最終的結(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.00000000000000

    3. 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:計算出具體的值

    不單單用sympy symbols組成的表達(dá)式,用sympy functions或sympy Rational組成的表達(dá)式,都是不會直接計算出實際的數(shù)值,這時候可以用evalf函數(shù)來實際計算出具體的數(shù)值,看下例:

    import sympy as sy y = sy.sqrt(2)+sy.Rational(3,8) print(f"{y}={y.evalf()}")

    輸出:

    3/8 + sqrt(2)=1.78921356237310

    5. 更漂亮和專業(yè)的輸出

    在ipython中,運行: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的介紹,參見我的另一個專欄。


    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()函數(shù),絕大部分情況下它很好用,就是有幾個問題:

    • 它不能控制我們最終想要的形式,比如想要多項式(和式a+b+c)的最簡式,還是多項乘積(a*b*c)的最簡式,這可以用后面介紹的兩個函數(shù)來取代;
    • 它速度比較慢,同樣,可以用其他更快的函數(shù)取代,但是通用性沒有它好。

    當(dāng)我們需要化簡為和式的表達(dá)式時,可以用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á)式時,可以用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á)式各項有相同的變量,我們可以用collect()函數(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 + 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)換為

    這樣的最簡式的時候,可以用cancel()函數(shù),它會上下消除相同的項,見下例,另,cancel()函數(shù)最后分子分母都化簡為多項式的和式,如果要化簡為乘積式,可以用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ù)表示的多項式因式分解,看例子:

    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ù)的化簡,比較麻煩,因為一般指數(shù)函數(shù)的形式:

    ,對于底: 和指數(shù): ,當(dāng)它們?nèi)〔煌愋偷闹祷蚍秶臅r候,其結(jié)果是不一樣的,比如:
    • :當(dāng) 都是正數(shù),且 是實數(shù),可以化簡為: ,但是 其他情況就不行,比如設(shè) , ,則 ,而 ,兩邊不相等;
    • :當(dāng) 是整數(shù)時,可以化簡為: ,但是其他情況下,就不行,比如:設(shè): , 而 ,兩者不相同;
    • :對于任何情況都合適。

    缺省情況下,sympy假設(shè)symbols都是屬于復(fù)數(shù)類型,這樣上面的一些指數(shù)表達(dá)式就無法進行簡化,而我們可以在定義symbols的時候,指定其屬于什么類型,這樣一些簡化就可以進行,看下面的例子:

    from IPython.display import display, Latex import sympy as sy sy.init_printing()x, y = symbols('x y', positive=True) #定義為正實數(shù) a, b = symbols('a b', real=True) #定義為實數(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))}$$"))

    輸出:

    注意上面第一個式子,由于

    是復(fù)數(shù),所以簡化沒法進行;

    而第二、第三個式子中由于設(shè)定符號

    都符合要求,所以可以進行簡化。

    除了這些以外,還有:expand_power_exp(), expand_power_base(), powdenest(), expand_log(), logcombine()等函數(shù)可以進行化簡,參看下面的資料:

    Simplification - SymPy 1.4 documentation?docs.sympy.org

    Simplification - SymPy 1.4 documentation

    總結(jié)

    以上是生活随笔為你收集整理的latex 符号_sympy: 符号运算-1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。