【Python】四、Sympy——《用Python做科学计算》

xiaoxiao2021-02-28  77

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

1.经典公式

叫做欧拉恒等式,其中e是自然指数的底,i是虚数单位,pi是圆周率。此公式被誉为数学最奇妙的公式,它将5个基本数学常数用加法、乘法和幂运算联系起来。下面用SymPy验证一下这个公式。 载入的符号中,E表示自然指数的底,I表示虚数单位,pi表示圆周率,因此上述的公式可以直接如下计算: >>> E**(I*pi)+1 0 欧拉恒等式可以下面的公式进行计算, 为了用SymPy求证上面的公式,我们需要引入变量x。在SymPy中,数学符号是Symbol类的对象,因此必须先创建之后才能使用: >>> x = Symbol('x') expand函数可以将公式展开,我们用它来展开E**(I*x)试试看: >>> expand( E**(I*x) ) exp(I*x) 没有成功,只是换了一种写法而已。这里的exp不是math.exp或者numpy.exp,而是sympy.exp,它是一个类,用来表述自然指数函数。 --------------------------------------------------------------------------------------------- math.exp(x):返回x的指数,x必须是一个数。 numpy.exp(x):返回x的指数,x可以是数组,可以是一个数。 >>> import math >>> import numpy as np >>> x = 2 >>> y = np.array([1,2,3,4]) >>> z = np.array([2]) >>> math.exp(x) 7.38905609893065 >>> math.exp(z) 7.38905609893065 >>> math.exp(y) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: only length-1 arrays can be converted to Python scalars >>> np.exp(x) 7.3890560989306504 >>> np.exp(z) 7.3890560989306504 >>> np.exp(y) array([ 2.71828183, 7.3890561 , 20.08553692, 54.59815003]) numpy就是python的数组运算包! ---------------------------------------------------------------------------------------------- expand函数有关键字参数complex(带有虚部的参数类型,本质就是复数,NumPy里讲过),当它为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) ---------------------------------------------------------------------------------------------- python中单引号''和双引号""用法: 它们其实并没有明确的区别和特别用法,绝大部分情况是可以互相替换的。但是有一种情况需要注意: >>> str = "Hello,world!" >>> str1 = 'Hello,world!' >>> str2 = "Let's go!" >>> str3 = 'Let\'s go!' # \是转意符号,告诉系统其后'的作用不是引号。 >>> str4 = "Say:\"Hello!\"" >>> str5 = 'Say:"Hello"' >>> print str Hello,world! >>> print str1 Hello,world! >>> print str2 Let's go! >>> print str3 Let's go! >>> print str4 Say:"Hello!" >>> print str5 Say:"Hello" 下面不加转意符号会出现报错提示: >>> str6 ='Let's go!' File "<stdin>", line 1 str6 ='Let's go!' ^ SyntaxError: invalid syntax ----------------------------------------------------------------------------------------------

2.积分运算

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坐标函数为: >>> 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)计算出。 因此我们需要对circle_area中的变量r进行替代: >>> circle_area = circle_area.subs(r, sqrt(r**2-x**2)) >>> circle_area pi*(r**2 - x**2) 然后对circle_area中的变量x在区间-r到r上进行定积分,得到球体的体积公式: >>> integrate(circle_area, (x, -r, r)) 4*pi*r**3/3 用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进行交换。 ---------------------------------------------------------------------------------------------- 我这里举一些例子就明白了。 >>> from sympy import * >>> a,b,c = symbols('a,b,c') #首字母小写 >>> y = a + 10*b + 100*c >>> y = y.subs(a,b) >>> y 11*b + 100*c >>> y = a + 10*b + 100*c >>> y = y.subs([(a,b),(b,c)]) >>> y 111*c >>> y = a + 10*b + 100*c >>> y = y.subs([(a,b),(b,a)]) >>> y 11*a + 100*c >>> x=Symbol('x') #注意这个首字母大写 >>> y = a + 10*b + 100*c >>> y = y.subs([(a,x),(b,a),(x,b)]) >>> y 10*a + b + 100*c 最后这个按顺序用笔写写。 ---------------------------------------------------------------------------------------------

想看完整内容,请去原文地址:http://old.sebug.net/paper/books/scipydoc/sympy_intro.html

转载请注明原文地址: https://www.6miu.com/read-82749.html

最新回复(0)