简化数学表达式 2019/2/15
x,y,z=symbols('x y z')
init_printing(use_unicode=True)# 将启用漂亮的打印
===========================================================
1.simplify#通用简化(尝试多种方法,速度慢;不能简化成幂指数的形式)
simplify(sin(x)**2 + cos(x)**2) #1
simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))#x - 1
2.多项式/有理函数简化
2.1.factor()提公因式;expand()表达式展开(将多项式置于单项式和的规范形式)
expand,factor任何类型的表达式(输入必是有理数的多项式)
expand((x + 1)**2) #x^2 + 2⋅x + 1
factor(x**3 - x**2 + x - 1) #(x - 1)*(x**2 + 1)提公因式
2.2.collect()以幂形式
expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3#x**3 - x**2*z + 2*x**2 + x*y + x - 3
expr =collect(expr, x) # x**3 + x**2*(-z + 2) + x*(y + 1) – 3
collected_expr.coeff(x, 2) #-z + 2给出的系数
2.3.cancel()以分数形式p/q
pq均为int;p和 q 没有共同因子的扩展多项式;factor有类似功能,效率高于cancel
cancel((x**2 + 2*x + 1)/(x**2 + x))#(x + 1)/x
2.4.apart()对有理函数执行部分分数分解(见备注1)
expr = 1/(x**2+2*x-3)# 1/(x**2 + 2*x - 3)
apart(expr) #-1/(4*(x + 3)) + 1/(4*(x - 1))
2.4 together(expr, x)代数式的合并(相当于展开的逆运算):
together(1/x + 1/y + 1/z)#x*y + x*z + y*z
2.5trigsimp()三角简化(倾向于使它们更小;适用三角函数,双曲线三角函数)
cos(acos(x))#x
asin(1) #π/2
trigsimp(sin(x)*tan(x)/sec(x)) # sin(x)**2
trigsimp(cosh(x)**2 + sinh(x)**2)#cosh(2⋅x)
2.5expand_trig扩展三角函数(倾向于使三角表达式;更大适用多变量)
expand_trig(sin(x + y)) #sin(x)⋅cos(y) + sin(y)⋅cos(x)
trigsimp(sin(x)*cos(y) + sin(y)*cos(x))#sin(x + y)
===========================================================
3.幂指数化简: (结果以幂指数的形式)
3.1powsimp(force=True) 应用身份1和2(force=True强迫转换)
默认简化不会应用于具有给定符号的表达式,除非它适用于所有复数; 如无效拒绝进行简化
身份1:x^a*x^b=x^(a+b)总能满足条件
身份2:x^a*y^a=(xy)^2 满足条件x,y>=0 a∈R
身份3:(x^a)^b=x^(ab) b∈Z
x, y = symbols('x y', positive=True)
a, b = symbols('a b', real=True)
z, t, c = symbols('z t c')
sqrt(x) == x**Rational(1, 2)#True sqrt(x)只是一个快捷方式
powsimp(x**a*x**b)#x**(a + b)
powsimp(x**a*y**a)#(x*y)**a
powsimp(t**c*z**c) # t**c*z**c如无效拒绝简化;t,z无指定变量正负
powsimp(t**c*z**c, force=True)# (t*z)**c强迫转换
3.2将幂指数分开expand_power_exp()/expand_power_base()应用身份1和2
expand_power_exp(x**(a + b))#x**a * x**b
expand_power_base((x*y)**a) #x**a * y**a
expand_power_base((z*t)**c) # (z*t)**c z,t无指定正负
expand_power_base((z*t)**c, force=True)#t**c * z**c强制转换
3.3.powdenest() 从左到右应用身份3
powdenest((x**a)**b)#x**(a*b)
powdenest((z**a)**b)#(z**a)**b
powdenest((z**a)**b, force=True)#z**(a*b)强制转换
===========================================================
4.对数ln = log(,None)
身份1:log(xy)=log(x)+log(y) x,y>0 n ∈ R
身份2:log(x^n)=nlog(x)
x, y = symbols('x y', positive=True)
n = symbols('n', real=True)
z, t, c = symbols('z t c')
4.1expand_log()对数拆分 从左到右应用标识1和2
expand_log(log(x*y)) #log(x) + log(y)
expand_log(log(x/y)) #log(x) - log(y)
expand_log(log(x**2)) #2*log(x)
expand_log(log(z*t)) # log(t*z)
expand_log(log(z**2)) # log(z**2)
expand_log(log(z**2), force=True)#2*log(z) 强制转换
4.2logcombine 对数合并;从右到左应用身份1和2
logcombine(log(x) + log(y))#log(x*y)
logcombine(n*log(x)) #log(x**n) ⎠
logcombine(n*log(z)) #n*log(z)
logcombine(n*log(z), force=True)#log(z**n) ⎠
===========================================================
5.特殊功能
x, y, z = symbols('x y z')
k, m, n = symbols('k m n')
5.1阶乘factorial(n) factorial(n)#n! 代表n!=1⋅2⋯(n−1)⋅nn!=1⋅2⋯(n−1)⋅n
5.2二项式系数 binomial(n, k)# binomial(n, k)
5.3伽玛功能, gamma(z)
∞
代表Γ(z)=∫t**(z-1)*e**(−1)*e(−t)dt对于正整数 z 是相同的 (z−1)!
0
gamma(z)#Γ(z)
===========================================================
6.其他简化方法
n, k = symbols('n k', integer = True)
combsimp(factorial(n)/factorial(n - 3))# n*(n - 2)*(n - 1) 简化组合表达式
用gamma函数简化表达式或使用非整数参数简化组合函数
gammasimp(gamma(x)*gamma(1 - x))# pi/sin(pi*x)
===========================================================
7.重写
tan(x).rewrite(sin) # 2*sin(x)**2/sin(2*x) 根据函数重写表达式
expand_func(gamma(x + 3)) #x*(x + 1)*(x + 2)*gamma(x) 根据某些身份扩展特殊功能
hyperexpand
hyperexpand(hyper([1, 1], [2], z))# -log(-z + 1)/z用更多标准函数重写
===========================================================
8构造分数
syms = symbols('a0:5')
a0, a1, a2, a3, a4 = syms
def list_to_frac(l):
expr = Integer(0)
for i in reversed(l[1:]):
expr += i
expr = 1/expr
return l[0] + expr
frac = list_to_frac(syms)#a0 + 1/(a1 + 1/(a2 + 1/(a3 + 1/a4)))
frac = cancel(frac)# 标准的有理函数形式
(a0*a1*a2*a3*a4 + a0*a1*a2 + a0*a1*a4 + a0*a3*a4 + a0 + a2*a3*a4 + a2 + a4)/(a1*a2*a3*a4 + a1*a2 + a1*a4 + a3*a4 + 1)
===========================================================
9备注1:部分分式分解
定义:将有理函数分解成许多次数较低有理函数和的形式,降低分子或分母多项式的次数
分解后的分式需满足以下条件:
分式的分母需为不可约多项式或其乘幂。
分式的分子多项式次数需比其分母多项式次数要低。
说明:实际是将f(x)/g(x)多项式化为∑ ai/[hi(x)]形式
i
实例:
1)分解f(x)=1/(x^2+2x-3):
2)分母分裂:q(x)= (x^2+2x-3) =(x+3)(x-1)
3)得到部分分式,设常数A和B:f(x)= 1/(x^2+2x-3)=A/(x+3)+B/(x-1)
4)使等式左侧等于1:1=A(x-1)+B(x+3)
5)将x=-3带入上式得出A =-1/4,再代入x =1得到B =1/4,
从而求得:f(x)=1/(x^2+2x-3)=1/4[-1/(x+3)+1/(x-1)]
===========================================================