SymPy-符号运算好帮手

SymPy是Python的数学符号计算库,用它可以进行数学公式的符号推导。为了调用方便,下面所有的实例程序都假设事先从sympy库导入了所有内容:

>>> from sympy import *

4.1 封面上的经典公式

本书的封面上的公式:

叫做欧拉恒等式,其中e是自然指数的底,i是虚数单位,  是圆周率。此公式被誉为数学最奇妙的公式,它将5个基本数学常数用加法、乘法和幂运算联系起来。下面用SymPy验证一下这个公式。

载入的符号中,E表示自然指数的底,I表示虚数单位,pi表示圆周率,因此上述的公式可以直接如下计算:

>>> E**(I*pi)+1
0

欧拉恒等式可以下面的公式进行计算,

为了用SymPy求证上面的公式,我们需要引入变量x。在SymPy中,数学符号是Symbol类的对象,因此必须先创建之后才能使用:

>>> x = Symbol('x')

expand函数可以将公式展开,我们用它来展开E**(I*pi)试试看:

>>> expand( E**(I*x) )
exp(I*x)

没有成功,只是换了一种写法而已。这里的exp不是math.exp或者numpy.exp,而是sympy.exp,它是一个类,用来表述自然指数函数。

expand函数有关键字参数complex,当它为True时,expand将把公式分为实数和虚数两个部分:

>>> expand(exp(I*x), complex=True)
I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))

这次得到的结果相当复杂,其中sin, cos, re, im都是sympy定义的类,re表示取实数部分,im表示取虚数部分。显然这里的运算将符号x当作复数了。为了指定符号x必须是实数,我们需要如下重新定义符号x:

>>> x = Symbol("x", real=True)
>>> expand(exp(I*x), complex=True)
I*sin(x) + cos(x)

终于得到了我们需要的公式。那么如何证明它呢。我们可以用泰勒多项式展开:

>>> tmp = series(exp(I*x), x, 0, 10)
>>> pprint(tmp)
           2      3    4      5     6      7      8        9
          x    I*x    x    I*x     x    I*x      x      I*x
1 + I*x - -- - ---- + -- + ---- - --- - ---- + ----- + ------ + O(x**10)
          2     6     24   120    720   5040   40320   362880

series是泰勒展开函数,pprint将公式用更好看的格式打印出来。下面分别获得tmp的实部和虚部,分别和cos(x)和sin(x)的展开公式进行比较:

>>> pprint(re(tmp))
                    2    4     6      8
                   x    x     x      x
1 + re(O(x**10)) - -- + -- - --- + -----
                   2    24   720   40320
>>> pprint( series( cos(x), x, 0, 10) )
     2    4     6      8
    x    x     x      x
1 - -- + -- - --- + ----- + O(x**10)
    2    24   720   40320
>>> pprint(im(tmp))
                    3     5     7       9
                   x     x     x       x
x + im(O(x**10)) - -- + --- - ---- + ------
                   6    120   5040   362880
>>> pprint(series(sin(x), x, 0, 10))
     3     5     7       9
    x     x     x       x
x - -- + --- - ---- + ------ + O(x**10)
    6    120   5040   362880

4.2 球体体积

用SciPy数值积分一节我们介绍了如何使用数值定积分计算球体的体积,而SymPy的符号积分函数integrate则可以帮助我们进行符号积分。integrate可以进行不定积分:

>>> integrate(x*sin(x), x)
-x*cos(x) + sin(x)

如果指定x的取值范围的话,integrate则进行定积分运算:

>>> integrate(x*sin(x), (x, 0, 2*pi))
-2*pi

为了计算球体体积,首先让我们来看看如何计算圆形面积,假设圆形的半径为r,则圆上任意一点的Y坐标函数为:

因此我们可以直接对上述函数在-r到r区间上进行积分得到半圆面积,注意这里我们使用symbols函数一次创建多个符号:

>>> x, y, r = symbols('x,y,r')
>>> 2 * integrate(sqrt(r*r-x**2), (x, -r, r))
2*Integral((r**2 - x**2)**(1/2), (x, -r, r))

很遗憾,integrate函数没有计算出结果,而是直接返回了我们输入的算式。这是因为SymPy不知道r是大于0的,如下重新定义r,就可以得到正确答案了:

>>> r = symbols('r', positive=True)
>>> circle_area = 2 * integrate(sqrt(r**2-x**2), (x, -r, r))
>>> circle_area
pi*r**2

接下来对此面积公式进行定积分,就可以得到球体的体积,但是随着X轴坐标的变化,对应的切面的的半径会发生变化,现在假设X轴的坐标为x,球体的半径为r,则x处的切面的半径为可以使用前面的公式y(x)计算出。

图4.1 球体体积的双重定积分示意图

因此我们需要对circle_area中的变量r进行替代:

>>> circle_area = circle_area.subs(r, sqrt(r**2-x**2))
>>> circle_area
pi*(r**2 - x**2)

