5.3Python数据处理篇之Sympy系列(三)---简化操作
5.3简化操作
目录
前言
既然sympy是对于符号的运算,那么它对于符号表达式的简化与展开一定很强大。
今天我们学习的是符号表达式的简化与展开。
本章节对应官网的Simplification
(一)有理数与多项式的简化
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)输出:
\]
---》
\]

(二)三角函数的简化
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)说明:
- expand_power_exp()用于同底数的展开
- 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)说明:
- factorial()用于求阶乘
- 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系列(三)---简化操作的更多相关文章
- 4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图
目录 前言 (一)plt.plot()函数的本质 ==1.说明== ==2.源代码== ==3.展示效果== (二)plt.plot()函数缺省x时 ==1.说明== ==2.源代码== ==3.展示 ...
- 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片
目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...
- 5.6Python数据处理篇之Sympy系列(六)---矩阵的操作
目录 目录 前言 (一)矩阵的创建-Matrix() 1.说明: 2.源代码: 3.输出: (二)常用的构造矩阵 1.说明: 2.源代码: 3.输出: (三)基本操作 1.说明: 2.源代码: 3.输 ...
- 5.5Python数据处理篇之Sympy系列(五)---解方程
目录 目录 前言 (一)求解多元一次方程-solve() 1.说明: 2.源代码: 3.输出: (二)解线性方程组-linsolve() 1.说明: 2.源代码: 3.输出: (三)解非线性方程组-n ...
- 5.4Python数据处理篇之Sympy系列(四)---微积分
目录 目录 前言 (一)求导数-diff() 1.一阶求导-diff() 2.多阶求导-diff() 3.求偏导数-diff() (二)求积分-integrate() (三)求极限-limit() ( ...
- 5.2Python数据处理篇之Sympy系列(二)---Sympy的基本操作
目录 目录 前言 (一)符号的初始化与输出设置-symbol() symbols() latex() 1.作用: 2.操作: (二)替换符号-subs(old,new) 1.说明: 2.源代码: 3. ...
- 5.1Python数据处理篇之Sympy系列(一)---Sympy的大体认识
目录 目录 前言 目录 前言 sympy是python一个强大的数学符号运算第三方库,具体的功能请看下面操作 官网教程: https://docs.sympy.org/latest/tutorial/ ...
- 3.6Python数据处理篇之Numpy系列(六)---Numpy随机函数
目录 目录 前言 (一)基础的随机函数 (二)轴的随机函数 (三)概率的随机函数 目录 前言 前一段日子学了numpy,觉得无趣,没有学完,不过后来看了看matplotlib,sympy等库时,频频用 ...
- 4.13Python数据处理篇之Matplotlib系列(十三)---轴的设置
目录 目录 前言 (一)设置轴的范围 1.同时对于x,y轴设置 2.分别对与x,y轴的设置 (二)设置刻度的大小 1.普通的刻度设置 2.添加文本的刻度设置 3.主副刻度的设置 (三)设置轴的数据 1 ...
随机推荐
- 利用U盘安装win2008r2系统的步骤
我们在公司或者家里,经常要安装各种系统,最近公司需要重新安装win2008r2系统.折腾了一天的时间,终于把系统装好了.将安装的步骤记录下来,方便大家查看,自己也做个记录. 1 准备win2008r2 ...
- scala转换date提取年月日时分秒
从数据库提取出来的时间为 String 格式,现在需要转换为 date 并提取出里面的 小时 时间段: import java.text.SimpleDateFormat import java.ut ...
- AI 这么优秀,连我鉴黄师的饭碗都抢了
色情行业,或许是对信息渠道最敏锐.利用各类信息渠道进行传播最“充分”的“行业”.这些年,社交 App.直播.短视频等新的互联网应用方式,都难逃色情内容的“骚扰”.哪里人多,色情内容就能立刻扑过去,在海 ...
- 面试小知识:MySQL索引相关
前言 本模板主要是一些面试相关的题目,对于每一道问题,我会提供简单的解答,答案的来源主要是基于自己看了各方资料之后的理解,如果有错的,欢迎指点出来. 1. 什么是最左前缀原则? 以下回答全部是基于My ...
- Linux 文件权限于目录配置
用户与用户组 我們以王三毛為例,王三毛這個『檔案』的擁有者為王三毛,他屬於王大毛這個群組, 而張小豬相對於王三毛,則只是一個『其他人(others)』而已. 不過,這裡有個特殊的人物要來介紹的,那就是 ...
- python 操作RabbitMq详解
一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信. ...
- Spring Boot 2.x(九):遇到跨域不再慌
什么是跨域 首先,我们需要了解一下一个URL是怎么组成的: // 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 http: + // + www.baidu.com + :8080/ ...
- 拯救老旧工程,记桥接SpringMVC与Stripes框架
背景: 公司基础设施部门推出了自己的微服务框架(以下简称M),要求所有业务应用都要接入进去,但坑爹的是M只提供了SpringMVC工程的support,对于采用Stripes作为MVC框架的应用并不支 ...
- springboot之JdbcTemplate
springboot可以使用JdbcTemplate进行数据库访问,代码如下 添加pom文件 <parent> <groupId>org.springframework.boo ...
- 如何解决angular不自动生成spec.ts文件
"schematics":{ "@schematics/angular:component": { "styleext": ...