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)

原文地址:https://www.cnblogs.com/sunshine-blog/p/8477523.html

时间: 2024-10-10 10:30:53

Python圈中的符号计算库-Sympy(转载)的相关文章

Python中第三库的安装

网上的帖子挺多的,教你如何安装,安装第三方工具库的方法总共分为三类:Dos系统下pip命令:安装包下载安装:IDE集成环境下安装(Pycharm,Spyder--) http://www.jianshu.com/p/41a9c25273b1 一.pip命令 感觉这个最简单,但是需要注意几点 1.get-pip这个文件是否在您的Python目录中,Python官网中也指出当你的版本高于2.7或者3.4版本自带了pip文件,如下图pip文件存在与Scripts文件夹下,如果你的Scripts文件夹下

解决Python开发过程中依赖库打包问题的方法

在Python开发的过程中,经常会遇到各种各样的小问题,比如在一台计算机上调试好的程序,迁移到另外一台机子上后往往会应为工程项目依赖库的缺失而造成错误. 除了一遍又一遍对着被抛出错误去重新install各种相关的依赖库,有没有更好的方法来解决Python开发过程中依赖库的打包呢?答案是肯定的. 类似于JavaScript的npm,Python也有它强大的包管理工具--pip,我们可以用pip导出项目中的dependency: 1 $ pip freeze > requirements.txt 然

Python 对Twitter中指定话题的被转载Tweet数量的频谱分析

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-10 @author: guaguastd @name: retweet_frequency_map.py ''' if __name__ == '__main__': # import visualize from visualize import visualize_frequency_map # pip install prettytable # fr

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

转载自编程派http://codingpy.com/article/why-print-became-a-function-in-python-3/ 原作者:Brett Cannon 原文链接:http://www.snarky.ca/why-print-became-a-function-in-python-3 译者:[email protected]编程派 在Python 2中,print是一个语句(statement):而在Python 3中变成了函数(function).很多Python

Python安装、配置图文详解(转载)

Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(IDE) 1. 在Eclipse中安装PyDev插件 2. 配置Python Interpreters 四. 创建Python Project 五. 编写HelloWorld 六. 小结 一. Python简介: Python在Linux.windows.Mac os等操作系统下都有相应的版本,不管在

量化投资策略:常见的几种Python回测框架(库)

量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量化策略方向,研究了Zipline一段时间,但是后续发现他仅支持美国股票,收集量化策略文章,转载到博客中. 在实盘交易之前,必须对量化交易策略进行回测.在此,我们评价一下常用的Python回测框架(库).评价的尺度包括用途范围(回测.虚盘交易.实盘交易),易用程度(结构良好.文档完整)和扩展性(速度快

《Python学习手册》读书笔记【转载】

转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书

用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)

在用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)一文里,我讲述了通过爬虫接口得到股票数据并绘制出K线均线图形的方式,在本文里,将在此基础上再引入成交量效果图,并结合量价理论,给出并验证一些交易策略. 1 成交量对量化分析的意义 美国的股市分析家葛兰碧(Joe Granville)在他所著的<股票市场指标>一书里提出著名的“量价理论”.“量价理论”的核心思想是,任何对股价的分析,如果离开了对成交量的分析,都将是无本之木,无水

如何从python代码中直接访问Android的Service

在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制.但是在Python对象和Java对象中转来转去总让人感觉到十分别扭.好在android提供了binder这个进程间通信的功能,Java中的Service也是基于Binder的C++代码封装来实现进程间通信的,这也为从Python代码中绕开pyjnius直接访问Java代码提供了可能,既然Java的Service是基于C++的封装来实现的,也同样可以在Python中封装同样的C++代码,这篇文