使用Python的SymPy库解决数学运算问题的方法

 更新时间£º2019年03月27日 11:58:50   作者£º王航臣的博客   我要评论

这篇文章主要介绍了使用Python的SymPy库解决数学运算问题的方法£¬小编觉得挺不错的£¬现在分享给大家£¬也给大家做个参考¡£一起跟随小编过来看看吧

摘要£º在学习与科研中£¬经常会遇到一些数学运算问题£¬使用计算机完成运算具有速度快和准确性高的优势¡£Python的Numpy包具有强大的科学运算功能£¬且具有其他许多主流科学计算语言不具备的免费¡¢开源¡¢轻?#32771;?#21644;灵活的特点¡£本文使用Python语言的NumPy库£¬解决数学运算问题中的线性方程组问题¡¢积分问题¡¢微分问题及矩阵化简问题£¬结果准确快捷£¬具有一定的借鉴意义¡£

1.Sympy库简介

SymPy一个用于符号型数学计算£¨symbolic mathematics£©的Python库¡£它旨在成为一个功能齐全的计算机代数系?#24120;¨Computer Algebra System£¬CAS£©£¬同时保持代码简洁¡¢?#23376;?#29702;解和扩展¡£SymPy完全是用Python写的£¬并不需要外部的库¡£

本文选择Sympy库的原因在于£º

  • 免费£º该库基于BSD开源许可£¬免费且开源£»
  • 基于Python£º该库完全是用Python写就£¬并以Python作为该库操作语言£»
  • 轻?#32771;¶£?#20026;了使Sympy简单易用£¬该库仅基于mpmath库£¨一个纯Python库£¬用于浮点运算£©£»
  • 灵活性£º除了用作交互工具£¬还可插入其他应用或软件拓展功能?#23567;?/li>

具体说来£¬如果x与y未曾?#25345;“ú?#37027;么下列语句就会报错

#测试语句
print(x+y)

而符号运算则不同£¬符号运算多用于公式推导£¬不需要?#25345;“ú?#27492;时使用Sympy进行符号运算便具有方便快捷的优势£¬如下述语句便不会报错¡£

#测试语句
x=Symbol('x')
y=Symbol('y')
print(x+y)

2 SymPy库解决数学运算问题实现

2.1 求解线性方程组

解方程的功能主要是使用Sympy中solve函数实现¡£以式(1)为例£¬求解过程如下£º

£¨1£© 符号表示

SymPy库中使用Symbol函数定义符号变量£¬

from sympy import *
x=Symbol('x')
y=Symbol('y')
 
#或者用如下语句
x,y=Symbol('x y')#第二个用空格隔开

£¨2£©方程表示

使用代码表示数学符号与手写体的数学运算符号存在一定的差异£¬下面列举常用的运算符£º

  • 加号
  • 加号 +
  • 减号 -
  • 除号 /
  • 乘号 *
  • 指数 **
  • 对数 log()
  • e的指数次幂 exp()

对于长的表达式£¬如果不确定运算符的优先级£¬可以加入小括号提升其优先级¡£由于需要将表达式都转化成右?#35828;?#20110;0,这里把常数3和7移到等式左边¡£题目中表达式可表示为£º

2*x-y-3=0
3*x+y-7=0

(3)使用Solve函数解方程

在使用Solve函数解方程之前£¬我们先来看一下Solve函数的定义¡£Solve函数的第一个参数是要解的方程£¬要求右?#35828;?#20110;0£¬第二个参数是未知数¡£

对于式(1)的求解£¬代码如下£º

from sympy import *
x = Symbol('x')
y = Symbol('y')
print(solve([2*x-y-3,3*x+y-7],[x,y]))

2.2 求解微积分问题

2.2.1 求解极限问题

在2.1中通过一个简单的二元一次方程组求解熟悉了该库求解数学问题的基本过程£¬下面本文通过示例£¬讲解使用SymPy库求解微积分的过程¡£

求解式£¨2£©所示的极限问题£¬需要用到limit函数求极限¡£

(1)符号及方程表示

