import mathmath.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 sympysympy.sqrt(8)2*sqrt(2)
用sympy计算
sympy.sqrt(8)*sympy.sqrt(8)8
三、 简单学一下sysmpy中的几个实例
-
定义数学符号(类似于数学中的变量)
-
展开与折叠
-
简化表达式
-
解方程
-
赋值计算
-
log计算
-
导数
-
积分
- 求极限
3.1 定义数学符号
让我们定义一个符号表达式代表数学表达式 x+2y。首先我们要注意到python中的变量必须赋值才能使用,所以无法表达该数学表达式。所以这里一定要引入特殊的符号,这里有两种方法
#方法一from sympy import symbolsx,y = symbols(\'x y\')expr = x + 2*yexprx + 2*y#方法二from sympy.abc import x,yexpr2 = x + 2*yexpr2x + 2*y
当数学表达式中的变量不是x,y这种单一字符,而是result这种多个字符长度的变量时,只能用方法一。
3.2 展开与折叠
from sympy import expand,factorfrom sympy.abc import x,yexpr = x**2+x*y+3*xexprx**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 simplifyfrom sympy.abc import xsimplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))x - 1#三角化简trigsimpfrom sympy import trigsimp,sin,cosfrom sympy.abc import x,yy = sin(x)/cos(x)trigsimp(y)tan(x)
指数化简
from sympy import powsimpfrom sympy.abc import x,a,by = x**a * x**byx**a*x**b#指数化简powsimp(y)x**(a + b)
3.4 解方程
注意在python中=是赋值的意思,==虽然表示等于,但是会有很大的问题。在sympy中,我们使用Eq(x,y)表示等于x=y
from sympy.abc import x,yfrom sympy import solve,linsolve,Eq#对一个方程求解,使用solvesolve(Eq(2*x-1,3), x)[2]
注意,当我们对多个方程求解时,我们习惯把等式设定为等于0.即将等式右边的内容移动到左边。
这时候我们再使用linsolve([方程1,方程2,…],(变量1,变量2,…))
#对多个方程求解,使用linsolve。方程的解为x=-1,y=3linsolve([x+2*y-5,2*x+y-1], (x,y)){(-1, 3)}
3.5 赋值计算
from sympy.abc import x,yfrom sympy import sin,cosy = sin(x)+cos(x)ysin(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_logfrom 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,cosfrom sympy.abc import x,y,z,f#对sin(x)求导diff(sin(x))cos(x)diff(cos(x))-sin(x)
偏导
#求偏导f = 3*x**2*y*zdiff(f, x,y)6*x*z
3.8 积分
from sympy.abc import pi,xfrom sympy import integrate,sinintegrate(sin(x), (x,0,pi))-cos(pi) + 1
3.9 极限
from sympy.abc import xfrom sympy import limitlimit(1/x, x, 0, \'+\')oo
3.10 展开式
from sympy import exp,symbolsx = symbols(\'x\')expr = exp(x)expr.series(x, 0, 3)1 + x + x**2/2 + O(x**3)