日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

latex 符号_sympy: 符号运算-1

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

本文主要參考資料來自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)算。

  • Symbols : 符號(hào)
  • 在進(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.Symbol

    2. 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.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:計(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.78921356237310

    5. 更漂亮和專業(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.org

    Simplification - SymPy 1.4 documentation

    總結(jié)

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

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