使用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 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
PyCharm下载和安装详细步骤
Dec 17 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
python访问hdfs的操作
Jun 06 Python
详解Python IO口多路复用
Jun 17 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
python实现银行账户系统
Feb 22 Python
pytorch MSELoss计算平均的实现方法
May 12 Python
Python实现照片卡通化
Dec 06 Python
python通过新建环境安装tfx的问题
May 20 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
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
python遍历小写英文字母的方法
2019/01/02 Python
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
编辑求职信样本
2013/12/16 职场文书
园林技术个人的自我评价
2014/02/15 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
给客户的检讨书
2014/12/21 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers