5.3简化操作

目录

目录

前言

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

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

本章节对应官网的Simplification

官网的Simplification

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

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

1.最简化-simplify()

(1)说明:

simplify()是尽可能的让表达式最简化,其最简化的形式是不定的。

(2)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. expr1 = cos(x)**2+sin(x)**2
  4. expr2 = (x**3 + x**2 - x - 1)/(x**2 + 2*x + 1)
  5. # 简化表达式
  6. r1 = simplify(expr1)
  7. r2 = simplify(expr2)
  8. print(r1)
  9. 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)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. expr1 = (x+1)**2
  4. expr2 = ((x + 1)*(x - 2) - (x - 1)*x)
  5. # 展开
  6. r1 = expand(expr1)
  7. r2 = expand(expr2)
  8. print(r1)
  9. print(r2)

(3)输出:

\((x+1)^2\)-->\(x^2+2x+1\)

\((x + 1)(x - 2) - (x - 1)x\)-->-2

3.提公因式-factor()

(1)说明:

factor()是对展开的多项式进行提公因式

(2)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. expr1 = (x ** 3 - x ** 2 + x - 1)
  4. # 提公因数
  5. r1 = factor(expr1)
  6. print(r1)
  7. print(latex(expr1))
  8. print(latex(r1))

(3)输出:

\(x^{3} - x^{2} + x - 1\)-->\(\left(x - 1\right) \left(x^{2} + 1\right)\)

4.合并同类项-ceiling()

(1)说明:

对于多项式进行合并同类项

(2)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. y = Symbol('y')
  4. z = Symbol('z')
  5. expr1 = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
  6. expr2 = x**3+x*2-3*x**2+x**3-x**2+x*4-5
  7. # 合并同类项
  8. r1 = ceiling(expr1)
  9. r2 = ceiling(expr2)
  10. print(r1)
  11. print(r2)
  12. print(latex(r1))
  13. 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)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. expr1 = (x**2 + 2*x + 1)/(x**2 + x)
  4. expr2 = 1/x + (3*x/2 - 2)/(x - 4)
  5. # 约分消去分式的公因数
  6. r1 = cancel(expr1)
  7. # 简化分式
  8. r2 = cancel(expr2)
  9. # 结果
  10. print("结果:r1", r1)
  11. print("结果:r2", r2)
  12. # r1的表达式与结果
  13. print("r1的表达式与结果:")
  14. print(latex((x**2 + 2*x + 1)/(x**2 + x)))
  15. print(latex(r1))
  16. # r2的表达式与结果
  17. print("\nr2的表达式与结果:")
  18. print(latex(1/x + (3*x/2 - 2)/(x - 4)))
  19. 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)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. expr1 = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
  4. # 对于分式进行展开
  5. r1 = apart(expr1)
  6. print(r1)
  7. print(latex(r1))
  8. 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)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. expr1 = sin(x)**2+cos(x)**2
  4. expr2 = sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4
  5. # 进行三角形简化
  6. r1 = trigsimp(expr1)
  7. r2 = trigsimp(expr2)
  8. print("r1:", r1)
  9. print("r2:", r2)
  10. # r1的latex
  11. print("="*20)
  12. print("expr1-latex:", latex(expr1))
  13. print("r1-latex:", latex(r1))
  14. # r2的latex
  15. print("="*20)
  16. print("expr2-latex:", latex(expr2))
  17. 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)源代码:

  1. from sympy import *
  2. x = Symbol('x')
  3. y = Symbol('y')
  4. expr1 = sin(x+y)
  5. expr2 = tan(2*x)
  6. # 三角形的展开
  7. r1 = expand_trig(expr1)
  8. r2 = expand_trig(expr2)
  9. print("===========r1==========")
  10. print(r1)
  11. print(latex(expr1))
  12. print(latex(r1))
  13. print("===========r2==========")
  14. print(r2)
  15. print(latex(expr2))
  16. 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)源代码:

  1. from sympy import *
  2. # 假设 x与y 是正值, a 是真实的值
  3. x = Symbol('x', positive=True)
  4. y = Symbol('y', positive=True)
  5. a = Symbol('a', real=True)
  6. expr1 = x**2*x**3
  7. expr2 = x**a*y**a
  8. # 进行指数的合并,如果不符合,则不进行简化
  9. r1 = powsimp(expr1)
  10. r2 = powsimp(expr2)
  11. print("===========r1==========")
  12. print(r1)
  13. print(latex(expr1))
  14. print(latex(r1))
  15. print("===========r2==========")
  16. print(r2)
  17. print(latex(expr2))
  18. print(latex(r2))

(3)输出:

\(x^2x^3\) --> \(x^5\)

\(x^ay^b\) --> \(\left(x y\right)^{a}\)

2.指数的合并二-powdenest()

(1)说明:

powdenest()主要用于只有一个底数的不同指数。