引入Sympy库并定义n为符号变量与2.1中一致¡£

from sympy import *
n = Symbol('n')
s = ((n+3)/(n+2))**n

(2)利用limit函数求极限

首先我们介绍limit函数的调用格式£ºlimit(e, z, z0, dir='+'),e为?#25105;?#34920;达式£¬表示求取e(z)在点z0处的极限£¬dir='+'表示取右极限£¬die='-'则表示取左极限¡£则上式的求解代码可表示如下£º

from sympy import *
n = Symbol('n')
s = ((n+3)/(n+2))**n

print(limit(s,n,oo)) #无穷的表示方法是两个小写的字母o

2.2.2 求解定积分

(1)符号表示

from sympy import *
t = Symbol(t)
x = Symbol(x)

(2)方程表示

m = integrate(sin(t)/(pi-t),(t,0,x))
n = integrate(m,(x,0,pi)) 

完整代码如下£º

from sympy import *
t = Symbol(t)
x = Symbol(x)
m = integrate(sin(t)/(pi-t),(t,0,x))
n = integrate(m,(x,0,pi))
print(n)

2.2.3 求解微分问题

如求取的通解

£¨1£©符号表示

这里与之前不同的是增加了函数的表示(用f(x)表示y)£¬即例题中的y还有微分表示

from sympy import *
f = Function('f')
x = Symbol('x')

y'的表示方法由以下代码组成

diff(f(x),x)

这里对diff函数稍作介绍£º

上面是求一阶导的方法£¬求解高阶导的方法如下所示£º

>>> diff(x**3,x)
3*x**2
>>> diff(x**3,x,1)
3*x**2
>>> diff(x**3,x,2)
6*x
>>> diff(x**3,x,3)
6
>>> diff(x**3,x,4)
0

即改变第三个参数即可¡£

下面继续我们的解题过程¡£

#左端
diff(f(x),x)
#看一下
print(diff(f(x),x))
 
#result
#d
#--(f(x))
#dx
 
#右端
2*f(x)*x

用dsolve函数解微分方程

dsolve函数是用来解决微分方程£¨differential equation£©的函数¡£

函数的一个用法为£º

dsolve(eq, f(x))

第一个参数为微分方程£¨要先将等式移项为右端为0的?#38382;?¡£第二个参数为要解的函数(在微分方程中)

举个例子:

>>> from sympy import *
>>> f = Function('f')
>>> x = Symbol('x')
>>> pprint(2*x-diff(f(x),x))
   d
2*x - --(f(x))
   dx
>>> dsolve(2*x - diff(f(x),x), f(x))
#result
#Eq(f(x), C1 + x**2)

这样£¬我?#24378;?#20197;将我们要解的题目£¬用以下代码表示¡£

dsolve(diff(f(x),x) - 2*f(x)*x, f(x))

结果为£º

Eq(f(x), C1*exp(x**2))
#即f(x) = C1*exp(x**2)

对比答案可以发现正确¡£

完整代码:

