使用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文件操作类操作实例详解
Jul 11 Python
Python中对元组和列表按条件进行排序的方法示例
Nov 10 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
python print出共轭复数的方法详解
Jun 25 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
Python数据正态性检验实现过程
Apr 18 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
详解Python设计模式之策略模式
Jun 15 Python
tensorflow图像裁剪进行数据增强操作
Jun 30 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 Python
 python中的元类metaclass详情
May 30 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
Sony CFR 320 修复改造
2020/03/14 无线电
PHP 使用redis简单示例分享
2015/03/05 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
2016银行求职自荐信
2016/01/28 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python
Python内置数据类型中的集合详解
2022/03/18 Python