SymPy - 簡化



Sympy 具有強大的簡化數學表示式的能力。SymPy 中有許多函式可以執行各種簡化。有一個名為 simplify() 的通用函式,它嘗試得到表示式最簡單的形式。

simplify

此函式在 sympy.simplify 模組中定義。simplify() 嘗試應用智慧啟發式方法使輸入表示式“更簡單”。以下程式碼顯示了簡化表示式 $sin^2(x)+cos^2(x)$。

>>> from sympy import * 
>>> x=Symbol('x')
>>> expr=sin(x)**2 + cos(x)**2 
>>> simplify(expr)

以上程式碼片段給出以下輸出:

1

expand

expand() 是 SymPy 中最常用的簡化函式之一,用於展開多項式表示式。例如:

>>> a,b=symbols('a b') 
>>> expand((a+b)**2)

以上程式碼片段給出的輸出等價於以下表達式:

$a^2 + 2ab + b^2$

>>> expand((a+b)*(a-b))

以上程式碼片段給出的輸出等價於以下表達式:

$a^2 - b^2$

expand() 函式使表示式更大,而不是更小。通常情況下是這樣的,但通常情況下,在對錶達式呼叫 expand() 後,它會變得更小。

>>> expand((x + 1)*(x - 2) - (x - 1)*x)

以上程式碼片段給出以下輸出:

-2

factor

此函式接受一個多項式並將其分解為有理數上的不可約因子。

>>> x,y,z=symbols('x y z') 
>>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
>>> factor(expr)

以上程式碼片段給出的輸出等價於以下表達式:

$z(x + 2y)^2$

>>> factor(x**2+2*x+1)

以上程式碼片段給出的輸出等價於以下表達式:

$(x + 1)^2$

factor() 函式與 expand() 相反。factor() 返回的每個因子都保證是不可約的。factor_list() 函式返回更結構化的輸出。

>>> expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
>>> factor_list(expr)

以上程式碼片段給出的輸出等價於以下表達式:

(1, [(z, 1), (x + 2*y, 2)])

collect

此函式根據表示式列表收集表示式的加法項,直到具有有理指數的冪。

>>> expr=x*y + x - 3 + 2*x**2 - z*x**2 + x**3 
>>> expr

以上程式碼片段給出的輸出等價於以下表達式:

$x^3 + x^2z + 2x^2 + xy + x - 3$

此表示式的 collect() 函式結果如下:

>>> collect(expr,x)

以上程式碼片段給出的輸出等價於以下表達式:

$x^3 + x^2(2 - z) + x(y + 1) - 3$

>>> expr=y**2*x + 4*x*y*z + 4*y**2*z+y**3+2*x*y 
>>> collect(expr,y)

以上程式碼片段給出的輸出等價於以下表達式:

$Y^3+Y^2(x+4z)+y(4xz+2x)$

cancel

cancel() 函式將接受任何有理函式並將其放入標準規範形式 p/q,其中 p 和 q 是沒有公因數的展開多項式。p 和 q 的前導係數沒有分母,即它們是整數。

>>> expr1=x**2+2*x+1 
>>> expr2=x+1 
>>> cancel(expr1/expr2)

以上程式碼片段給出的輸出等價於以下表達式:

$x+1$

>>> expr = 1/x + (3*x/2 - 2)/(x - 4) 
>>> expr

以上程式碼片段給出的輸出等價於以下表達式:

$\frac{\frac{3x}{2} - 2}{x - 4} + \frac{1}{x}$

>>> cancel(expr)

以上程式碼片段給出的輸出等價於以下表達式:

$\frac{3x^2 - 2x - 8}{2x^2 - 8}$

>>> expr=1/sin(x)**2 
>>> expr1=sin(x) 
>>> cancel(expr1*expr)

以上程式碼片段給出的輸出等價於以下表達式:

$\frac{1}{\sin(x)}$

trigsimp

此函式用於簡化三角恆等式。需要注意的是,反三角函式的命名約定是在函式名稱前面附加一個 a。例如,反餘弦或反餘弦稱為 acos()。

>>> from sympy import trigsimp, sin, cos 
>>> from sympy.abc import x, y
>>> expr = 2*sin(x)**2 + 2*cos(x)**2 
>>> trigsimp(expr)

2

trigsimp 函式使用啟發式方法應用最合適的三角恆等式。

powersimp

此函式透過組合具有相似底數和指數的冪來減少給定表示式。

>>> expr=x**y*x**z*y**z 
>>> expr

以上程式碼片段給出的輸出等價於以下表達式:

$x^y x^z y^z$

>>> powsimp(expr)

以上程式碼片段給出的輸出等價於以下表達式:

$x^{y+z} y^z$

您可以透過更改 combine='base' 或 combine='exp' 使 powsimp() 僅組合底數或僅組合指數。預設情況下,combine='all',它同時執行兩者。如果 force 為 True,則將在不檢查假設的情況下組合底數。

>>> powsimp(expr, combine='base', force=True)

以上程式碼片段給出的輸出等價於以下表達式:

$x^y(xy)^z$

combsimp

涉及階乘和二項式的組合表示式可以使用 combsimp() 函式簡化。SymPy 提供了一個 factorial() 函式

>>> expr=factorial(x)/factorial(x - 3) 
>>> expr

以上程式碼片段給出的輸出等價於以下表達式:

$\frac{x!}{(x - 3)!}$

要簡化上述組合表示式,我們使用 combsimp() 函式,如下所示:

>>> combsimp(expr)

以上程式碼片段給出的輸出等價於以下表達式:

$x(x-2)(x-1)$

binomial(x, y) 是從 x 個不同專案集中選擇 y 個專案的數量。它也常寫成 xCy。

>>> binomial(x,y)

以上程式碼片段給出的輸出等價於以下表達式:

$(\frac{x}{y})$

>>> combsimp(binomial(x+1, y+1)/binomial(x, y))

以上程式碼片段給出的輸出等價於以下表達式:

$\frac{x + 1}{y + 1}$

logcombine

此函式採用對數並使用以下規則將它們組合:

  • log(x) + log(y) == log(x*y),如果兩者都為正
  • a*log(x) == log(x**a),如果 x 為正且 a 為實數
>>> logcombine(a*log(x) + log(y) - log(z))

以上程式碼片段給出的輸出等價於以下表達式:

$a\log(x) + \log(y) - \log(z)$

如果此函式的 force 引數設定為 True,則如果在數量上沒有現有的假設,則假設上述假設成立。

>>> logcombine(a*log(x) + log(y) - log(z), force=True)

以上程式碼片段給出的輸出等價於以下表達式:

$\log\frac{x^a y}{z}$

廣告

© . All rights reserved.