使用python解二元方程组的sympy解符号方程组后,如何将结果带入之后的符号表达式

\ Python SymPy库数学方程问题——线性方程组篇
Python SymPy库数学方程问题——线性方程组篇
人要学会遵守承诺,要信守当初对一个女孩说发的誓言
作者的热门手记
慕课网的小伙伴们!说到数学题,相信大家都不陌生,从小学到大学都跟数学打交道。其中初中的方程组,高中的二次曲线,大学的微积分最为头疼,今天我们将使用python 来解决方程组问题,微积分问题,矩阵化简。
这里我的本机的操作系统是 Ubuntu 14.04 文本编辑器是vim ,在交互环境下解释器使用的IPython,因为Python 是跨平台的,既可以在Mac OS下也可以在Windows下运行,因为这里我们学习的是Python科学计算方面的内容,Windows环境下的朋友建议安装Python(x,y)
简单介绍一下要用到SymPy库。
SymPy是符号数学的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。 SymPy完全是用Python写的,并不需要外部的库。
SymPy库的安装
sudo pip install sympy
解二元一次方程功能实现
解方程的功能主要是使用Sympy中solve函数实现。
导入sympy库
命名变量x y
from sympy import *
x = Symbol('x')
y = Symbol('y')
from sympy import *
x, y = symbols('x y')
第二个用空格隔开,下面代码中用x,y。括号里面的其实可以随意定义,因为是显示用。 比如:
x = Symbol('x1')
但考虑到易读性还是相同比较好
代码表示与手写还是有区别的,下面列出常用的:
对数 log()
e的指数次幂 exp()
对于长的表达式,如果不确定,就加小括号
题目中表达式可表示为:
2 * x - y - 3 = 0
3 * x + y - 7 = 0
由于需要将表达式都转化成右端等于0,这里把常数3和7移到等式左边。
利用solve函数解方程
在解决例子之前,我们先解决一个一元一次的方程。
x * 2 - 4 = 0
print solve(x * 2 - 4, x)
solve:第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数。还有一些 其他的参数,想了解的可以去看官方文档。
下面进行例题求解:
from sympy import *
x = Symbol('x')
y = Symbol('y')
print solve([2 * x - y - 3, 3 * x + y - 7],[x, y])
通过解方程组可知:最终结果x=2,y=1
上文简单介绍了SymPy库,和用SymPy库解决了初中的数学题——线性方程组,下一次我们会介绍如何解决更难的数学题——微积分相关习题,敬请期待,谢谢!
相关标签:
请登录后,发表评论
评论(Enter+Ctrl)
评论加载中...
评论加载中...
Copyright (C)
All Rights Reserved | 京ICP备 号-2在Anaconda 的集成环境 Spyder中可以通过
Preferences & IPython console & Advanced Settings & Use symbolic math
IPython’s SYMbolic PYthon (sympy) 模块
这个模块可以让Spyder 以Latex 风格渲染出非常漂亮的数学表达式,并且在IPython 终端启动时会自动在终端导入一些基本的符号对象。
&&& from __future__ import division
&&& from sympy import *
&&& x, y, z, t = symbols('x y z t')
&&& k, m, n = symbols('k m n', integer=True)
&&& f, g, h = symbols('f g h', cls=Function)
在终端输入如下指令
&&& from sympy import *
&&& x = symbols('x')
&&& a = Integral(cos(x)*exp(x), x)
&&& Eq(a, a.doit())
终端显示结果如下:
可以看到输出的结果非常的漂亮!
Sympy 主页地址:
在官网上可以找到更多的实例代码和教学文档
比较有趣的是有一个 在线的SymPy Shell
在意在网页中输入表达式,然后得到返回的结果,如下图分别输入
&&& expr = x**2 + x*y
&&& srepr(expr)
&&& expr = (x + y)**5
&&& expand(expr)
在右边的 SymPy Live Shell 中可以看到返回的结果,非常的 Nice!
本文已收录于以下专栏:
相关文章推荐
Python 自带符号运算库
from symbol import *
自带常量E和复数单位I
>>>x = Symbol('x', real=True)
>>>y = Symbol('y'...
http://blog.csdn.net/pipisorry/article/details/
SymPy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数...
和其他大多数的语言一样,python 中常用的操作符也有算术操作符、比较操作符、逻辑操作符,但是又有一些差别,下面详细介绍。
1. 算术运算符
和其他大多数的语言一样,python 也有 +(加)、-...
SymPy是Python的数学符号计算库,用它可以进行数学公式的符号推导。为了调用方便,下面所有的实例程序都假设事先从sympy库导入了所有内容:...
http://blog.csdn.net/pipisorry/article/details/引言SymPy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数系...
preface:曾以为不会再用编程遇到定积分的计算,自从本科用过matlab编程计算积分后,没再用matlab,转而投向python的怀抱。python有对应的包sympy,用来计算积分,无论不定积分...
←切换侧栏(Alt+X) |
用Python做科学计算 >>
4 SymPy-符号运算好帮手
SymPy是Python的数学符号...
在学习与科研中,经常会遇到一些数学运算问题,使用计算机完成运算具有速度快和准确性高的优势。Python的Numpy包具有强大的科学运算功能,且具有其他许多主流科学计算语言不具备的免费、开源、轻量级和灵...
虽然大部分Python软件包的安装都非常容易,只要通过pip就可以轻松完成,但是对于复杂的软件包却要显得复杂一些。在Python中有些软件包基于性能上的考虑,或者软件包本身是用其它高级语言写成的链接库...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)SymPy库常用函数
时间: 22:32:41
&&&& 阅读:1205
&&&& 评论:
&&&& 收藏:0
标签:简介
SymPy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。()
更多内容请查看本人个人博客:
Sympy安装方法
安装命令:pip install sympy
基本数值类型
实数,有理数和整数
SymPy有三个内建的数值类型:实数,有理数和整数。有理数类用两个整数来表示一个有理数。分子与分母,所以Rational(1,2)代表1/2,Rational(5,2)代表5/2,等等。
&&&from sympy import *
&&&a = Rational(1,2)
&&&Rational(2)**50/Rational(10)**50
当利用Python的整数计算时要注意一下,Python只会截取除法的整数部分:
然而你可以:
&&&from __future__ import division
&&&1/2 #doctest: +SKIP
正确的除法在python3k和isympy中这样做,是标准的。
特殊的常数
我们也可以有一些特殊的常数,像e和pi,它们会被当作符号去对待。(1+pi不会求得值,反而它会保持为1+pi),例如:
&&&pi.evalf()
&&&(pi+exp(1)).evalf()
求表达式的浮点数-evalf()函数
正如你看到的,evalf()函数可以用求出表达式的浮点数。有一个无穷大的类型,被成为oo:
&&&oo & 99999
If the substitution will be followed by numerical evaluation, it is better to pass the substitution to evalf as
&&& (1/x).evalf(subs={x: 3.0}, n=21)
rather than
&&& (1/x).subs({x: 3.0}).evalf(21)
Sympy基本使用
定义变量-Symbols函数
对比与其他的计算机代数系统,在SymPy中要明确声明符号变量:
&&& x = symbols(‘x‘)
&&&x,y,z=symbols(‘x y z‘)
&&& crazy = symbols(‘unrelated‘)
&&& crazy + 1
unrelated + 1
&&& x = symbols(‘x‘)
&&& expr = x + 1
&&& print(expr)
Changing x to 2 had no effect on expr. This is because x = 2 changes the Python variable x to 2, but has no effect on the SymPy Symbol x, which was what we used in creating expr.
变量替换subs函数
&&& x = symbols(‘x‘)
&&& expr = x + 1
&&& expr.subs(x, 2)
&&& from sympy import pi, exp, limit, oo
&&& from sympy.abc import x, y
&&& (1 + x*y).subs(x, pi)
&&& (1 + x*y).subs({x:pi, y:2})
&&& (1 + x*y).subs([(x, pi), (y, 2)])
&&& reps = [(y, x**2), (x, 2)]
&&& (x + y).subs(reps)
&&& (x + y).subs(reversed(reps))
&&& (x**2 + x**4).subs(x**2, y)
&&& (x**2 + x**4).xreplace({x**2: y})
&&& (x/y).subs([(x, 0), (y, 0)])
&&& (x/y).subs([(x, 0), (y, 0)], simultaneous=True)
&&& ((x + y)/y).subs({x + y: y, y: x + y})
&&& ((x + y)/y).subs({x + y: y, y: x + y}, simultaneous=True)
&&& limit(x**3 - 3*x, x, oo)
调用方式:[subs(*args, **kwargs)]
局部的代数式展开,使用apart(expr, x):
In [1]: 1/( (x+2)*(x+1) )
───────────────
(2 + x)*(1 + x)
In [2]: apart(1/( (x+2)*(x+1) ), x)
───── - ─────
In [3]: (x+1)/(x-1)
────────
In [4]: apart((x+1)/(x-1), x)
1 - ─────
代数式的合并
(相当于展开的逆运算),使用together(expr, x):
In [7]: together(1/x + 1/y + 1/z)
x*y + x*z + y*z
───────────────
In [8]: together(apart((x+1)/(x-1), x), x)
──────
In [9]: together(apart(1/( (x+2)*(x+1) ), x), x)
───────────────
(2 + x)*(1 + x)
在sympy中极限容易求出,它们遵循极限语法 limit(function, variable, point) ,所以计算x-&0时f(x)的极限,即limit(f, x, 0):
&&&from sympy import *
&&&x=Symbol("x")
&&&limit(sin(x)/x, x, 0)
&&&limit(x, x, oo)
&&&limit(1/x, x, oo)
&&&limit(x**x, x, 0)
有一些特殊的极限的例子,可以阅读文件
可以对任意SymPy表达式微分。diff(func, var)。例如:
&&&from sympy import *
&&&x = Symbol(‘x‘)
&&&diff(sin(x), x)
&&&diff(sin(2*x), x)
2*cos(2*x)
&&&diff(tan(x), x)
1 + tan(x)**2
可以通过以下验证:
&&&limit((tan(x+y)-tan(x))/y, y, 0)
1 + tan(x)**2
计算高阶微分 diff(func, var, n) :
&&&diff(sin(2*x), x, 1)
2*cos(2*x)
&&&diff(sin(2*x), x, 2)
-4*sin(2*x)
&&&diff(sin(2*x), x, 3)
-8*cos(2*x)
函数 series(var, point, order):
&&&from sympy import *
&&&x = Symbol(‘x‘)
&&&cos(x).series(x, 0, 10)
1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)
&&&(1/cos(x)).series(x, 0, 10)
1 + x**2/2 + 5*x**4/24 + 61*x**6/720 + 277*x**8/8064 + O(x**10)
SymPy支持不定积分,超越函数与特殊函数的定积分。SymPy有力的扩展Risch-Norman 算法和模型匹配算法。
&&&from sympy import *
&&&x, y = symbols(‘xy‘)
初等函数:
&&&integrate(6*x**5, x)
&&&integrate(sin(x), x)
&&&integrate(log(x), x)
-x + x*log(x)
&&&integrate(2*x + sinh(x), x)
cosh(x) + x**2
特殊函数:
&&&integrate(exp(-x**2)*erf(x), x)
pi**(1/2)*erf(x)**2/4
&&&integrate(x**3, (x, -1, 1))
&&integrate(sin(x), (x, 0, pi/2))
&&&integrate(cos(x), (x, -pi/2, pi/2))
一些广义积分也可以被支持:
&&&integrate(exp(-x), (x, 0, oo))
&&&integrate(log(x), (x, 0, 1))
&&&from sympy import Symbol, exp, I
&&&x = Symbol("x")
&&&exp(I*x).expand()
&&&exp(I*x).expand(complex=True)
I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))
&&&x = Symbol("x", real=True)
&&&exp(I*x).expand(complex=True)
I*sin(x) + cos(x)
三角函数::
In [1]: sin(x+y).expand(trig=True)
Out[1]: cos(x)*sin(y) + cos(y)*sin(x)
In [2]: cos(x+y).expand(trig=True)
Out[2]: cos(x)*cos(y) - sin(x)*sin(y)
In [3]: sin(I*x)
Out[3]: I*sinh(x)
In [4]: sinh(I*x)
Out[4]: I*sin(x)
In [5]: asinh(I)
In [6]: asinh(I*x)
Out[6]: I*asin(x)
In [15]: sin(x).series(x, 0, 10)
x - ── + ─── - ──── + ────── + O(x**10)
In [16]: sinh(x).series(x, 0, 10)
x + ── + ─── + ──── + ────── + O(x**10)
In [17]: asin(x).series(x, 0, 10)
x + ── + ──── + ──── + ───── + O(x**10)
In [18]: asinh(x).series(x, 0, 10)
x - ── + ──── - ──── + ───── + O(x**10)
球谐函数:
In [1]: from sympy.abc import theta, phi
In [2]: Ylm(1, 0, theta, phi)
╲╱ 3 *cos(&)
────────────
In [3]: Ylm(1, 1, theta, phi)
*│sin(&)│*?
────────────────────
In [4]: Ylm(2, 1, theta, phi)
*│sin(&)│*cos(&)*?
────────────────────────────
阶乘和伽玛函数:
In [1]: x = Symbol("x")
In [2]: y = Symbol("y", integer=True)
In [3]: factorial(x)
Out[3]: &G(1 + x)
In [4]: factorial(y)
Out[4]: y!
In [5]: factorial(x).series(x, 0, 3)
x *EulerGamma
1 - x*EulerGamma + ────────────── + ───── + O(x**3)
In [18]: zeta(4, x)
Out[18]: &(4, x)
In [19]: zeta(4, 1)
In [20]: zeta(4, 2)
In [21]: zeta(4, 3)
- ── + ──
In [1]: chebyshevt(2, x)
In [2]: chebyshevt(4, x)
In [3]: legendre(2, x)
-1/2 + ────
In [4]: legendre(8, x)
─── - ────── + ─────── - ─────── + ───────
In [5]: assoc_legendre(2, 1, x)
In [6]: assoc_legendre(2, 2, x)
In [7]: hermite(3, x)
-12*x + 8*x
在isympy中:
In [4]: f(x).diff(x, x) + f(x)
#注意在使用输入该命令之前,一定要声明f=Function(‘f‘)
─────(f(x)) + f(x)
In [5]: dsolve(f(x).diff(x, x) + f(x), f(x))
Out[5]: C?*sin(x) + C?*cos(x)
在isympy中:
In [7]: solve(x**4 - 1, x)
Out[7]: [i, 1, -1, -i]
In [8]: solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y])
Out[8]: {y: 1, x: -3}
矩阵由矩阵类创立建:
&&&from sympy import Matrix
&&&Matrix([[1,0], [0,1]])
不只是数值矩阵,亦可为代数矩阵,即矩阵中存在符号:
&&&x = Symbol(‘x‘)
&&&y = Symbol(‘y‘)
&&&A = Matrix([[1,x], [y,1]])
2*y, 1 + x*y]
关于矩阵更多的例子,请看线性代数教程。
使用 .match()方法,引用Wild类,来执行表达式的匹配。该方法会返回一个字典。
&&&from sympy import *
&&&x = Symbol(‘x‘)
&&&p = Wild(‘p‘)
&&&(5*x**2).match(p*x**2)
&&&q = Wild(‘q‘)
&&&(x**2).match(p*x**q)
{p_: 1, q_: 2}
如果匹配不成功,则返回None:
&&&print (x+1).match(p**x)
可以使用Wild类的&exclude&参数(排除参数),排除不需要和无意义的匹配结果,来保证结论中的显示是唯一的:
&&&x = Symbol(‘x‘)
&&&p = Wild(‘p‘, exclude=[1,x])
&&&print (x+1).match(x+p) # 1 is excluded
&&&print (x+1).match(p+1) # x is excluded
&&&print (x+1).match(x+2+p) # -1 is not excluded
str(expression)返回如下:
&&&from sympy import Integral
&&&from sympy.abc import x
&&&print x**2
&&&print 1/x
&&&print Integral(x**2, x)
Integral(x**2, x)
Pretty Printing
用pprint函数可以输出不错的ascii艺术:
&&&from sympy import Integral, pprint
&&&from sympy.abc import x
&&&pprint(x**2) #doctest: +NORMALIZE_WHITESPACE
&&&pprint(1/x)
&&&pprint(Integral(x**2, x))
[Pretty PrintingWiki]提示:在python解释器中,为使pretty printing为默认输出,使用:
Python 2.5.2 (r252:60911, Jun 25 :32)
[GCC 4.3.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&&& from sympy import *
&&& import sys
&&& sys.displayhook = pprint
&&& var("x")
&&& x**3/3
&&& Integral(x**2, x) #doctest: +NORMALIZE_WHITESPACE
Python printing
&&&from sympy.printing.python import python
&&&from sympy import Integral
&&&from sympy.abc import x
&&&print python(x**2)
x = Symbol(‘x‘)
&&&print python(1/x)
x = Symbol(‘x‘)
&&&print python(Integral(x**2, x))
x = Symbol(‘x‘)
e = Integral(x**2, x)
LaTeX printing
&&&from sympy import Integral, latex
&&&from sympy.abc import x
&&&latex(x**2)
&&&latex(1/x)
$\frac{1}{x}$
&&&latex(Integral(x**2, x))
$\int x^{2}\,dx$
&&&from sympy.printing.mathml import mathml
&&&from sympy import Integral, latex
&&&from sympy.abc import x
&&&print mathml(x**2)
&apply&&power/&&ci&x&/ci&&cn&2&/cn&&/apply&
&&&print mathml(1/x)
&apply&&power/&&ci&x&/ci&&cn&-1&/cn&&/apply&
&&&from sympy import Integral, preview
&&&from sympy.abc import x
&&&preview(Integral(x**2, x)) #doctest:+SKIP
Isympy默认调用pprint,所以这就是为什么看到pretty printing为默认的。
有一个打印的有效模块,sympy.printing。用这个模块实现其他的打印:
pretty(expr), pretty_print(expr), pprint(expr): 分别返回或者输出,,表达式的漂亮描述。这是相同
latex(expr), print_latex(expr):分别返回或者输出,LaTex描写的表达式
mathml(expr), print_mathml(expr):分别返回或者输出,MathML描写的表达式
print_gtk(expr): 表达式打印到Gtkmathview , 这是一个GTK小配件显示MathML代码。Gtkmathview程序是必须的。
本文转载自于:
Sympy源码库:
SymPy&s documentation:
SymPy-符号运算好帮手:
SymPy Tutorial(译):
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!小实验1 | 使用python解数学方程 - 简书
小实验1 | 使用python解数学方程
1.下载sympy库sudo pip3 install sympy若没有pip3先用命令下载pip3sudo dnf install python3-pip2.从sympy库导入函数有两种语法,建议使用from sympy import *表示导入包内所有的函数,可以具体导入一个函数 from 包名 import 函数名x = Symbol('x')y = Symbol('y')每次进入python环境都要重新import否则出现错误:函数名未定义NameError: name 'Symbol' is not defined使变量变成符号:注意Symbol函数首字母大写,否则提示TypeError: 'module' object is not callable第二种语法import sympy所有的函数前面都要加上包名sympy.若两句话都打,运行后面一句3.了解基本运算符指数运算 a**be的指数次幂 exp()
解线性方程
使用函数solve()第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数print(solve(x*2-4,x))[2]输出的是list类型print(solve([x*2-y-3,3*x+y-7],[x,y])){x: 2, y: 1}输出的是dict类型
使用函数 limit()第一个参数为要求的函数,第二个为变量,第三个为变量趋于多少
oo 无穷大(标识方式是两个小写字母o连接在一起)E epi 圆周率
另外可以使用init_printing()或pprint()来使我们的输出更直观
使用integrate()函数求不定积分:第一个参数是被积函数,第二个参数是积分变量求定积分:第一个参数是被积函数,第二个参数是一个元组元组内三个变量,第一个为积分变量,后面分别是下界与上界
解微分方程
f = Function(‘f’)用Function定义一个函数diff(f(x),x) 表示f(x)对x求导diff(a,b,c) a对b求导,c为数字,求c阶导数使用dsolve(eq,f(x))函数第一个参数为微分方程(要先将等式移项为右端为0的形式)。第二个参数为要解的函数(在微分方程中)

我要回帖

更多关于 python解线性方程组 的文章

 

随机推荐