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
SymPy-符号运算好帮手的更多相关文章
- 使用octave符号运算求解不定积分、微分方程等(兼容matlab)
1.求解1/(1+cos(x))^2的不定积分. 在和学生讨论一道物理竞赛题的时候,出现了这个函数的积分求解需求.查积分表也可写出答案.但是可以使用octave的符号运算工具箱来做. syms x; ...
- MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏
1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...
- MATLAB符号运算
1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x;>> expand((x+3)^3) ans ...
- MATLAB的符号运算基础
在数学运算中,运算的结果如果是一个数值,可以称这类运算为数值运算:如果运算结果为表达式,在MATLAB中称为符号运算,符号计算是对未赋值的符号对象(可以是常数.变量.表达式)进行运算和处理.MATLA ...
- var、符号运算、条件语句、三元(目)运算、自加和自减
1.var a=“hello world” a 这个变量是字符串了,对于里面的每一个字母来说,他是字节,里面有11个字节,(包括空格),字节总数用length表示 2.符号运算 + 字符串拼接 . ...
- java位运算和无符号运算
计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...
- Matlab 符号运算
root(p):多项式求根.多项式等于0时对应方程的根. 例:,则输入p=[5 4 3 2 1]; root(p) 注:多项式系数都是按幂指数递减形式的. poly([a,b,c]):求已知根为a,b ...
- MATLAB符号对象与符号运算
序言 符号对象(Symbolic Objects 不同于普通的数值计算)是Matlab中的一种特殊数据类型,它可以用来表示符号变量.表达式以及矩阵,利用符号对象能够在不考虑符号所对应的具体数值的情况下 ...
- MATLAB中的符号运算
1. syms命令 可以替换sym和symfun,另外可以定义符号变量的类型,如 syms x positive; 限定x为正数. 若要取消这个限定,则可以用命令 syms x clear; ...
随机推荐
- php pdo mysql数据库操作类
<?php namespace iphp\core; use iphp\App; /** * 数据库操作基类 基于pdo * @author xuen * 支持链式操作,支持参数绑定 * 说明1 ...
- OpenCV2.4.9+VS2012安装与配置
需要下载并安装Visual Studio 2012 然后在OpenCV官网下载安装OpenCV2.4.9 for Windows,网址为http://opencv.org/downloads.html ...
- CSS自学笔记(8):CSS拓展(一)
CSS元素对齐 可以使用margin属性类进行元素的水平对齐 水平对齐块元素时,可以将块元素的margin属性定义为"auto",这里需要注意的是,应该要声明!DOCTYPE,否则 ...
- 利用C#轻松创建不规则窗体
1.准备一个不规则的位图 可以使用任意一种你喜欢的作图工具,制作一个有形状的位图,背景使用一种其他的颜色.这个颜色在编程中用得着,所以最好使用一种容易记忆的颜色.如黄色,文件名为bk.bmp 2.创建 ...
- matlab绘制函数
>> x1=linspace(,*pi,); x2=linspace(,*pi,); x3=linspace(,*pi,); y1=sin(x1); y2=+sin(x2); y3=+si ...
- Java_SSH项目主要步骤记录
建立Spring-Struts-Hibernate的步骤整理 1. 建立web project 2. 建立hernate, action, service包 3. 右击项目,add myeclipse ...
- Unix/Linux环境C编程入门教程(18) kali-linuxCCPP开发环境搭建
1. Kali linux是BT5的晋级版本,用于信息安全.基于Debian7内核.新建虚拟机. 2. 选择默认虚拟机 3. 选择稍后安装操作系统 4.选择Linux Debian7 64位,因为Ka ...
- 《windows核心编程系列》二谈谈ANSI和Unicode字符集 .
http://blog.csdn.net/ithzhang/article/details/7916732转载请注明出处!! 第二章:字符和字符串处理 使用vc编程时项目-->属性-->常 ...
- aix 在线软件包安装 字符集 mysql安装
http://www.oss4aix.org/download/rpmdb/deplists/ Aix6.1 安装mysql别的我就不扯了,自从Oracle收购sun后 Mysql在Aix Parch ...
- Redis事务和分布式锁
Redis事务 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MUL ...