5.3简化操作

目录

目录

前言

既然sympy是对于符号的运算,那么它对于符号表达式的简化与展开一定很强大。

今天我们学习的是符号表达式的简化与展开。

本章节对应官网的Simplification

官网的Simplification

https://docs.sympy.org/latest/tutorial/simplification.html

(一)有理数与多项式的简化

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)输出:

\[\frac{4x^3 + 21x^2 + 10x + 12}{x^4 + 5x^3 + 5x^2 + 4x}
\]

---》

\[\frac{2 x - 1}{x^{2} + x + 1} - \frac{1}{x + 4} + \frac{3}{x}
\]

(二)三角函数的简化

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)说明:

  1. expand_power_exp()用于同底数的展开
  2. 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)说明:

  1. factorial()用于求阶乘
  2. binomial()用于求排列组合

(2)源代码:

from sympy import *

n = Symbol("n")

# 求阶乘
r1 = factorial(3)
r2 = factorial(n) print(r1)
print(r2) # 排列组合
print(binomial(4, 2))

(3)输出:

作者:Mark

日期:2019/03/16 周六

5.3Python数据处理篇之Sympy系列(三)---简化操作的更多相关文章

  1. 4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图

    目录 前言 (一)plt.plot()函数的本质 ==1.说明== ==2.源代码== ==3.展示效果== (二)plt.plot()函数缺省x时 ==1.说明== ==2.源代码== ==3.展示 ...

  2. 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片

    目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...

  3. 5.6Python数据处理篇之Sympy系列(六)---矩阵的操作

    目录 目录 前言 (一)矩阵的创建-Matrix() 1.说明: 2.源代码: 3.输出: (二)常用的构造矩阵 1.说明: 2.源代码: 3.输出: (三)基本操作 1.说明: 2.源代码: 3.输 ...

  4. 5.5Python数据处理篇之Sympy系列(五)---解方程

    目录 目录 前言 (一)求解多元一次方程-solve() 1.说明: 2.源代码: 3.输出: (二)解线性方程组-linsolve() 1.说明: 2.源代码: 3.输出: (三)解非线性方程组-n ...

  5. 5.4Python数据处理篇之Sympy系列(四)---微积分

    目录 目录 前言 (一)求导数-diff() 1.一阶求导-diff() 2.多阶求导-diff() 3.求偏导数-diff() (二)求积分-integrate() (三)求极限-limit() ( ...

  6. 5.2Python数据处理篇之Sympy系列(二)---Sympy的基本操作

    目录 目录 前言 (一)符号的初始化与输出设置-symbol() symbols() latex() 1.作用: 2.操作: (二)替换符号-subs(old,new) 1.说明: 2.源代码: 3. ...

  7. 5.1Python数据处理篇之Sympy系列(一)---Sympy的大体认识

    目录 目录 前言 目录 前言 sympy是python一个强大的数学符号运算第三方库,具体的功能请看下面操作 官网教程: https://docs.sympy.org/latest/tutorial/ ...

  8. 3.6Python数据处理篇之Numpy系列(六)---Numpy随机函数

    目录 目录 前言 (一)基础的随机函数 (二)轴的随机函数 (三)概率的随机函数 目录 前言 前一段日子学了numpy,觉得无趣,没有学完,不过后来看了看matplotlib,sympy等库时,频频用 ...

  9. 4.13Python数据处理篇之Matplotlib系列(十三)---轴的设置

    目录 目录 前言 (一)设置轴的范围 1.同时对于x,y轴设置 2.分别对与x,y轴的设置 (二)设置刻度的大小 1.普通的刻度设置 2.添加文本的刻度设置 3.主副刻度的设置 (三)设置轴的数据 1 ...

随机推荐

  1. [Abp 源码分析]九、事件总线

    0.简介 事件总线就是订阅/发布模式的一种实现,本质上事件总线的存在是为了降低耦合而存在的. 从上图可以看到事件由发布者发布到事件总线处理器当中,然后经由事件总线处理器调用订阅者的处理方法,而发布者和 ...

  2. 受到 1 万点暴击,二狗子被 DDoS 攻击的惨痛经历

    二狗子的遭遇 “好消息,好消息,免费 DDoS 攻击软件上线了,性感黑客在线攻击,帮您攻克所有商业难题.”二狗子不知道在看着什么网站,新买的 Mac 中发出热闹的声音. 二狗子想知道“DDoS 是什么 ...

  3. 成熟的 Git 分支模型

    个人博客原文: 成熟的 Git 分支模型 今天介绍一下工作中会用到的 Git 分支模型. 先贴上图以表敬意 闲言 在学校不管是自己写课程设计还是给老师做项目,有 2 到 3 个人一起协作开发时就会使用 ...

  4. 上下div高度动态自适应--另类处理方案

    这段时间在工作中遇到一个看似较为棘手的问题.问题描述:查询报表页面分为上下两部分,上部分为条件输入区域,下部分为报表展示区域.客户要求做到默认满屏(但要动态适应不同的窗体大小,也就是浏览器窗体用户会手 ...

  5. MacPro4,1升级到MacPro5,1

    收了一台老MacPro,2009年版本,准确型号是"MacPro4,1".机器很好,美中不足的是,太老了.硬件还好说,很多部件都可以单独采购升级,特别是有了淘宝,几乎只要有的东西, ...

  6. Linux~Sh脚本一点自己的总结

    从.netCore开源项目来看,eShopOnContainers来说,它的部署是跨平台的,可以部署在linux,docker上,在linux上运行它也可以写一些集成的小脚本,这是微信工程师为我们提供 ...

  7. nginx部署~dotnetCore+mvc网站502

    这个不是nginx的问题,也不是dotnet core的问题,也不是mvc的问题,更不是防火墙的问题! 原因在于这个SeLinux 把它关了就可以了 setsebool -P httpd_can_ne ...

  8. Paramiko模块简单使用

    介绍 Paramiko 一个第三方包,需要单独安装我们知道远程批量主机管理,比如ansible.Fabric,不需要安装客户端的远程执行命令等,这些都是基于Python原生的SSH,相当于模拟了一个S ...

  9. Linux基础知识第四讲,文件内容命令

    目录 一丶常用命令 1.cat命令演示以及常用选项 2.grep 搜索命令的使用 3.echo 以及 重定向的使用 4.管道概念 一丶常用命令 序号 命令 对应英文 作用 01 cat 文件名 con ...

  10. .NET Core中Object Pool的简单使用

    前言 复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题. 举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接. 那么复用的意义在那里呢? 简单来说就是减少不必要的资 ...