5.3簡化操作
目錄
前言
既然sympy是對於符號的運算,那么它對於符號表達式的簡化與展開一定很強大。
今天我們學習的是符號表達式的簡化與展開。
本章節對應官網的Simplification
(一)有理數與多項式的簡化
1.最簡化-simplify()
(1)說明:
simplify()是盡可能的讓表達式最簡化,其最簡化的形式是不定的。
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = cos(x)**2+sin(x)**2
expr2 = (x**3 + x**2 - x - 1)/(x**2 + 2*x + 1)
# 簡化表達式
r1 = simplify(expr1)
r2 = simplify(expr2)
print(r1)
print(r2)
(3)輸出:
\(cos(x)^2+sin(x)^2\)-->1
\((x^3 + x^2 - x - 1)/(x^2 + 2x + 1)\)-->\(x-1\)
2.展開-expand()
(1)說明:
expand()是對括號里的多項式進行展開。
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = (x+1)**2
expr2 = ((x + 1)*(x - 2) - (x - 1)*x)
# 展開
r1 = expand(expr1)
r2 = expand(expr2)
print(r1)
print(r2)
(3)輸出:
\((x+1)^2\)-->\(x^2+2x+1\)
\((x + 1)(x - 2) - (x - 1)x\)-->-2
3.提公因式-factor()
(1)說明:
factor()是對展開的多項式進行提公因式
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = (x ** 3 - x ** 2 + x - 1)
# 提公因數
r1 = factor(expr1)
print(r1)
print(latex(expr1))
print(latex(r1))
(3)輸出:
\(x^{3} - x^{2} + x - 1\)-->\(\left(x - 1\right) \left(x^{2} + 1\right)\)
4.合並同類項-ceiling()
(1)說明:
對於多項式進行合並同類項
(2)源代碼:
from sympy import *
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
expr1 = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
expr2 = x**3+x*2-3*x**2+x**3-x**2+x*4-5
# 合並同類項
r1 = ceiling(expr1)
r2 = ceiling(expr2)
print(r1)
print(r2)
print(latex(r1))
print(latex(r2))
(3)輸出:
\(xy + x - 3 + 2x^2 - zx^2 + x^3\) --> \(\lceil{x^{3} - x^{2} z + 2 x^{2} + x y + x}\rceil - 3\)
\(x^3+x2-3x^2+x^3-x^2+x4-5\) --> \(\lceil{2 x^{3} - 4 x^{2} + 6 x}\rceil - 5\)
5.簡化分式-cancel()
(1)說明:
cancle既有約分又有簡化的作用
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = (x**2 + 2*x + 1)/(x**2 + x)
expr2 = 1/x + (3*x/2 - 2)/(x - 4)
# 約分消去分式的公因數
r1 = cancel(expr1)
# 簡化分式
r2 = cancel(expr2)
# 結果
print("結果:r1", r1)
print("結果:r2", r2)
# r1的表達式與結果
print("r1的表達式與結果:")
print(latex((x**2 + 2*x + 1)/(x**2 + x)))
print(latex(r1))
# r2的表達式與結果
print("\nr2的表達式與結果:")
print(latex(1/x + (3*x/2 - 2)/(x - 4)))
print(latex(r2))
(3)輸出:
\(\frac{x^{2} + 2 x + 1}{x^{2} + x}\) --》 \(\frac{x + 1}{x}\)
\(\frac{\frac{3 x}{2} - 2}{x - 4} + \frac{1}{x}\) --》 \(\frac{3 x^{2} - 2 x - 8}{2 x^{2} - 8 x}\)
6.分式展開-apart()
(1)說明:
原本只有一項的分式表達式,展開為多項的分式表達式。
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
# 對於分式進行展開
r1 = apart(expr1)
print(r1)
print(latex(r1))
print(latex(expr1))
(3)輸出:
---》
(二)三角函數的簡化
1.三角形的簡化-trigsimp()
(1)說明:
使用trigsimp()可以簡化三角函數,反三角函數也可以。
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = sin(x)**2+cos(x)**2
expr2 = sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4
# 進行三角形簡化
r1 = trigsimp(expr1)
r2 = trigsimp(expr2)
print("r1:", r1)
print("r2:", r2)
# r1的latex
print("="*20)
print("expr1-latex:", latex(expr1))
print("r1-latex:", latex(r1))
# r2的latex
print("="*20)
print("expr2-latex:", latex(expr2))
print("r2-latex:", latex(r2))
(3)輸出:
\(\sin^{2}{\left (x \right )} + \cos^{2}{\left (x \right )}\) --> \(1\)
\(\sin^{4}{\left (x \right )} - 2 \sin^{2}{\left (x \right )} \cos^{2}{\left (x \right )} + \cos^{4}{\left (x \right )}\) --> \(\frac{\cos{\left (4 x \right )}}{2} + \frac{1}{2}\)
2.三角形的展開-expand_trig()
(1)說明:
使用expand_trig()可以展開三角函數,同樣反三角函數也可以。
(2)源代碼:
from sympy import *
x = Symbol('x')
y = Symbol('y')
expr1 = sin(x+y)
expr2 = tan(2*x)
# 三角形的展開
r1 = expand_trig(expr1)
r2 = expand_trig(expr2)
print("===========r1==========")
print(r1)
print(latex(expr1))
print(latex(r1))
print("===========r2==========")
print(r2)
print(latex(expr2))
print(latex(r2))
(3)輸出:
\(\sin{\left (x + y \right )}\) --> \(\sin{\left (x \right )} \cos{\left (y \right )} + \sin{\left (y \right )} \cos{\left (x \right )}\)
\(\tan{\left (2 x \right )}\) --> \(\frac{2 \tan{\left (x \right )}}{- \tan^{2}{\left (x \right )} + 1}\)
(三)指數函數的簡化
1.指數的合並一-powsimp()
(1)說明:
powsimp()主要用於同底數或者同指數
(2)源代碼:
from sympy import *
# 假設 x與y 是正值, a 是真實的值
x = Symbol('x', positive=True)
y = Symbol('y', positive=True)
a = Symbol('a', real=True)
expr1 = x**2*x**3
expr2 = x**a*y**a
# 進行指數的合並,如果不符合,則不進行簡化
r1 = powsimp(expr1)
r2 = powsimp(expr2)
print("===========r1==========")
print(r1)
print(latex(expr1))
print(latex(r1))
print("===========r2==========")
print(r2)
print(latex(expr2))
print(latex(r2))
(3)輸出:
\(x^2x^3\) --> \(x^5\)
\(x^ay^b\) --> \(\left(x y\right)^{a}\)
2.指數的合並二-powdenest()
(1)說明:
powdenest()主要用於只有一個底數的不同指數。
(2)源代碼:
from sympy import *
# 假設 x與y 是正值, a 是真實的值
x = Symbol('x', positive=True)
y = Symbol('y', positive=True)
a = Symbol('a', real=True)
b = Symbol('b', real=True)
expr1 = (x**a)**b
expr2 = (((x**2)**a)**b)
# 進行指數的合並,如果不符合,則不進行簡化
r1 = powdenest(expr1)
r2 = powdenest(expr2)
print("===========r1==========")
print(r1)
print(latex(expr1))
print(latex(r1))
print("===========r2==========")
print(r2)
print(latex(expr2))
print(latex(r2))
(3)輸出:
\((x^a)^b\) --> \(x^{ab}\)
\({{x^2}^a}^b\) --> \(x^{2ab}\)
3.指數的展開:-expand_power_exp\expand_power_base
(1)說明:
- expand_power_exp()用於同底數的展開
- expand_power_base()用於同指數的展開
(2)源代碼:
from sympy import *
# 假設 x與y 是正值, a 是真實的值
x = Symbol('x', positive=True)
y = Symbol('y', positive=True)
a = Symbol('a', real=True)
b = Symbol('b', real=True)
expr1 = x**(a+b)
expr2 = (x*y)**a
# 進行指數的展開
# 底數相同展開
r1 = expand_power_exp(expr1)
# 指數相同展開
r2 = expand_power_base(expr2)
print("===========r1==========")
print(r1)
print(latex(expr1))
print(latex(r1))
print("===========r2==========")
print(r2)
print(latex(expr2))
print(latex(r2))
(3)輸出:
\(x^{a+b}\) --> \(x^{a} x^{b}\)
\(\left(x y\right)^{a}\) --> \(x^{a} y^{a}\)
(四)對數函數的簡化
1.對數的簡化-logcombine()
(1)說明:
logcombine()用於合並對數。
(2)源代碼:
from sympy import *
# 假設 x與y 是正值, a 是真實的值
x = Symbol('x', positive=True)
y = Symbol('y', positive=True)
n = Symbol('n', real=True)
expr1 = log(x) + log(y)
expr2 = log(x) - log(y)
expr3 = n*log(x)
# 對於對數的展開
r1 = logcombine(expr1)
r2 = logcombine(expr2)
r3 = logcombine(expr3)
print(r1)
print(r2)
print(r3)
(3)輸出:
\(log(x) + log(y)\) --> \(log(xy)\)
\(log(x)-log(y)\) --> \(\log(xy)\)
\(n\log(x)\) --> \(log(x^n)\)
2.對數的展開-expand_log()
(1)說明:
expand_log()用於對數的展開。
(2)源代碼:
from sympy import *
# 假設 x與y 是正值, a 是真實的值
x = Symbol('x', positive=True)
y = Symbol('y', positive=True)
n = Symbol('n', real=True)
expr1 = log(x*y)
expr2 = log(x/y)
expr3 = log(x**n)
# 對於對數的展開
r1 = expand_log(expr1)
r2 = expand_log(expr2)
r3 = expand_log(expr3)
print(r1)
print(r2)
print(r3)
(3)輸出:
\(log(xy)\) --> \(log(x)+log(y)\)
\(log(x/y)\) --> \(log(x)-\log(y)\)
\(log(x^n)\) --> \(n\log(x)\)
(五)其他函數的簡化
1.階乘與排列組合-factorial()\binomial()
(1)說明:
- factorial()用於求階乘
- binomial()用於求排列組合
(2)源代碼:
from sympy import *
n = Symbol("n")
# 求階乘
r1 = factorial(3)
r2 = factorial(n)
print(r1)
print(r2)
# 排列組合
print(binomial(4, 2))