Python圈中的符号计算库-Sympy(转载)
《本文来自公众号“大邓带你玩python”,转载》
import math math.sqrt(8) 2.8284271247461903
我们看看Python中结果
math.sqrt(8).math.sqrt(8) 8.000000000000002
本以为会得到8.0,但没想到得到8.000000000000002。
一、为什么会这样?
如果我们平常计算的任务常常有类似于上面的例子这样的表达式,那么直接用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
三、简单学一下sympy中的几个实例
- 定义数学符号(类似于数学中的变量)
- 展开与折叠
- 简化表达式
- 解方程
- 赋值计算
- 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 expr2
x + 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]
使用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 展开式
高数中有泰勒展开式,拉格朗日展开式。
e^x=1+x+x^2/2!+x^3/3!+x^4/4!+...+x^n/n!+o(x^n)
比如当n=3时,
e^x=1+x+x^2/2+o(x^3)
这里实现的方法是:sympy表达式.series(变量, 0, n)
from sympy import exp,symbols
x = symbols('x')
expr = exp(x)
expr.series(x, 0, 3)
1 + x + x**2/2 + O(x**3)
Python圈中的符号计算库-Sympy(转载)的更多相关文章
- Windows 下在 Python (Anaconda) 中安装 Dlib 库
0. 引言 介绍在 Windows 操作系统下,在 Python 的 Anaconda 集成环境中,安装 Dlib 库 : 对于不了解源码编译的,或者利用 cmake 方法失败的,可以尝试下此方法: ...
- python数据分析中常用的库
Python是数据处理常用工具,可以处理数量级从几K至几T不等的数据,具有较高的开发效率和可维护性,还具有较强的通用性和跨平台性,这里就为大家分享几个不错的数据分析工具,需要的朋友可以参考下 Pyth ...
- python词云生成-wordcloud库
python词云生成-wordcloud库 全文转载于'https://www.cnblogs.com/nickchen121/p/11208274.html#autoid-0-0-0' 一.word ...
- 【归纳】正则表达式及Python中的正则库
正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...
- 【转载】路径双反斜杠!!!Python IDLE或Python shell中切换路径 切换目录os.chdir("C:\\python37\\2019pythonshel37\\diedai")
Python IDLE或shell中切换路径在Python自带的编辑器IDLE中或者python shell中不能使用cd命令,那么跳到目标路径呢.方法是使用os包下的相关函数实现路径切换功能. im ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 转载 为什么print在Python 3中变成了函数?
转载自编程派http://codingpy.com/article/why-print-became-a-function-in-python-3/ 原作者:Brett Cannon 原文链接:htt ...
- Python中使用第三方库xlrd来写入Excel文件示例
Python中使用第三方库xlrd来写入Excel文件示例 这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表 ...
- Python中super的用法【转载】
Python中super的用法[转载] 转载dxk_093812 最后发布于2019-02-17 20:12:18 阅读数 1143 收藏 展开 转载自 Python面向对象中super用法与MRO ...
随机推荐
- zookeeperclient设置监听
1.目的 zookeeper是一个分布式服务管理框架.zookeeper提供了对client的通知.即在server端的节点有改动或者删除的时候,能够给client进行通知. 2.server端部署 ...
- 是男人就下100层【第四层】——Crazy贪吃蛇(2)
在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...
- ACM之数论数字根
先来看一道杭电的数字根问题 此题的大大意是输入一个数.假设它不是一位的数字的话,那么我们就将它的每一位都相加,相加后假设还是两位或者很多其它的话那么我们继续取出它的每一位数字进行相加.知道等到单个数字 ...
- POST & GET & Ajax 全解
GET&POST&Ajax 全解 一.POST和GET的差别 GET:GET方法提交数据不安全,数据置于请求行.客户段地址栏可见:GET方法提交的数据限制大小在255个字符之内.參数直 ...
- 自己定义Gradle插件之"Hello World"
自己定义Gradle插件之"Hello World" 0.新建一个用于开发这个插件的目录 1.确定Plugin id Plugin id一般定义为java 包名. 由字母和数字及& ...
- Visual Studio安装空白 和 VS Code打开失败解决方案
微软博文:https://docs.microsoft.com/zh-cn/visualstudio/install/troubleshooting-installation-issues?view= ...
- cocos2d-x CCSrollView 源代码,可循环的SrollView代码
项目须要.写一个类似于iPhone上面时钟选择的可拉动式循环选择列表,通过集成CCScrollView并更改部分代码.实现了该功能. 假设想充分了解代码,请先阅读源码分析http://blog.csd ...
- STM32 USB复合设备编写
目的 完成一个CDC + MSC的复合USB设备 可以方便在CDC,MSC,复合设备三者间切换 可移植性强 预备知识 cube中USB只有两个入口. main函数中的MX_USB_DEVICE_Ini ...
- 2 Angular 2 的核心概念
一.组件(Components): 组件是构成 Angular 应用的基础和核心,它是一个模板的控制类,用于处理应用和逻辑页面的视图部分.组件知道如何渲染自己及配置依赖注入,并通过一些由属性和方法组成 ...
- 在webkit中如何避免触发layout(重排)
很多web开发者都已经意识到,在脚本执行中,DOM操作的用时可能比js本身执行时间要长很多,其中潜在的消耗基本上是由于触发了layout(即重排reflow:由DOM树构建为Render渲染树的过程) ...