(2)源代码:

  1. from sympy import *
  2. # 假设 x与y 是正值, a 是真实的值
  3. x = Symbol('x', positive=True)
  4. y = Symbol('y', positive=True)
  5. a = Symbol('a', real=True)
  6. b = Symbol('b', real=True)
  7. expr1 = (x**a)**b
  8. expr2 = (((x**2)**a)**b)
  9. # 进行指数的合并,如果不符合,则不进行简化
  10. r1 = powdenest(expr1)
  11. r2 = powdenest(expr2)
  12. print("===========r1==========")
  13. print(r1)
  14. print(latex(expr1))
  15. print(latex(r1))
  16. print("===========r2==========")
  17. print(r2)
  18. print(latex(expr2))
  19. 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)源代码:

  1. from sympy import *
  2. # 假设 x与y 是正值, a 是真实的值
  3. x = Symbol('x', positive=True)
  4. y = Symbol('y', positive=True)
  5. a = Symbol('a', real=True)
  6. b = Symbol('b', real=True)
  7. expr1 = x**(a+b)
  8. expr2 = (x*y)**a
  9. # 进行指数的展开
  10. # 底数相同展开
  11. r1 = expand_power_exp(expr1)
  12. # 指数相同展开
  13. r2 = expand_power_base(expr2)
  14. print("===========r1==========")
  15. print(r1)
  16. print(latex(expr1))
  17. print(latex(r1))
  18. print("===========r2==========")
  19. print(r2)
  20. print(latex(expr2))
  21. 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)源代码:

  1. from sympy import *
  2. # 假设 x与y 是正值, a 是真实的值
  3. x = Symbol('x', positive=True)
  4. y = Symbol('y', positive=True)
  5. n = Symbol('n', real=True)
  6. expr1 = log(x) + log(y)
  7. expr2 = log(x) - log(y)
  8. expr3 = n*log(x)
  9. # 对于对数的展开
  10. r1 = logcombine(expr1)
  11. r2 = logcombine(expr2)
  12. r3 = logcombine(expr3)
  13. print(r1)
  14. print(r2)
  15. 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)源代码:

  1. from sympy import *
  2. # 假设 x与y 是正值, a 是真实的值
  3. x = Symbol('x', positive=True)
  4. y = Symbol('y', positive=True)
  5. n = Symbol('n', real=True)
  6. expr1 = log(x*y)
  7. expr2 = log(x/y)
  8. expr3 = log(x**n)
  9. # 对于对数的展开
  10. r1 = expand_log(expr1)
  11. r2 = expand_log(expr2)
  12. r3 = expand_log(expr3)
  13. print(r1)
  14. print(r2)
  15. 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)源代码:

  1. from sympy import *
  2. n = Symbol("n")
  3. # 求阶乘
  4. r1 = factorial(3)
  5. r2 = factorial(n)
  6. print(r1)
  7. print(r2)
  8. # 排列组合
  9. 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. 有点深度的聊聊JDK动态代理

    在接触SpringAOP的时候,大家一定会被这神奇的功能所折服,想知道其中的奥秘,底层到底是如何实现的.于是,大家会通过搜索引擎,知道了一个陌生的名词:动态代理,慢慢的又知道了动态代理有多种实现方式, ...

  2. JVM基础系列第3讲:到底什么是虚拟机?

    我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的.类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 ...

  3. 呵呵,Python操作MSSQL的帮助类

    从网上找的,估计原文是:Python操作SQLServer示例 本文主要是Python操作SQLServer示例,包括执行查询及更新操作(写入中文). 需要注意的是:读取数据的时候需要decode(' ...

  4. Ajax上传图片以及上传之前先预览

    手头上有几个小项目用到了easyUI,一开始决定使用easyUI就注定了项目整体上前后端分离,基本上所有的请求都采用Ajax来完成.在文件上传的时候用到了Ajax上传文件,以及图片在上传之前的预览效果 ...

  5. 微服务SpringCloud—Config Server对称加密

    配置内容的加解密在Git仓库中明文存储配置属性的.很多场景下,对于某些敏感的配置内容(例如数据库账号.密码等),应当加密存储. Config对称加解密1.安装JCE默认情况下我们的JRE自带了JCE, ...

  6. 【Java基础】【04循环语句&方法】

    04.01_Java语言基础(循环结构概述和for语句的格式及其使用) A:循环结构的分类 for,while,do...while B:循环结构for语句的格式: for(初始化表达式;条件表达式; ...

  7. ES6躬行记(13)——类型化数组

    类型化数组(Typed Array)是一种处理二进制数据的特殊数组,它可像C语言那样直接操纵字节,不过得先用ArrayBuffer对象创建数组缓冲区(Array Buffer),再映射到指定格式的视图 ...

  8. java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println和System.err.println的区别 Java重定向System.out和System.err

    本文关键词: java 标准输出与标准错误    out与 err 区别 用法 联系  java中的out与err区别  System.out和System.err的区别 System.out.pri ...

  9. 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了如何使用Dapper持久化IdentityServer4(以下简称ids4)的信息,并实现了sqlserver和mysql两种 ...

  10. vue axios 批量删除 数组参数

    方法一:前端循环请求服务器端delete(id)方法 请问如何获得element-ui表格中的勾选项index,以实现批量删除功能 https://segmentfault.com/q/1010000 ...