用subs进行算式替换

subs函数可以将算式中的符号进行替换,它有3种调用方式:

  • expression.subs(x, y) : 将算式中的x替换成y
  • expression.subs({x:y,u:v}) : 使用字典进行多次替换
  • expression.subs([(x,y),(u,v)]) : 使用列表进行多次替换

请注意多次替换是顺序执行的,因此:

expression.sub([(x,y),(y,x)])

并不能对两个符号x,y进行交换。

然后对circle_area中的变量x在区间-r到r上进行定积分,得到球体的体积公式:

>>> integrate(circle_area, (x, -r, r))
4*pi*r**3/3

SymPy-符号运算好帮手的更多相关文章

  1. 使用octave符号运算求解不定积分、微分方程等(兼容matlab)

    1.求解1/(1+cos(x))^2的不定积分. 在和学生讨论一道物理竞赛题的时候,出现了这个函数的积分求解需求.查积分表也可写出答案.但是可以使用octave的符号运算工具箱来做. syms x; ...

  2. MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏

    1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...

  3. MATLAB符号运算

    1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x;>> expand((x+3)^3) ans ...

  4. MATLAB的符号运算基础

    在数学运算中,运算的结果如果是一个数值,可以称这类运算为数值运算:如果运算结果为表达式,在MATLAB中称为符号运算,符号计算是对未赋值的符号对象(可以是常数.变量.表达式)进行运算和处理.MATLA ...

  5. var、符号运算、条件语句、三元(目)运算、自加和自减

    1.var  a=“hello world” a 这个变量是字符串了,对于里面的每一个字母来说,他是字节,里面有11个字节,(包括空格),字节总数用length表示 2.符号运算 + 字符串拼接 . ...

  6. java位运算和无符号运算

    计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...

  7. Matlab 符号运算

    root(p):多项式求根.多项式等于0时对应方程的根. 例:,则输入p=[5 4 3 2 1]; root(p) 注:多项式系数都是按幂指数递减形式的. poly([a,b,c]):求已知根为a,b ...

  8. MATLAB符号对象与符号运算

    序言 符号对象(Symbolic Objects 不同于普通的数值计算)是Matlab中的一种特殊数据类型,它可以用来表示符号变量.表达式以及矩阵,利用符号对象能够在不考虑符号所对应的具体数值的情况下 ...

  9. MATLAB中的符号运算

    1.      syms命令 可以替换sym和symfun,另外可以定义符号变量的类型,如 syms x positive; 限定x为正数. 若要取消这个限定,则可以用命令 syms x clear; ...

随机推荐

  1. 开发移动端web应用, 使用手机自带键盘的搜索按钮

    很多时候在移动端的web页面中, 需要使用搜索功能, 然而页面中并没有太多的空间来放置一个像pc端上那样的搜索按钮, 这时候就需要借用手机输入法自带的搜索按钮来实现点击搜索 虽然不是什么大的功能, 但 ...

  2. Window2003、xp远程备份数据库文件(xcopy+rar+pscp)

    Window2003.xp远程备份数据库文件 xcopy+rar+pscp .bat脚本 Eg: xcopy d:\dbtest\*.* d:\dbtemp\ /y D:\backup\Rar.exe ...

  3. JAVA 8 新特性和改进

    Java 8的所有新特性及改进包括(JEP全称为JDK Enhancement Proposal,JDK改进建议): 语言改进: JEP 126:Lambda表达式 & 虚拟扩展方法 JEP ...

  4. 【学习笔记03】Javascript数组学习

    数组定义的方法一: var Myarr=new Array(); //先声明一维 for(var i=0;i<2;i++){ //一维长度2 Myarr[i]=new Array(); //再声 ...

  5. 转:一个跨WINDOWS LINUX平台的线程类

     来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS ...

  6. eclipse 代码补全

    代码补全 window-> properties -> Java ->Editor ->content Assist -> Auto activation trigger ...

  7. C# 单向链表数据结构 (一)

    单向链表数据结构是有节点组成,每个节点包含两部分,第一部分为存储数据,第二部分为指向下一个节点的指针.注意,有两个特色的节点,分别为“头节点”和“尾节点”,头节点本身没有数据,只存储下一个节点的指针, ...

  8. relatedTarget, fromElement, toElement

    原文:http://www.quirksmode.org/js/events_mouse.html#relatedtarget W3C在mouseover和mouseout事件中添加了relatedT ...

  9. C语言入门(19)——C语言的编码风格

    代码风格好不好就像字写得好不好看一样,如果一个公司招聘秘书,肯定不要字写得难看的,同理,代码风格糟糕的程序员肯定也是不称职的.虽然编译器不会挑剔难看的代码,照样能编译通过,但是和你一个团队进行协作的其 ...

  10. 从缓冲上看阻塞与非阻塞socket在发送接收上的区别

    最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解.所以我想写一篇文章来纠正错误,并作为记 ...