查看原文
其他

Python圈中的符号计算库-Sympy

2018-01-26

作者 大邓

import math math.sqrt(8)2.8284271247461903

我们知道,

那么我们看看Python中结果

math.sqrt(8).math.sqrt(8)8.000000000000002

本以为会得到8.0,但没想到得到8.000000000000002

一、为什么会这样?

简单的说Python对给定的一个有限位数的数字进行计算,python认为

那么

此外

经历过高中数学的朋友们估计会很熟悉下面这样的表达

而不是

如果我们平常计算的任务常常有类似于上面的例子这样的表达式,那么直接用python计算其结果只是真实值的逼近。如果这样的计算很大很多,误差会逐渐积累,这是我们不能忍受的,所以这时候就需要Python能处理

这种数学符号计算。

二、什么是数学符号计算?

数学符号计算能处理表征数字的符号计算。这意味着数学对象被精确地表示,而不是近似地表示,而具有未被计算的变量的数学表达式被留在符号形式中。

sympy库简介

SymPy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数系统。它保证自身的代码尽可能的简单,且易于理解,容易扩展。SymPy完全由Python写成,不需要额外的库。

sympy的表达式与我们平常的手写的数学表达式略微有所区别,下面是sympy的方程表示符号

  • 加号 +

  • 减号 -

  • 除号 /

  • 乘号 *

  • 等号 Eq()

  • 指数 **

  • 对数 log()

  • e的指数次幂 exp()

上面的例子我们用Python实现一下。

import sympy sympy.sqrt(8)2*sqrt(2)

用sympy计算

sympy.sqrt(8)*sympy.sqrt(8)8

三、 简单学一下sysmpy中的几个实例

  • 定义数学符号(类似于数学中的变量)

  • 展开与折叠

  • 简化表达式

  • 解方程

  • 赋值计算

  • log计算

  • 导数

  • 积分

  • 求极限

3.1 定义数学符号

让我们定义一个符号表达式代表数学表达式 x+2yx+2y。首先我们要注意到python中的变量必须赋值才能使用,所以无法表达该数学表达式。所以这里一定要引入特殊的符号,这里有两种方法

#方法一
from sympy import symbols x,y = symbols('x y')
expr = x + 2*y expr
x + 2*y#方法二from sympy.abc import x,y expr2 = x + 2*y expr2x + 2*y

当数学表达式中的变量不是x,y这种单一字符,而是result这种多个字符长度的变量时,只能用方法一。

3.2 展开与折叠

from sympy import expand,factor
from sympy.abc import x,y expr = x**2+x*y+3*x expr
x**2 + x*y + 3*x#折叠
factor(expr)
x**2 + x*y + 3*x#展开
expr2 = x*(x+y+3)
expand(expr2)
x**2 + x*y + 3*x

3.3 简化表达式

有时候我们需要简化表达式,如

#普通的化简
from sympy import simplify
from sympy.abc import x simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1#三角化简trigsimp
from sympy import trigsimp,sin,cos
from sympy.abc import x,y
y = sin(x)/cos(x)

trigsimp(y)
tan(x)

指数化简

from sympy import powsimp
from sympy.abc import x,a,b
y = x**a * x**b y
x**a*x**b#指数化简
powsimp(y)
x**(a + b)

3.4 解方程

注意在python中=是赋值的意思,==虽然表示等于,但是会有很大的问题。在sympy中,我们使用Eq(x,y)表示等于x=y

from sympy.abc import x,y
from sympy import solve,linsolve,Eq

#对一个方程求解,使用solve
solve(Eq(2*x-1,3), x)
[2]

注意,当我们对多个方程求解时,我们习惯把等式设定为等于0.即将等式右边的内容移动到左边。

这时候我们再使用linsolve([方程1,方程2,...],(变量1,变量2,...))

#对多个方程求解,使用linsolve。方程的解为x=-1,y=3
linsolve([x+2*y-5,2*x+y-1], (x,y))
{(-1, 3)}

3.5 赋值计算

from sympy.abc import x,y
from sympy import sin,cos
y = sin(x)+cos(x)y
sin(x) + cos(x)

y.subs(x, x**2)sin(x**2) + cos(x**2)

这里的赋值,不仅可以实现变量的替换,还可以赋与数字,进行计算。

y.subs(x, 0)1

3.6 log运算

from sympy import log,expand_log
from sympy.abc import x,y,e

#expand_log为展开log,但需要将force=True,展开才能发生

expand_log(log(x**3), force=True)
3*log(x)#expand_log为展开log,但需要将force=True,展开才能发生

expand_log(log(x**3))
log(x**3)expand_log(log(e**x), force=True)x*log(e)

3.7 导数

如果经历过考研求导数,大家都应该都还记得这些吧。

from sympy import diff,sin,cos
from sympy.abc import x,y,z,f

#对sin(x)求导
diff(sin(x))
cos(x)diff(cos(x))-sin(x)

偏导

#求偏导
f = 3*x**2*y*z diff(f, x,y)
6*x*z

3.8 积分

from sympy.abc import pi,x
from sympy import integrate,sin integrate(sin(x), (x,0,pi))
-cos(pi) + 1

3.9 极限

from sympy.abc import x
from sympy import limit limit(1/x, x, 0, '+')
oo

3.10 展开式

from sympy import exp,symbols x = symbols('x')

expr = exp(x)

expr.series(x, 0, 3)
1 + x + x**2/2 + O(x**3)


数据采集

【视频讲解】Scrapy递归抓取简书用户信息

【实战视频】使用scrapy写爬虫-爬知乎live

如何将html中的表格数据保存下来

美团商家信息采集神器

gevent:异步理论与实战  

轻盈高效的异步访问库grequests库

selenium驱动器配置详解

爬虫神器PyQuery的使用方法

简易SQLite3数据库学习

当爬虫遭遇验证码,怎么办  

js2xml:将javascript字符串转换为xml  

extruct提取结构化数据


文本处理分析

gensim:用Word2Vec进行文本分析

RAKE:快速自动抽取关键词算法

对于中文,nltk能做哪些事情

基于共现发现人物关系的python实现

用pyecharts制作词云图

留在网上的每个字,都在泄露你的身份


数据结构

优雅简洁的列表推导式

Get小技巧等分列表

如何对数据进行各种排序?

数据结构:队列与堆栈 

else除了跟if很搭,你还知道其他的关键词吗?

杂文

Python中处理日期时间库的使用方法

三分钟掌握文件格式识别

为什么你要为2019,而不是2018做计划?

2017年度15个最好的数据科学领域Python库

迅雷不给力,我DIY了个下载器

计算运行时间-装饰器实现

花十分钟,给爱机安装个MongoDB

使用Python登录QQ邮箱发送QQ邮件

WTF Python: 开启你的懵逼模式

8行代码实现微信聊天机器人




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存