SymPy-符号运算好帮手

摘要:
SymPy-符号运算好帮手SymPy是Python的数学符号计算库,用它可以进行数学公式的符号推导。下面用SymPy验证一下这个公式。下面分别获得tmp的实部和虚部,分别和cos和sin的展开公式进行比较:˃˃˃pprint2468xxxx1+re---+------+-----22472040320˃˃˃pprint2468xxxx1---+------+-----+O22472040320˃˃˃pprint3579xxxxx+im---+--------+------61205040362880˃˃˃pprint3579xxxxx---+--------+------+O612050403628804.2 球体体积在用SciPy数值积分一节我们介绍了如何使用数值定积分计算球体的体积,而SymPy的符号积分函数integrate则可以帮助我们进行符号积分。
SymPy-符号运算好帮手

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

>>> from sympy import *

4.1 封面上的经典公式SymPy-符号运算好帮手第1张

本书的封面上的公式:

e^{mathrm{i} pi} + 1 = 0

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

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

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

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

e^{{mathrm{i}}x}=cos x+ {mathrm{i}} sin x

为了用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 球体体积SymPy-符号运算好帮手第1张

用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坐标函数为:

y(x) = sqrt{r^2 - x^2}

因此我们可以直接对上述函数在-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)计算出。

_images/mayavi2_sphere.png

图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-符号运算好帮手》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇原生JS实现ajax与ajax的跨域请求seldom 1.0 发布下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

码片速率的含义

1.符号速率 符号速率*扩频因子=码片速率,符号速率=码片速率/扩频因子 如: WCDMA, 码片速率= 3.84 MHz ,扩频因子=4 ,则符号速率=960kbps. CDMA 1X, 码片速率=1.2288MHz,扩频因子=64,则符号速率=19.2kbps. 符号速率=(业务速率+校验码)*信道编码*打孔率 如: WCDMA ,业务速率=384kb...

深度理解 原码, 反码, 补码

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机...

数据结构与算法——编程作业——第三章 栈与队列

1:中缀表达式的值 总时间限制: 200ms 内存限制: 1024kB 描述 人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。给定一个中缀表达式,编写程序,利用堆栈的...

汇编语言中的数据类型

目录 一、数制及相互转换 1. N 进制数转换为十进制数 2. 十进制数转换为 N 进制数 3. 二进制数转换为八进制数或十六进制数 4. 八进制数或十六进制数转换为二进制数 二、计算机中数和字符的表示 (一)计算机中数的表示方法 1. 原码表示法 2. 补码表示法 (二)二进制编码 1. 十进制数的二进制编码(BCD 码) 2. 字...

Matlab命令合集 妈妈再也不用担心我不会用matlab了

matlab命令一、常用对象操作:除了一般windows窗口的常用功能键外。1、!dir 可以查看当前工作目录的文件。 !dir& 可以在dos状态下查看。2、who 可以查看当前工作空间变量名, whos 可以查看变量名细节。3、功能键:功能键 快捷键 说明方向上键 Ctrl+P 返回前一行输入方向下键 Ctrl+N 返回下一行输入方向左键 Ct...

标志寄存器(学习汇编)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0   NT IOPL OF DF IF TF SF ZF   AF   PF   CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 未使用 辅助标志 未使用 奇偶标志 未使用 进位标志 1.CPU内部的寄存器中...