sympy库使用:第3部分 简化数学表达式(翻译 tcy)

简化数学表达式 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  + 2x + 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(2x)

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) 应用身份12(force=True强迫转换)

默认简化不会应用于具有给定符号的表达式,除非它适用于所有复数; 如无效拒绝进行简化

身份1:x^a*x^b=x^(a+b)总能满足条件

身份2:x^a*y^a=(xy)^2  满足条件x,y>=0 aR  

身份3:(x^a)^b=x^(ab)  bZ

 

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!=12(n1)nn!=12(n1)n

5.2二项式系数    binomial(n, k)# binomial(n, k)

5.3伽玛功能,    gamma(z) 

                   ∞

 代表Γ(z)=∫t**(z-1)*e**(1)*e(t)dt对于正整数 z 是相同的 (z1)!

                   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)]

===========================================================

 

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/87387713