使用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实现复制整个目录的方法
May 12 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
python 批量修改/替换数据的实例
Jul 25 Python
python 把列表转化为字符串的方法
Oct 23 Python
Python3内置模块random随机方法小结
Jul 13 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
Django的CVB实例详解
Feb 10 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
Search Engine Friendly的URL设计
2006/10/09 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
js点击选择文本的方法
2015/02/09 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
python装饰器decorator介绍
2014/11/21 Python
Python列表(list)常用操作方法小结
2015/02/02 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
python实现树形打印目录结构
2018/03/29 Python
Python交互环境下实现输入代码
2018/06/22 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
Python模块future用法原理详解
2020/01/20 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
服装厂厂长岗位职责
2013/12/27 职场文书
三八妇女节活动总结
2014/05/04 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
在人间读书笔记
2015/06/30 职场文书
Android Rxjava3 使用场景详解
2022/04/07 Java/Android
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android