python数学符号_Python圈中的符号计算库-Sympy(转载)

《本文来自公众号“大邓带你玩python”,转载》

importmath

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实现一下。

importsympy

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

用sympy计算

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

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

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

展开与折叠

简化表达式

解方程

赋值计算

log计算

导数

积分

求极限

3.1定义数学符号

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

方法一

from sympy importsymbols

x,y= symbols('x y')

expr= x + 2*y

expr

x+ 2*y

方法二

from sympy.abc importx,y

expr2= x + 2*y

expr2

x+ 2*y

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

3.2展开与折叠

from sympy importexpand,factorfrom sympy.abc importx,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 importsimplifyfrom sympy.abc importx

simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))

x- 1

三角化简trigsimp

from sympy importtrigsimp,sin,cosfrom sympy.abc importx,y

y= sin(x)/cos(x)

trigsimp(y)

tan(x)

指数化简

from sympy importpowsimpfrom sympy.abc importx,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 importx,yfrom sympy importsolve,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 importx,yfrom sympy importsin,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 importlog,expand_logfrom sympy.abc importx,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 importdiff,sin,cosfrom sympy.abc importx,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 importpi,xfrom sympy importintegrate,sin

integrate(sin(x), (x,0,pi))-cos(pi) + 1

3.9极限

from sympy.abc importxfrom sympy importlimit

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 importexp,symbols

x= symbols('x')

expr=exp(x)

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值