5.3簡(jiǎn)化操作
目錄
[TOC]
前言
既然sympy是對(duì)于符號(hào)的運(yùn)算,那么它對(duì)于符號(hào)表達(dá)式的簡(jiǎn)化與展開(kāi)一定很強(qiáng)大。
今天我們學(xué)習(xí)的是符號(hào)表達(dá)式的簡(jiǎn)化與展開(kāi)。
本章節(jié)對(duì)應(yīng)官網(wǎng)的Simplification
(一)有理數(shù)與多項(xiàng)式的簡(jiǎn)化
1.最簡(jiǎn)化-simplify()
(1)說(shuō)明:
simplify()是盡可能的讓表達(dá)式最簡(jiǎn)化,其最簡(jiǎn)化的形式是不定的。
(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)
# 簡(jiǎn)化表達(dá)式
r1 = simplify(expr1)
r2 = simplify(expr2)
print(r1)
print(r2)
(3)輸出:
-->1
-->

2.展開(kāi)-expand()
(1)說(shuō)明:
expand()是對(duì)括號(hào)里的多項(xiàng)式進(jìn)行展開(kāi)。
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = (x+1)**2
expr2 = ((x + 1)*(x - 2) - (x - 1)*x)
# 展開(kāi)
r1 = expand(expr1)
r2 = expand(expr2)
print(r1)
print(r2)
(3)輸出:
-->
-->-2

3.提公因式-factor()
(1)說(shuō)明:
factor()是對(duì)展開(kāi)的多項(xiàng)式進(jìn)行提公因式
(2)源代碼:
from sympy import *
x = Symbol('x')
expr1 = (x ** 3 - x ** 2 + x - 1)
# 提公因數(shù)
r1 = factor(expr1)
print(r1)
print(latex(expr1))
print(latex(r1))
(3)輸出:
-->

4.合并同類(lèi)項(xiàng)-ceiling()
(1)說(shuō)明:
對(duì)于多項(xiàng)式進(jìn)行合并同類(lèi)項(xiàng)
(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
# 合并同類(lèi)項(xiàng)
r1 = ceiling(expr1)
r2 = ceiling(expr2)
print(r1)
print(r2)
print(latex(r1))
print(latex(r2))
(3)輸出:
-->
-->

5.簡(jiǎn)化分式-cancel()
(1)說(shuō)明:
cancle既有約分又有簡(jiǎn)化的作用
(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)
# 約分消去分式的公因數(shù)
r1 = cancel(expr1)
# 簡(jiǎn)化分式
r2 = cancel(expr2)
# 結(jié)果
print("結(jié)果:r1", r1)
print("結(jié)果:r2", r2)
# r1的表達(dá)式與結(jié)果
print("r1的表達(dá)式與結(jié)果:")
print(latex((x**2 + 2*x + 1)/(x**2 + x)))
print(latex(r1))
# r2的表達(dá)式與結(jié)果
print("\nr2的表達(dá)式與結(jié)果:")
print(latex(1/x + (3*x/2 - 2)/(x - 4)))
print(latex(r2))
(3)輸出:
--》
--》

6.分式展開(kāi)-apart()
(1)說(shuō)明:
原本只有一項(xiàng)的分式表達(dá)式,展開(kāi)為多項(xiàng)的分式表達(dá)式。
(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)
# 對(duì)于分式進(jìn)行展開(kāi)
r1 = apart(expr1)
print(r1)
print(latex(r1))
print(latex(expr1))
(3)輸出:
---》

(二)三角函數(shù)的簡(jiǎn)化
1.三角形的簡(jiǎn)化-trigsimp()
(1)說(shuō)明:
使用trigsimp()可以簡(jiǎn)化三角函數(shù),反三角函數(shù)也可以。
(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
# 進(jìn)行三角形簡(jiǎn)化
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)輸出:
-->
-->

2.三角形的展開(kāi)-expand_trig()
(1)說(shuō)明:
使用expand_trig()可以展開(kāi)三角函數(shù),同樣反三角函數(shù)也可以。
(2)源代碼:
from sympy import *
x = Symbol('x')
y = Symbol('y')
expr1 = sin(x+y)
expr2 = tan(2*x)
# 三角形的展開(kāi)
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)輸出:
-->
-->

(三)指數(shù)函數(shù)的簡(jiǎn)化
1.指數(shù)的合并一-powsimp()
(1)說(shuō)明:
powsimp()主要用于同底數(shù)或者同指數(shù)
(2)源代碼:
from sympy import *
# 假設(shè) x與y 是正值, a 是真實(shí)的值
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
# 進(jìn)行指數(shù)的合并,如果不符合,則不進(jìn)行簡(jiǎn)化
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)輸出:
-->
-->

2.指數(shù)的合并二-powdenest()
(1)說(shuō)明:
powdenest()主要用于只有一個(gè)底數(shù)的不同指數(shù)。
(2)源代碼:
from sympy import *
# 假設(shè) x與y 是正值, a 是真實(shí)的值
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)
# 進(jìn)行指數(shù)的合并,如果不符合,則不進(jìn)行簡(jiǎn)化
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)輸出:
-->
-->

3.指數(shù)的展開(kāi):-expand_power_exp\expand_power_base
(1)說(shuō)明:
- expand_power_exp()用于同底數(shù)的展開(kāi)
- expand_power_base()用于同指數(shù)的展開(kāi)
(2)源代碼:
from sympy import *
# 假設(shè) x與y 是正值, a 是真實(shí)的值
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
# 進(jìn)行指數(shù)的展開(kāi)
# 底數(shù)相同展開(kāi)
r1 = expand_power_exp(expr1)
# 指數(shù)相同展開(kāi)
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)輸出:
-->
-->

(四)對(duì)數(shù)函數(shù)的簡(jiǎn)化
1.對(duì)數(shù)的簡(jiǎn)化-logcombine()
(1)說(shuō)明:
logcombine()用于合并對(duì)數(shù)。
(2)源代碼:
from sympy import *
# 假設(shè) x與y 是正值, a 是真實(shí)的值
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)
# 對(duì)于對(duì)數(shù)的展開(kāi)
r1 = logcombine(expr1)
r2 = logcombine(expr2)
r3 = logcombine(expr3)
print(r1)
print(r2)
print(r3)
(3)輸出:
-->
-->
-->

2.對(duì)數(shù)的展開(kāi)-expand_log()
(1)說(shuō)明:
expand_log()用于對(duì)數(shù)的展開(kāi)。
(2)源代碼:
from sympy import *
# 假設(shè) x與y 是正值, a 是真實(shí)的值
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)
# 對(duì)于對(duì)數(shù)的展開(kāi)
r1 = expand_log(expr1)
r2 = expand_log(expr2)
r3 = expand_log(expr3)
print(r1)
print(r2)
print(r3)
(3)輸出:
-->
-->
--> ?

(五)其他函數(shù)的簡(jiǎn)化
1.階乘與排列組合-factorial()\binomial()
(1)說(shuō)明:
- factorial()用于求階乘
- binomial()用于求排列組合
(2)源代碼:
from sympy import *
n = Symbol("n")
# 求階乘
r1 = factorial(3)
r2 = factorial(n)
print(r1)
print(r2)
# 排列組合
print(binomial(4, 2))
(3)輸出:
