使用sympy进行表达式化简
符号运算系统最有用的一项特性就是数学表达式的化简。SymPy中有许多能够进行不同类型表达式化简的函数。其中,有一个通用的函数名为simplify,它能够试图以一种智能的方式应用这些化简函数,并最终得到表达式的最简形式。
下面给出一个simplify的例子:
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)*(x - 1)
simplify有一个缺陷,由于表达式“最简化”并没有一个良好的定义,SymPy只能使用库中已有的化简操作,使用启发式方法来决定其认为的“最简化”结果。 举例来说,对于表达式x^2+2x+1,使用simplify函数并不能化简成(x+1)^2 simplify的另外一个缺陷是,由于它要尝试使用不同的化简方法,并选择最佳的那个,这个过程要花费一些时间。如果你事先已经你确定要进行那一种化简,那么直接调用特定的化简函数,这是更佳的方法,能节省一些时间。指定化简函数,而不使用通用的simplify函数还有一个好处,就是可以保证输出的形式。例如,对于`factor`函数,如果施加到有理系数多项式上,那么得到的结果一定是最简因式。而simplify没有这种保证,因为它是完全启发式的,有时会错过可能的化简类型。 何时使用simplify比较好?当你在交互式的环境里,调用simplify函数,想看看它能把表达式化简到什么程度,然后你再选择几个特定的化简函数,看看是否还能再进一步简化。
展开表达式
表达式展开是SymPy中最常用的化简操作,对应的函数为expand。 很多数学理论都有展开的概念,我们在这里特指对多项式的展开。
例如:
>>> expand((x + 1)**2)
x**2 + 2*x + 1
>>> expand((x + 2)*(x - 3))
x**2 - x - 6
它能为我们完成两件事:展开,合并同类项。
因式分解
因式化对应的函数是factor,它能够将一个多项式约成几个最简整式的积的形式,也就是因式分解。
例如:
>>> factor(x**3 - x**2 + x - 1)
(x - 1)*(x**2 + 1)
>>> factor(x**2*z + 4*x*y*z + 4*y**2*z)
z*(x + 2*y)**2
factor函数的实现采用了一种完整的有理数多变量因式分解算法,能够保证因式为最简。
使用factor_list函数,能够将因式分解后得到的因式作为一个列表(List)返回。例如:
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2*y, 2)])
合并同类项
合并同类项对应的函数为collect,能将多项式中同类项合成一项。
例如:
>>> expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
>>> expr
x**3 - x**2*z + 2*x**2 + x*y + x - 3
>>> collected_expr = collect(expr, x)
>>> collected_expr
x**3 + x**2*(-z + 2) + x*(y + 1) - 3
分式化简
分式化简函数的名称是cancel
,它能化简任何分式函数,并能将其约到最简形式。
下面给出几个例子:
>>> cancel((x**2 + 2*x + 1)/(x**2 + x))
(x + 1)/x>>> expr = 1/x + (3*x/2 - 2)/(x - 4)
>>> expr
(3*x/2 - 2)/(x - 4) + 1/x
>>> cancel(expr)
(3*x**2 - 2*x - 8)/(2*x**2 - 8*x)>>> expr = (x*y**2 - 2*x*y*z + x*z**2 + y**2 - 2*y*z + z**2)/(x**2 - 1)
>>> expr
(x*y**2 - 2*x*y*z + x*z**2 + y**2 - 2*y*z + z**2)/(x**2 - 1)
>>> cancel(expr)
(y**2 - 2*y*z + z**2)/(x - 1)
分式裂项
分式裂项函数的名称是apart,它能将一个分式分解为几个分式的和、差。且分解出来的分式,都是最简形式。
例如:
>>> expr = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
>>> expr
(4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)
>>> apart(expr)
(2*x - 1)/(x**2 + x + 1) - 1/(x + 4) + 3/x
三角化简
由三角函数组成的表达式,可以使用trigsimp函数来化简。
下面给出三个例子:
>>> trigsimp(sin(x)**2 + cos(x)**2)
1>>> trigsimp(sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4)
cos(4*x)/2 + 1/2>>> trigsimp(sin(x)*tan(x)/sec(x))
sin(x)**2
trigsimp函数也能够化简双曲三角函数:
>>> trigsimp(cosh(x)**2 + sinh(x)**2)
cosh(2*x)>>> trigsimp(sinh(x)/tanh(x))
cosh(x)
与simplify相似的是,trigsimp对输入的表达式应用多种三角变换公式,使用启发式的方法来返回“最好”的那一个。
三角展开
要展开三角函数,可以使用expand_trig
函数,它能够使用三角恒等式,将三角表达式展开。
例如:
>>> expand_trig(sin(x + y))
sin(x)*cos(y) + sin(y)*cos(x)>>> expand_trig(tan(2*x))
2*tan(x)/(-tan(x)**2 + 1)
指数化简
若表达式中存在指数可以化解的情况,可以使用powsimp函数。 指数化简包含合并指数和合并基底两种情况。
例如:
>>> powsimp(x**a*x**b)
x**(a + b) >>> powsimp(x**a*y**a)
(x*y)**a
注意,对于示例中的第二条语句(合并基底),要满足一定的条件才能够进行。首先,x,y需为正,且a需为实数。因此,我们在创建symbols的时候,必须指定:
x, y = symbols('x y', positive=True)
a, b = symbols('a b', real=True)
这样,示例中的语句二才能进行合并基底,否则,将显示原表达式,不做任何处理。
指数展开
与上一节的指数化简相对的,是指数展开,同样地,指数展开包含两个部分,指数展开与基底展开。
其中,指数展开对应的函数为expand_power_exp,基底展开对应的函数为expand_power_base。
例如:
>>> expand_power_exp(x**(a + b))
x**a*x**b >>> expand_power_base((x*y)**a)
x**a*y**a
对于语句二,symbols要与上一节中的基底合并满足同样的条件,才能得正确得到结果。
化简指数的指数
对于表达式(x**a)**b,含有两层指数,通过使用powdenest函数,能将其简化为一层的结构。
首先,这种化简需要满足下列的条件,才能正确进行:
x = symbols('x', positive=True)
也就是基底x要大于0。
例如:
>>> powdenest((x**a)**b)
x**(a*b)
对数展开
首先要说明一点,在数学中,log和ln是不同的概念,而在SymPy中,两个是等同的,都指自然对数。
对数成立需要满足一定条件,我们与要定义满足条件的变量:
x, y = symbols('x y', positive=True)
n = symbols('n', real=True)
指数展开函数为expand_log,能够套用指数展开公式来完成展开操作。
例如:
>>> 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(x**n))
n*log(x)
对数合并
与对数展开相对应地,是对数合并操作,函数名称为logcombine。
变量需要满足与上一节中同样的条件。
例如:
>>> logcombine(log(x) + log(y))
log(x*y) >>> logcombine(n*log(x))
log(x**n)
使用sympy进行表达式化简相关推荐
- “后序遍历二叉运算树进行Lambda演算的化简”带来的联系
今天闲来无事,想到一个自以为绝妙的想法,那就是用后序遍历二叉树Lambda演算的化简. 数据结构与算法中,我们想写个计算器就必须遇到一个问题,表达式求值!其实表达式很多就是我们所谓的现实生活中的问题解 ...
- 「SymPy」符号运算(2) 各种形式输出、表达式的化简合并与展开
目录 导言 输出 替换.演化 化简.合并与展开 化简 展开 合并 `cancel`函数 `apart`函数 `rewrite`函数 `expand_func`函数 导言 在前一篇文章中,我们简单学习了 ...
- matlab如何化简表达式/多项式?
matlab如何化简表达式/多项式? | 浏览:2520 | 更新:2014-03-09 22:11 | 标签:matlab 1 2 3 4 5 6 7 分步阅读 本片经验讲述一下如何利用matlab ...
- Matlab化简符号表达式
化简符号表达式计算机毕竟还是挺笨的, 经过一系列的符号计算后, 得到的结果可能只有它自己才能看懂, Matlab提供大量函数以用于符号表达式的化简. collect(f): 函数用途是合并多项式中相同 ...
- matlab符号表达式的化简
simplify(f) 对符号表达式进行化简,它利用各种类型的代数恒等式,包括求和. 积分.三角函数.指数函数以及 Bessel 函数等来化简符号表达式 simple(f) 对符号表达式尝试多种不同的 ...
- 《 线性代数及其应用 (原书第4版)》——1.2 行化简与阶梯形矩阵
本节书摘来自华章出版社< 线性代数及其应用 (原书第4版)>一书中的第1章,第1.2节,作者:(美)戴维C. 雷(David C. Lay)马里兰大学帕克学院 著刘深泉 张万芹 陈玉珍 包 ...
- 矩阵化简计算器_论一台图形计算器,如何拯救你的SAT2数学
为了SAT,SAT2以及AP考试,很多同学都准备了TI-84,TI-Nspire以及各种各样的图形计算器来应对考试.这些计算器最大的共同点,就是贵,但是贵一定有贵的道理.那么在整场考试中,你有多少题目 ...
- FPGA:逻辑函数的卡诺图化简法
文章目录 最小项与最小项表达式 最小项的定义 最小项的性质 逻辑函数的最小项表达式 卡诺图化简法 用卡诺图表示逻辑函数 卡诺图的引出 两变量卡诺图 三变量卡诺图 四变量卡诺图 已知逻辑函数真值表,画卡 ...
- 看完这篇还不会化简卡诺图?你来打我
最通俗易懂的的卡诺图化简教程 首先我们来介绍一下什么是卡诺图: 卡诺图是逻辑函数的一种图形表示.一个逻辑函数的卡诺图就是将此函数的最小项表达式中的各最小项相应地填入一个方格图内,此方格图称为卡诺图. ...
最新文章
- 极客新闻——18、领导和下属之间到底是什么样的关系?
- Union和Union All的区别
- 开发提交审核流程_小游戏上线发布全流程详解?
- Thrift RPC 系列教程(3)——模块化
- Assessing systemic risk due to fire sales spillover through maximum entropy network reconstruction
- Java 多维数组遍历
- ESP32 flash容量配置
- Linux 下解压文件命令大全
- 【程序猿猴年金牌福利包】让你远离Bug,紧跟春天的脚步
- php 清除英文字母,计算器清除键的字母是什么
- lorawan的工作原理_LoRaWAN协议的工作原理是怎样的
- CSS3选择器:nth-child和:nth-of-type之间的差异的那些事儿
- python读取sqlserver的数据_Python:使用并发未来进程P读取sqlserver数据
- 使用ant design Pro开发项目的小结
- 一枚比特币30多万,家用电脑24小时挖矿,多久才能挖到一枚?
- 【译】JavaScript面试问题:事件委托和this
- SHELL TIPS: GNU SCREEN 的一些小技巧
- 【POJ2318】TOYS(点在凸多边形内判定---模版暴力/二分)
- 情人节--我们依旧单身(制作属于自己的QQ拼音皮肤)(带全部ps素材)
- 服务器远程桌面 设置 时间,如何设置使远程桌面连接时间变长?