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

摘要:在学习与科研中,经常会遇到一些数学运算问题,使用计算机完成运算具有速度快和准确性高的优势。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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python中的数学运算操作符使用进阶

    Python中对象的行为是由它的类型 (Type) 决定的.所谓类型就是支持某些特定的操作.数字对象在任何编程语言中都是基础元素,支持加.减.乘.除等数学操作. Python的数字对象有整数和浮点数,支持各种数学操作,比如+, -,*, /等. 没有这些操作符,程序中只能使用函数调用的方式进行数学运算,比如add(2, 3), sub(5, 2). 程序中操作符的作用与普通数学操作的用法是一致的,使用中更加简便直观.Python中,这些操作符实现是通过定义一些object的特殊方法实现的,比如o

  • Python编程实现数学运算求一元二次方程的实根算法示例

    本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² + bx + c = 0的两个解. 实现代码: #!/usr/bin/env python # -*- coding: utf-8 -*- import math def quadratic(a,b,c): if a == 0: raise TypeError('a不能为0') if not is

  • Python使用matplotlib填充图形指定区域代码示例

    本文代码重点在于演示Python扩展库matplotlib.pyplot中fill_between()函数的用法. import numpy as np import matplotlib.pyplot as plt # 生成模拟数据 x = np.arange(0.0, 4.0*np.pi, 0.01) y = np.sin(x) # 绘制正弦曲线 plt.plot(x, y) # 绘制基准水平直线 plt.plot((x.min(),x.max()), (0,0)) # 设置坐标轴标签 pl

  • 简单讲解Python中的数字类型及基本的数学计算

    Python有四种类型的数字: 1.整型 a = 2 print a 2.长整型 b = 123456789 print b 3.浮点数 c = 3.2E2 print c 4.复数 复数为实数的推广,它使任一多项式都有根.复数当中有个"虚数单位"j,它是-1的一个平方根.任一复数都可表达为x+yj,其中x及y皆为实数,分别称为复数之"实部"和"虚部". d = (2+3j) print d 计算示例: 每种程序语言都有数学计算方法,数学符号通用

  • Python使用matplotlib绘制多个图形单独显示的方法示例

    本文实例讲述了Python使用matplotlib绘制多个图形单独显示的方法.分享给大家供大家参考,具体如下: 一 代码 import numpy as np import matplotlib.pyplot as plt #创建自变量数组 x= np.linspace(0,2*np.pi,500) #创建函数值数组 y1 = np.sin(x) y2 = np.cos(x) y3 = np.sin(x*x) #创建图形 plt.figure(1) ''' 意思是在一个2行2列共4个子图的图中,

  • 用Python做的数学四则运算_算术口算练习程序(后添加减乘除)

    最近着迷上了 Python 用Python给小宝做的数学算数口算练习程序(2015年1月添加四则运算)! 给小宝做的口算游戏: #用Python给小宝做的数学算数口算练习程序(2015年1月添加四则运算)! #给小宝做的口算游戏: import string import random input=11 nums=10 num=0 righ1t=0 #分数# flagwrong=0 #没错过 print e[1;34mThis text is bold blue.e[0m print 一共有%d

  • 详解Python编程中基本的数学计算使用

    数 在 Python 中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯定过关了. >>> 3 3 >>> 3333333333333333333333333333333333333333 3333333333333333333333333333333333333333L >>> 3.222222 3.222222 上面显示的是在交互模式下,如果输入 3,就显

  • Python实现在tkinter中使用matplotlib绘制图形的方法示例

    本文实例讲述了Python实现在tkinter中使用matplotlib绘制图形的方法.分享给大家供大家参考,具体如下: 一. 代码: # coding=utf-8 import sys import Tkinter as Tk import matplotlib from numpy import arange, sin, pi from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2T

  • Python图形绘制操作之正弦曲线实现方法分析

    本文实例讲述了Python图形绘制操作之正弦曲线实现方法.分享给大家供大家参考,具体如下: 要画正弦曲线先设定一下x的取值范围,从0到2π.要用到numpy模块. numpy.pi 表示π numpy.arange( 0 , 2π ,0.01)  从0到2π,以0.01步进. 令 x=numpy.arange( 0, 2*numpy.pi, 0.01) y=numpy.sin(x) 画图要用到matplotlib.pyplot模块中plot方法. plot(x,y) pyplot.plot.sh

  • Python3使用Matplotlib 绘制精美的数学函数图形

    一个最最简单的例子: 绘制一个从 0 到 360 度完整的 SIN 函数图形 import numpy as np import matplotlib.pyplot as pt x = np.arange(0, 360) # 如果打印 x ,NumPy 会给你很好看的打印格式 # print(x) y = np.sin(x * np.pi / 180) pt.plot(x, y) pt.xlim(0, 360) pt.ylim(-1.2, 1.2) pt.title("SIN function&

  • Python的math模块中的常用数学函数整理

    在数学之中,除了加减乘除四则运算之外--这是小学数学--还有其它更多的运算,比如乘方.开方.对数运算等等,要实现这些运算,需要用到 Python 中的一个模块:Math 模块(module)是 Python 中非常重要的东西,你可以把它理解为 Python 的扩展工具.换言之,Python 默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远不能满足编程实践的需要,于是就有人专门制作了另外一些工具.这些工具被称之为"模块" 任何一个 Pythoner 都可以编写模块,并且把这

  • Python数学形态学实例分析

    本文实例讲述了Python数学形态学.分享给大家供大家参考,具体如下: 一 原始随机图像 1.代码 import numpy as np import matplotlib.pyplot as plt square = np.zeros((32,32))#全0数组 square[10:20,10:20]=1#把其中一部分设置为1 x, y =(32*np.random.random((2,15))).astype(np.int)#随机位置 square[x,y]=1#把随机位置设置为1 plt.

随机推荐