SymPy-符号运算好帮手

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
时间: 2024-11-25 12:53:43

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

java位运算和无符号运算

计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进行+1操作. System.out.println( 8 >> 1);//正数进行右移位运算 8的二进制是 0000 0000 0000 0000 0000 0000 0000 1000,进行右移1位得到二进制0000 0000 0000 0000 0000 0000 0000 0100,然后转成

MATLAB的符号运算基础

作者:长沙理工大学 交通运输工程学院 王航臣 在数学运算中,运算的结果如果是一个数值,可以称这类运算为数值运算:如果运算结果为表达式,在MATLAB中称为符号运算,符号计算是对未赋值的符号对象(可以是常数.变量.表达式)进行运算和处理.MATLAB具有符号数学工具箱(SymbolicMath Toolbox),将符号运算结合到MATLAB的数值运算环境.符号数学工具箱是建立在Maple软件基础上的. (一)  符号变量建立符号变量和符号常数 建立符号变量的方法有两种,应用,应用sym与syms函

Verilog中的符号运算

在Verilog-1995中,只有integer数据类型被转移成有符号数,而reg和wire数据类型则被转移成无符号数.由于integer类型有固定的32位宽,因此它不太灵活. 在Verilog-2001中,有符号形式也被扩展到reg和wire数据类型中.新加一个关键字,signed,可以按照下面的方式定义: reg     signed[7:0] test; wire    signed[7:0] test_w; 下面是一些有符号计算以及赋值语句实例: 可见,在进行有符号运算时,表达式中的变量

MATLAB符号运算

1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x;>> expand((x+3)^3) ans = x^3 + 9*x^2 + 27*x + 27 例2. 因式分解(x9-1) >> syms x;>> factor(x^9-1) ans = (x - 1)*(x^2 + x + 1)*(x^6 + x^3 + 1) 2.向量点乘 >> A =[ 1, 2,3];&

Verilog -- 有符号与无符号运算

目录 Verilog中有符号与无符号的加法和乘法运算 无符号乘法和加法 有符号乘法和加法 有符号和无符号运算 参考: https://blog.csdn.net/vivid117/article/details/101427302 http://wscentity.lofter.com/post/1d00edbd_6476453 Verilog中有符号与无符号的加法和乘法运算 无符号乘法和加法 对于无符号的乘法和加法,没有什么好说的,就是直接用'*'和'+'. 有符号乘法和加法 有符号和无符号运

vs2013在图像处理中的应用(2):用sympy进行符号运算

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 很久没有摸图像处理的东西了,近期刚好需要有此需求,希望能够有一个比较好用的开发环境.在学校的时候做图像处理一直用的是matlab,不过现在正好在做VELT的开发,尝试用vs2013+python构造一个适合于自己用的开发环境. sympy是python的数学符号计算库,可用于数学表达式的符号推导和演算. 1.1.1 

python sympy包符号运算进行定积分计算

preface:曾以为不会再用编程遇到定积分的计算,自从本科用过matlab编程计算积分后,没再用matlab,转而投向python的怀抱.python有对应的包sympy,用来计算积分,无论不定积分还是定积分. 主要用到integrate这个函数, >>>:from sympy import integrate >>>:integrate? 可以找到integrate函数的用法, 另外使用符号变量的时候,需要先导入符号,在sympy.abc下.以下为一个小的例子(si

Matlab 符号运算

root(p):多项式求根.多项式等于0时对应方程的根. 例:,则输入p=[5 4 3 2 1]; root(p) 注:多项式系数都是按幂指数递减形式的. poly([a,b,c]):求已知根为a,b,c所对应的多项式. 例:>>P1=ploy([2,3,4]) P1= 1 -9 26 -24 %即所求多项式为 可以看出,root 和ploy互为逆运算. 注:ploy也可以求特征根.ploy(X):即求矩阵X的特征根. ployval(p,a):输出指定点x=a时的多项式值. conv(p,q

python邂逅——符号运算(一)

1.布尔运算符 共三个 not 逻辑取反 eg:not 1 return false and 优先返回假值的对象 eg:1 and 0 return 0 12 and 100 return 12 or 优先返回真值对象 eg:1 or 2 return 1 0 or 20 return20 2.位运算 & | ^ << >> ~ &:位与运算 输入相同值则返回相同值,不同则返回0 eg:7 & 7 return 7 8 & 9 return 0 |: