用python和sympy库解决方程组问题_使用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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
用python和sympy库解决方程组问题_使用Python的SymPy库解决数学运算问题的方法相关推荐
- 用python和sympy库解决方程组问题_使用 Python 解数学方程
说到数学题,相信大家都不陌生,从小学到大学都跟数学打交道. 其中初中的方程组,高中的二次曲线,大学的微积分最为头疼, 这个项目 就使用python 来解决方程组问题,微积分问题,矩阵化简. SymPy ...
- python自动化测试脚本可以测php吗_利用Python语言实现实验室自动化
作为一名系统和应用工程师,得益于自动化仪器和软件,我已经节省了不计其数的日日夜夜;例如LabVIEW,这是一款系统设计平台和开发环境,支持可视化编程语言.LabVIEW支持用户利用友好的图形用户界面( ...
- python求方程组近似解_使用python的sympy解符号方程组后,如何将结果带入之后的符号表达式...
满意答案 ur51yykufe 2017.11.22 采纳率:52% 等级:12 已帮助:12434人 Sympy是python中非常强大的符号运算库,可以以书写习惯表示数学表达式.下面介绍用S ...
- python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性
随着趋势发展的核心转向更多而不是更快发展,最大限度地提高并发性的重要性日益凸显.并发性使得编程模式发生了新的转变,可以编写异步代码,从而将多个任务分散到一组线程或进程中并行工作.如果您不是编程新手并且 ...
- python七段数码管绘制单个数字_使用Python的turtle库实现七段数码管绘制
七段数码管绘制: 七段数码管是由7段数码管拼接而成,每段有亮或不亮两种情况,改进的七段数码管还包括一个小数点位置. 七段数码管能形成2^7=128种状态,其中部分状态能够显示易于人们理解的数字或字母含 ...
- python生成词云图个人技术报告_【Python成长之路】词云图制作
[写在前面] 以前看到过一些大神制作的词云图 ,觉得效果很有意思.如果有朋友不了解词云图的效果,可以看下面的几张图(图片都是网上找到的): 网上找了找相关的软件,有些软件制作 还要付费.结果前几天在大 ...
- python携程怎么做数据同步_利用python yielding创建协程将异步编程同步化
转自:http://www.jackyshen.com/2015/05/21/async-operations-in-form-of-sync-programming-with-python-yiel ...
- python中format函数用法简书_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...
Python和PyCharm的安装:学会Python和PyCharm的安装方法 变量和字符串:学会使用变量和字符串的基本用法 函数与控制语句:学会Python循环.判断语句.循环语句和函数的使用 Py ...
- python查询和替换一个文本字符串_【Python】python面试题
一些Python面试题 1. (1)python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只 ...
最新文章
- PHP回调函数的几种用法
- centos 自动挂载磁盘
- java面试第十四天
- ThinkPHP调用连连支付
- qt-信号和槽的连接写法
- sql replace 双引号变单引号_sql-汇总、排序以及分析思路
- http://www.jianshu.com/p/42e11515c10f#
- 反编译C#的dll文件并修改,再重新生成dll
- JMX监测JVM报错
- (转)Java ConcurrentModificationException异常原因和解决方法
- js实现爬取QQ群管理页面所有QQ群成员信息
- SpringBoot整合Magic-Api
- 现实中的软件工程:如何快速迭代代码
- (附源码)node.js物资管理系统 毕业设计 071130
- 常用的向量矩阵求导公式
- 实时日志/数据库采集处理,实时用户行为属性个人总结
- [2001-2003美/新等合拍经典奇幻大片][魔戒1-3][BD-RMVB][中英字幕/1280x720高清晰版]
- 服务器里面的文件复制不出来,云服务器 拷贝文件进去弄不了
- 使用原生JavaScript做一个简单日历
- 语音的时频分析(一)
热门文章
- 【Proteus仿真8086】往8086 内存中写入数据
- 华为怎么查看手机温度_如果你的华为手机拿去维修,记得打开这个功能,防止秘密被查看...
- OpenGL加载2D的草地
- java String 常用方法集合
- react ---IOS AND ADROID
- Android--获取当前系统的语言环境
- Tasker to stop Poweramp control for the headset while there is an incoming SMS - frozen
- 杭电1232(图—并查集)
- 中移动酝酿改革数据业务分成模式:SP与CP分开
- [转载] Python杂记之 list.clear()方法,清空列表