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


Posted in Python onMarch 27, 2019

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

1.Sympy库简介

SymPy一个用于符号型数学计算(symbolic mathematics)的Python库。它旨在成为一个功能齐全的计算机代数系统(Computer Algebra System,CAS),同时保持代码简洁、易于理解和扩展。SymPy完全是用Python写的,并不需要外部的库。

本文选择Sympy库的原因在于:

  • 免费:该库基于BSD开源许可,免费且开源;
  • 基于Python:该库完全是用Python写就,并以Python作为该库操作语言;
  • 轻量级:为了使Sympy简单易用,该库仅基于mpmath库(一个纯Python库,用于浮点运算);
  • 灵活性:除了用作交互工具,还可插入其他应用或软件拓展功能中。

具体说来,如果x与y未曾赋值,那么下列语句就会报错

#测试语句
print(x+y)

而符号运算则不同,符号运算多用于公式推导,不需要赋值,此时使用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()

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

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

(3)使用Solve函数解方程

在使用Solve函数解方程之前,我们先来看一下Solve函数的定义。Solve函数的第一个参数是要解的方程,要求右端等于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为任意表达式,表示求取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的形式)。第二个参数为要解的函数(在微分方程中)

举个例子:

>>> 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)

这样,我们可以将我们要解的题目,用以下代码表示。

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 矩阵化简

平时线性代数问题中我们会遇到化简问题,虽然不算难,但着实麻烦。而且,出一点错就会导致

结果出错。不过好运的是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 相关文章推荐
Python 字符串定义
Sep 25 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python对List中的元素排序的方法
Apr 01 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
python绘制雪景图
Dec 16 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Python Merge函数原理及用法解析
Sep 16 Python
如何基于pandas读取csv后合并两个股票
Sep 25 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
超简单使用Python换脸实例
Mar 27 #Python
python爬虫爬取微博评论案例详解
Mar 27 #Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 #Python
详解python中@的用法
Mar 27 #Python
详解python列表生成式和列表生成式器区别
Mar 27 #Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 #Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
Mar 27 #Python
You might like
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
PHP Class&Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
js模拟类继承小例子
2010/07/17 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
Python入门教程之if语句的用法
2015/05/14 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
python 检测图片是否有马赛克
2020/12/01 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
幼儿园大班区域活动总结
2014/07/09 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
教师理论学习心得体会
2016/01/21 职场文书
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python