《本文来自公众号“大邓带你玩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(转载)的更多相关文章

  1. Windows 下在 Python (Anaconda) 中安装 Dlib 库

    0. 引言 介绍在 Windows  操作系统下,在 Python 的 Anaconda 集成环境中,安装 Dlib 库 : 对于不了解源码编译的,或者利用 cmake 方法失败的,可以尝试下此方法: ...

  2. python数据分析中常用的库

    Python是数据处理常用工具,可以处理数量级从几K至几T不等的数据,具有较高的开发效率和可维护性,还具有较强的通用性和跨平台性,这里就为大家分享几个不错的数据分析工具,需要的朋友可以参考下 Pyth ...

  3. python词云生成-wordcloud库

    python词云生成-wordcloud库 全文转载于'https://www.cnblogs.com/nickchen121/p/11208274.html#autoid-0-0-0' 一.word ...

  4. 【归纳】正则表达式及Python中的正则库

    正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...

  5. 【转载】路径双反斜杠!!!Python IDLE或Python shell中切换路径 切换目录os.chdir("C:\\python37\\2019pythonshel37\\diedai")

    Python IDLE或shell中切换路径在Python自带的编辑器IDLE中或者python shell中不能使用cd命令,那么跳到目标路径呢.方法是使用os包下的相关函数实现路径切换功能. im ...

  6. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  7. 转载 为什么print在Python 3中变成了函数?

    转载自编程派http://codingpy.com/article/why-print-became-a-function-in-python-3/ 原作者:Brett Cannon 原文链接:htt ...

  8. Python中使用第三方库xlrd来写入Excel文件示例

    Python中使用第三方库xlrd来写入Excel文件示例 这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表 ...

  9. Python中super的用法【转载】

    Python中super的用法[转载] 转载dxk_093812 最后发布于2019-02-17 20:12:18 阅读数 1143  收藏 展开 转载自 Python面向对象中super用法与MRO ...

随机推荐

  1. HDU 4115 Eliminate the Conflict(2-sat)

    HDU 4115 Eliminate the Conflict pid=4115">题目链接 题意:Alice和Bob这对狗男女在玩剪刀石头布.已知Bob每轮要出什么,然后Bob给Al ...

  2. influxDB系列(二)

    来源于我在一个influxDB的qq交流群中的提问, 然后有个人 提了一个问题---->触发了我的思考!! :) 哈哈 自己的每一次说出一个回答,都是一次新的思考,也都进行了一些查阅资料,思考, ...

  3. spring 学习资料

    spring 官方教程 1.3.1 http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/index.html ...

  4. 【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取

    在入门系列的教程中.我们经常使用 d3.json() 函数来读取 json 格式的文件.json 格式非常强大.但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 O ...

  5. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  6. IE9版本号下面ajax 跨域问题解决

    ajax跨域请求数据在谷歌火狐我本地IE11都是没问题的. 让測试就发现问题了,IE8下请求不到数据.然后我查看一下自己写的js看有没有不兼容问题.但是都没有啊.为什么就请求不到呢. 我把ajax的e ...

  7. 4448: [Scoi2015]情报传递|主席树|离线操作

    能够把全部的操作离线,然后树链剖分将全部人搜集情报的时间增加到主席树中,查询的时候能够直接查询搜集情报时间≤i−C[i]−1的人的个数 时间复杂度n∗log22n,空间复杂度n∗log2n #incl ...

  8. linux中用anaconda使用不同版本python

    1.使用命令conda create --name python36 python=3.6  #你想使用哪个版本就下载哪个版本,--name后面跟的是该虚拟环境的名称 2.需要使用python3.6时 ...

  9. Android Studio keymap到Eclipse后,查找下一个同样变量快捷键Ctrl+K失效

    注:升级到0.8的版本号以后.这个快捷键能够使了,只是另一个bug,假设你用了Ctrl+F先去查找了其它的东东,再使这个快捷键去定位另外一个变量可能偶尔会不灵,不灵的话还是能够用我以下的方式来让Ctr ...

  10. 2016/3/18 ①PHP基础 ② PHP函数 ③其他函数(随机数、关于日期) ④正则表达式 ⑤字符串处理

    一.PHP基础 1,标记和注释 ①<?php?> ②单行注释// 多行注释/**    */2, 输出语句 ①echo输出 echo可以输出多个字符串,用逗号隔开. ②print输出 pr ...