from sympy import *
f = function('f')
x = Symbol('x')
print(dsolve(diff(f(x),x)-2*f(x)*x,f(x))

2.2.4 矩阵化简

平时线?#28304;?#25968;问题中我们会遇到化简问题£¬虽然不算难£¬但着实麻烦¡£而且£¬出一点错就会导致

结果出错¡£不过好运的是SymPy提供了相关的支持¡£

例题£º

符号表示与矩阵表示

from sympy import *
x1,x2,x3 = symbols('x1 x2 x3')
a11,a12,a13,a22,a23,a33 = symbols('a11 a12 a13 a22 a23 a33')
m = Matrix([[x1,x2,x3]])
n = Matrix([[a11,a12,a13],[a12,a22,a23],[a13,a23,a33]])
v = Matrix([[x1],[x2],[x3]])

注意m的表示£¬需要有两个中括号

化简实现

print(m*n*v)

得到的是£º

Matrix([[x1*(a11*x1 + a12*x2 + a13*x3) + x2*(a12*x1 + a22*x2 + a23*x3) + x3*(a13*x1 + a23*x2 + a33*x3)]])

使用

f = m * n * v
print f[0]

可以进一步得到化简后的式子

也许你要问我要化简后在计算怎么办£¿下面我就举个例子¡£

如果上式中x1£¬x2£¬x3均等于1£¬则可这样代入¡£

from sympy import *
x1,x2,x3 = symbols('x1 x2 x3')
a11,a12,a13,a22,a23,a33 = symbols('a11 a12 a13 a22 a23 a33')
m = Matrix([[x1, x2, x3]])
n = Matrix([[a11, a12, a13], [a12, a22, a23], [a13, a23, a33]])
v = Matrix([[x1], [x2], [x3]])
f = m * n * v
print f[0].subs({x1:1, x2:1, x3:1})

可得

a11 + 2*a12 + 2*a13 + a22 + 2*a23 + a33

以上就是本文的全部内容£¬希望对大家的学习有所帮助£¬也希望大家多多支持脚本之家¡£

相关文章

  • python编程实现12306的一个小爬虫实例

    python编程实现12306的一个小爬虫实例

    这篇文章主要介绍了python编程实现12306的一个小爬虫实例£¬具有一定借鉴价值£¬需要的朋友可以参考下¡£
    2017-12-12
  • 在python中实现将一张?#35745;?#21098;切成四份的方法

    在python中实现将一张?#35745;?#21098;切成四份的方法

    今天小编就为大家分享一篇在python中实现将一张?#35745;?#21098;切成四份的方法£¬具有很好的参考价值£¬希望对大家有所帮助¡£一起跟随小编过来看看吧
    2018-12-12
  • ?#31243;¸python可视化包Bokeh

    ?#31243;¸python可视化包Bokeh

    这篇文章主要介绍了?#31243;¸python可视化包Bokeh£¬分享了相关代码示例£¬小编觉得还是挺不错的£¬具有一定借鉴价值£¬需要的朋友可以参考下
    2018-02-02
  • CentOS中升级Python版本的方法详解

    CentOS中升级Python版本的方法详解

    本文给大家分享的是再centos系统中将Python版本从2.6升级到2.7的方法和升级过程中遇到的问题的处理£¬非常详细£¬有需要的小伙伴可以参考下
    2017-07-07
  • Python获取单个程序CPU使用情况趋势图

    Python获取单个程序CPU使用情况趋势图

    这篇文章主要介绍了Python获取单个程序CPU使用情况趋势图,本文使用matplotlib将数据可视化,需要的朋友可以参考下
    2015-03-03
  • Python实现的?#36828;?#20041;多线程多进程类示例

    Python实现的?#36828;?#20041;多线程多进程类示例

    这篇文章主要介绍了Python实现的?#36828;?#20041;多线程多进程类,结合实例?#38382;?#20998;析了Python多线程多进程的相关调用与使用操作技巧,需要的朋友可以参考下
    2018-03-03
  • 代码讲解Python对Windows服务进行监控

    代码讲解Python对Windows服务进行监控

    本篇文章给大家分享了通过Python对Windows服务进行监控的实例代码£¬?#28304;?#26377;兴趣的朋友可以学习参考下¡£
    2018-02-02
  • python进行文件对比的方法

    python进行文件对比的方法

    在本篇内容里小编给分享了关于python进行文件对比的方法和步骤£¬需要的朋友?#24378;?#20197;学习下¡£
    2018-12-12
  • 详解用python实现简单的遗传算法

    详解用python实现简单的遗传算法

    这篇文章主要介绍了详解用python实现简单的遗传算法£¬小编觉得挺不错的£¬现在分享给大家£¬也给大家做个参考¡£一起跟随小编过来看看吧
    2018-01-01
  • python动态加载包的方法小结

    python动态加载包的方法小结

    这篇文章主要介绍了python动态加载包的方法,结合实例?#38382;阶?#32467;分析了Python动态加载模块,动态增加属性及动态加载包的相关实现技巧,需要的朋友可以参考下
    2016-04-04

最新评论

ÁÉÄþ35Ñ¡7¿ª½±½á¹û