6.Python科学计算与数据处理_第1页
6.Python科学计算与数据处理_第2页
6.Python科学计算与数据处理_第3页
6.Python科学计算与数据处理_第4页
6.Python科学计算与数据处理_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1SymPy符号运算库目录从例子开开始欧拉恒等等式球体体积积数学表达达式符号数值运算符和和函数符号运算算表达式变变换和化化简方程2目录微分微分方程程积分其他功能能34SymPy是一个符符号数学学Python库。它的的目标是是成为一一个全功功能的计计算机代代数系统统,同时时保持代代码的精精简而易易于理解解和可扩扩展。SymPy完全由Python写成,不不需要任任何外部部库。可用SymPy进行行数学表表达式的的符号推推导和演演算。可使用isympy运运行程序序,isympy在IPython的基基础上添添加了数数学表达达式的直直观显示示功能。启动时时还会自自动运行行下面的的程序:这段程序序首先将将P

2、ython的除法法操作符符“/”从整整数除法法改为普普通除法法。然后从从SymPy库载载 入所所有符号号,并且且定义了了四个通用用的数学学符号x、y、z、t,三个表表示整数数的符号号k、m、n,以及及三个表表示数学学函数的的符号f、g、h。5from _future_import divisionfrom sympy import*x,y,z,t =symbols(x,y,z,t)k,m,n =symbols(k,m,n,integer=True)f,g,h =symbols(f,g,h,cls=Function)#init_printing()从例子开开始欧拉恒等等式此公式被被称为欧欧拉恒等

3、等式,其其中e是自然然常数,i是虚虚数单位位,是是圆周周率。此此公式被被誉为数数学中最最奇妙的的公式,它将5个基本本数学常常数用加加法、乘乘法和幂运算联联系起来来。从SymPy库库载入的的符号中中,E表表示自然然常数,I表示示虚数单单位,pi表示示圆周率,因此此上面的的公式式可以直直接如下下计算:6E*(I*pi)+10从例子开开始SymPy除了了可以直直接计算算公式的的值之外外,还可可以帮助助做数学学公式的的推导和和证明。欧拉恒恒等式可可以将代代入下下面的欧欧拉公式式得到:在SymPy中中可以使使用expand()将表达达式展开开,用它它展幵试试试看看:没有成功功,只是是换了一一种写法法而已

4、。当expand()的complex参参数为True时,表表达式将将被分为为实数和和虚数两两个部分分:7expand(E*(I*x)exp(I*x)从例子开开始这次将表表达式展展开了,但是得得到的结结果相当当复杂。显然,expand()将x当做复复数了。为了指指定x为为实数,需要重重新定义义x:终于得到到了需要要的公式式。可以用用泰勒多多项式对对其进行行展开:8expand(exp(I*x),complex=True)I*exp(-im(x)*sin(re(x)+exp(-im(x)*cos(re(x) x= Symbol(x, real=True)expand(exp(I*x),comple

5、x=True)Isin(x)+cos(x)从例子开开始series()对表表达式进进行泰勒勒级数展展开。可以看到到展开之之后虚数数项和实实数项交交替出现现。根据据欧拉公公式,虚虚数项的的和应该该等于sin(x)的的泰勒展展开,而而实数项项的和应应该等于于cos(x)的泰勒展展开。9tmp=series(exp(I*x), x, 0, 10)printtmp1 +I*x -x*2/2 -I*x*3/6+x*4/24 +I*x*5/120- x*6/720 -I*x*7/5040+x*8/40320 +I*x*9/362880+ O(x*10)tmp从例子开开始下面获得得tmp的实部部:下面对co

6、s(x)进行泰泰勒展开开,可看到其其中各项项和上面面的结果果是一致致的。10re(tmp)x*8/40320 -x*6/720+x*4/24 -x*2/2 +re(O(x*10) +1series(cos(x),x,0,10)1 -x*2/2 +x*4/24- x*6/720 +x*8/40320+ O(x*10)从例子开开始11下面获得得tmp的的虚部:下面对sin(x)进行泰泰勒展开开,其中中各项也也和上面面的结果果一致。由于展展开开式的实实部和虚虚部分别别等于cos(x)和和sin(x),因此此验证了了欧拉公公式的正正确性。im(tmp)x*9/362880- x*7/5040+ x*5

7、/120 -x*3/6 +x+ im(O(x*10)series(sin(x),x,0,10)x -x*3/6 +x*5/120-x*7/5040+x*9/362880+ O(x*10)从例子开开始球体体积积Scipy介绍绍了如何何使用数数值定积积分计算算球体的的体积,SymPy中中的integrate()则可以以进行符符号积分分。用integrate()进行行不定积积分运算算:如果指定定变量x的取值值范围,integrate()就能能进行定定积分运运算:12integrate(x*sin(x),x)-x*cos(x)+sin(x)integrate(x*sin(x),(x,0,2*pi)-

8、2*pi从例子开开始为了计算算球体体体积,首首先看看看如何计计算圆的面积积,假设设圆的半半径为r,则圆上上任意一一点的Y坐标函函数为:因此可以以直接对对函数y(x)在-r到r区区间上进行定积积分得到到半圆面面积。13x,y,r=symbols(x,y,r)f=2 *integrate(sqrt(r*r-x*2),(x,-r, r)printf2*Integral(sqrt(r*2- x*2),(x,-r, r)从例子开开始首先需要要定义运运算中所所需的符符号,这这里用symbols()一次创建建多个符符号。Integrate()没有有计算出出积分结结果,而而是直接接返冋了了输入的的算式。这是因

9、因为SymPy不知道道r是大大于0的,重重新定定义r,就可以以得到正正确答案案了:接下来对对此面积积公式进进行定积积分,就就可以得得到球体体的体积积,但是是随着X轴坐标标的变化化,对应应切面的的半径也也会发生生变化。14r= symbols( r,positive=True)circle_area=2 *integrate(sqrt(r*2-x*2),(x, -r,r)printcircle_areapi*r*2从例子开开始假设X轴的坐坐标为x,球体的的半径为为r,那么么x处球球的切面面半径可可以使用用前面的的公式y(x)计算出出。因此此需要对对圆的面面积公式式circle_area中中的变量

10、量r进行行替代:然后对circle_area中的的变量x在区间间-r到到r上进进行定积积分,就就可以得得到球体体的体积积公式:15circle_area=circle_area.subs(r, sqrt(r*2-x*2)printcircle_areapi*(r*2- x*2)printintegrate(circle_area,(x,-r, r)4*pi*r*3/3从例子开开始16用subs进行行算式替替换:subs()可可以将算算式中的的符号进进行替换换,它有有3种调调用方式式:expression.subs(x,y):将算式式中的x替替换成y.expression.subs(x:y,u:

11、v):使使用字典典进行多多次替换换.expression.subs(x,y),(u,v):使用列列表进行行多次替替換.请注意多多次替换换是顺序序执行的的,因此此:expression.subs(x,y),(y,x)并不能对对符号x和y进进行交换换。数学表达达式符号创建一个个符号使使用symbols(),此函数数会返回回一个Symbol对象,用用于表示示符号变变量,其其有name属性,这这是符号号名,如如:其中左边边的x是一个符符号对象象,而右右边括号号中用引引号包着着的x是符号对对象的name属性,两两个x不要求一一样,但但是为了了易于理理解,通通常将符符号对象象和name属性显示示成一样样,

12、另外外name属性是引引号包起起来的。如要同同时配置置多个符符号对象象,symbols()中多个name属性可以以以17x0=symbols(x0)数学表达达式空格或者者逗号分分隔,然然后用引引号包住住,如下下:一次配置置三个符符号,由由于符号号对象名名和name属性名经经常一致致,所以以可以使使用var()函数数,如:这语句和和上个语语句功能能一致,在当前前环境中中创建了了4个同名的的Symbol对象(为为了防止止误会,使用symbols其实更好好)。18var(x0,y0,x1,y1)(x0, y0,x1,y1)x0,y0,x1,y1=symbols(x0,y0,x1,y1)数学表达达式上

13、面的语语句创建建了名为为x0、y0、x1、y1的4个Symbol对象象,同时时还在当当前的环环境中创创建了了4个同名名的变量量来分别别表示这这4个Symbol对对象。因因为符号号对象在在转换为为字符串串时直接接使用它它的name属性,因因此在交交互式环环境中看看到变量量,x0的的值就是是x0,但是査査看变量量x0的类型时时就可以以发现,它实际际上是一一个Symbol对对象。19x0 x0type(x0)sympy.core.symbol.Sx0type()str数学表达达式变量名和和符号名名当然也也可以是是不一样样的,例例如:数学公式式中的符号一般般都有特

14、特定的假假设,例例如m、n通常是是整数,而z经经常表示示复数。在用var()、symbols()或或Symbol()创创建Symbol对象象时,可可以通过过关键字字参数指指定所创创建符号的假假 设条条件,这这些假设设条件会会影响到到它们所所参与的的计算。20a,b= symbols(alpha,beta)a,b(alpha, beta)数学表达达式例如,下下面创建建了两个个整数符符号m和和n,以以及一一个正数数符号x:每个符号号都有许许多is_*属属性,用用以判断断符号的的各种假假设条件件。在IPython中,使使用自动动完成成功能可可以快速速査看这这些假设设的名称称。注意下划线线后为大大写字

15、母母的属性性,用来来判断对对象的类类型;而全小写写字母的的属性,则用来来判断符符号的假假设条件件。21m,n= symbols(m,n, integer=True)x= Symbol(x, positive=True)数学表达达式22x.is_#按了tab键自动完完成x.is_Symbol#x是一个符符号Truex.is_positive# x是一个正正数Truex.is_imaginary#因为x可以比较较大小,所以它它不是虚虚数Falsex.is_complex #x是一个复复数,因因为复数数包括实实数,而而实数包包括正数数True数学表达达式23使用assumptions0属性可以以快速

16、査査看所有有的假设设条件,其中commutative为True表示此此符号满满足交换换律,其其余的假假设条件件根据英英文名很很容易知知道它们们的含义义。在SymPy中中,所有有的对象象都从Basic类继继承,实实际上这这些is_*属属性和assumptions0属属性都是是在Basic类中定定义的:x.assumptions0Symbol.mro()数学表达达式数值为了实现现符号运运算,在在SymPy内内部有一一整套数数值运算算系统。因此SymPy的数数值和Python的的整数数、浮点点数是完完全不同同的对象象。为了了使用方方便,SymPy会尽尽量自动将Python的的数值类类型转换换为Sym

17、Py的数值值类型。此外,SymPy提提供了一一个S对对象用于于进行这这种转换换。在下下面的例例子中,当有SymPy的数数值参与与计算时时,结果果将是SymPy的数数值对象象。24数学表达达式“5/6”在SymPy中使使用Rational对象表表示,它它由两个个整数的的商表示示,数学学上称之之为有理理数。也也可以直直接通过过Rational创创建:251/2 +1/3 #结果为浮浮点数0.8333333333333333S(1)/2 +1/S(3) #结果为SymPy的数值对对象5/6Rational(5,10) #有理数会会自动进进行约分分处理1/2数学表达达式26运算符和和函数SymPy重新

18、定义义了所有有的数学学运算符符和数学学函数。例如Add类表示加加法,Mul类表示乘乘法,而而Pow类表示指指数运算算,sin类表示正正弦函数数。和Symbol对象一样样,这些些运算符符和函数数都从Basic类继承,可在IPython中查看它它们的继继承列表表(例如:Add.mro()。可以使使用这些些类创建建复杂的的表达式式:var(x,y,z,n)Add(x,y,z)x +y+ zAdd(Mul(x,y,z),Pow(x,y), sin(z)x*y*z+ x*y+sin(z)数学表达达式由于在Basic类中重新新定义了了_add_()等用于创创建表达达式的方方法,因因此可以以使用和和Pyth

19、on表达式相相同的方方式创建建SymPy的表达式式:在Basic类中定义义了两个个很重要要的属性性:func和args。func属性得到到对象的的类,而而args得到其参参数。使使用这两两个属性性可以观观察SymPy所创建的的表达式式。SymPy没有减法法运算类类,下面面看看减减法运算算所得到到的表达达式:27x*y*z+ sin(z)+ x*yx*y*z+ x*y+sin(z)数学表达达式通过上面面的例子子可以看看出,表表达式“x-y”在SymPy中实际上上是用“Add(x,Mul(-1,y)”表示的。同样,SymPy中没有除除法类,可使用用和上面面相同的的方法观观察“x/y”在SymPy中

20、是如何何表示的的。28t= x-yt.func #减法运算算用加法法类Add表示sympy.core.add.Addt.args #两个加数数一个是是x,一个是-y(x,-y)t.args1.func#-y是用Mul表示的sympy.core.mul.Mult.args1.args(-1, y)数学表达达式SymPy的表达式式实际上上是一个个由Basic类的各种种对象进进行多层层嵌套所所得到的的树状结结构。下下面的函函数使用用递归显显示这种种树状结结构:由于fsolve函数在调调用函数数f时,传递递的参数数为数组组,因此此如果直直接使用用数组中中的元素素计算的的话,计计算速度度将会有有所降低低

21、,因此此这里先先用float函数将数数组中的的元素转转换为Python中的标准准浮点数数,然后后调用标标准math库中的函函数进行行运算。29defprint_expression(e,level=0):spaces= *levelifisinstance(e, (Symbol, Number):printspaces+str(e)returniflen(e.args) 0:printspaces+e.func._name_forarg in e.args:print_expression(arg,level+1)else:printspaces+e.func._name_数学表达达式例如在在

22、SymPy中使用下下面的树树表示:由于其中中的各个个对象的的args属性类型型是元组组,因此此表达式式一旦创创建就不不能再改改变。使使用不可可变的结结构表示示表达式式有很多多优点,例如可可以用表表达式作作为字典典的键。30print_expression(sqrt(x*2+y*2)PowAddPowx2Powy21/2数学表达达式除了使用用SymPy中预先定定义好的的具有特特殊运算算含义的的数学函函数之外外,还可可以使用用Function()创建自定定义的数数学函数数:请注意Function虽然是一一个类,但是上上面的语语句所得得到的f并不是Function类的实例例。和预预定义的的数学函函数

23、一样样,f是一个类类,它从从Function类继承:31f =Function(f)f._base_sympy.core.function.AppliedUndefisinstance(f, Function)False数学表达达式当我使用用f创建一个个表达式式时,就就相当于于创建它它的一个个实例:f的实例t可以参与与表达式式运算:32t= f(x,y)isinstance(t, Function)Truetype(t)f t.func #(其中func和args是Basic类的两个个非常重重要的属属性,分分别表示示对象的的类和对对象的参参数)f t.args(x,y)t+t*tf(x, y)

24、*2 +f(x,y)符号运算算表达式变变换和化简simplify()可以对对数学表表达式进进行化简简,例如如:simplify()调用SymPy内部部的多种种表达式式变换函函数对表表达式进进行化简简运算。但是数数学表达达式的化化简是一件非常常复杂的的工作,并且对对于同一一个表达达式,根根据其使使用目的的可以有有多种化化简方案案。33simplify(x+2)*2-(x+1)*2)2*x+3符号运算算34radsimp()对对表达式式的分母母进行有有理化,它所得得到的表达式的的分母部部分将不不含无理理数。例例如:它也可以以对带符符号的表表达式进进行处理理:radsimp(1/(sqrt(5)+2

25、*sqrt(2)(-sqrt(5)+2*sqrt(2)/3radsimp(1/(y*sqrt(x)+x*sqrt(y)(-sqrt(x)*y+ x*sqrt(y)/(x*y*(x- y)符号运算算ratsimp()对对表达式式中的分分母进行行通分运运算,即即将表达达式转换换为分子除分母母的形式式:fraction()返回一一个包含含表达式式的分子子和分母母的元组组,用它可可以获得得ratsimp()通通分之后后的分子或分母母:注意fraction()不不会自动动对表达达式进行行通分运运算,因因此:35ratsimp(x/(x+y)+y/(x-y)2*y*2/(x*2-y*2)+ 1fracti

26、on(ratsimp(1/x+1/y)(x+ y, x*y)fraction(1/x+1/y)(1/y +1/x,1)符号运算算cancel()对分式表表达式的的分子分分母进行行约分运运算,可可以对纯纯符号的的分式表表达式以以及自定定义函数数表达式式进行约约分,但但是不能能对内部部函数的的表达式式进行约约分。36cancel(x*2-1)/(1+x)x-1cancel(sin(x*2-1)/(1+x) #cancel不能对函函数内部部的表达达式进行行约分sin(x*2/(x+ 1) -1/(x+ 1)cancel(f(x)*2-1)/(f(x)+1)#能对自定定义函数数表达式式进行约约分f(x

27、) -1符号运算算trigsimp()对表达达式中的的三角函函数进行行化简。它有两两个可选选参数-deep和和recursive,默认值都为False。当deep参数为为True时,将对表表达式中中的所有有子表达达式进行行简化运运算;当当recursive 参数数为True时时,将递递归使用用trigsimp()进行行最大限限度的化化简:37trigsimp(sin(x)*2+2*sin(x)*cos(x)+cos(x)*2)sin(2*x)+ 1trigsimp(f(sin(x)*2+2*sin(x)*cos(x)+cos(x)*2)#也能对自自定义函函数中的的三角函函数化简简,至今今不知道

28、道deep和recursive是干嘛的的f(sin(2*x) +1)符号运算算38expand_trig()可以对对三角函函数的表表达式进进行展开开。它实实际上是是对expand()的封装装,通过过将expand()的trig参数设设置为True,实现现三角函函数的展展开计算。输输入“expand_trig?”来来査看它它调用expand()时的的参数。expand()通用的展展开运算算,根据据用户设设置的标标志参数数对表达达式进行行展幵。默认情情况下,以下的的标志参参数为True。mul:展开乘法法expand_trig(sin(2*x+y)(2*cos(x)*2-1)*sin(y)+2*s

29、in(x)*cos(x)*cos(y)符号运算算log:展开对对数函数数参数中中的乘积积和幂运运算multinomial:展展开加法法式的整整数次幂幂power_base:展开开幂函数数的底数数乘积39x,y=symbols(x,y,positive=True)expand(log(x*y*2)log(x)+2*log(y)expand(x+y)*3)x*3 +3*x*2*y+3*x*y*2+ y*3expand(x*(y+z)x*y*x*z符号运算算可以将默默认为True的标志志参数设设置为False,强强制不展展开对应的的表达式式。在下下面的例例子中, 将mul设设置为False,因因此不

30、对对乘法进进行展开开:expand()的以以下标志志参数默默认为Fplex:展开复数数的实部部和虚部部,默认认不展开开复数的的实部和和虚部:40 x,y,z=symbols(x,y,z,positive=True)expand(x*log(y*z), mul=False)x*(log(y)+log(z)x,y=symbols(x,y,complex=True)expand(x*y,complex=True)re(x)*re(y)+ I*re(x)*im(y)+I*re(y)*im(x) -im(x)*im(y)符号运算算func:对一一些特殊殊函数进进行展开trig:展开开三角

31、函函数expand_log()、expandmul()、expand_complex()、expand_trig()、expand_func()等函数数则通过过将相应应的标志志参数设设置为True,对expand()进行行封装。41expand (gamma(1+x),func=True)x*gamma(x)expand(sin(x+y),trig=True)sin(x)*cos(y) +sin(y)*cos(x)符号运算算42factor()可以以对多项项式表达达式进行行因式分分解:collect()收收集表达达式中指指定符号号的有理理指数次次幂的系系数。例例如,希希望获得得如下表表达式中中

32、x的各各次幂的的系数:factor(15*x*2+2*y-3*x-10*x*y)(3*x -2*y)*(5*x -1)factor(expand(x+y)*20)(x+ y)*20a,b=symbols(a,b)eq=(1+a*x)*3 +(1+b*x)*2符号运算算首先需要要对表达达式eq进行展展开,得得到的表表达式eq2是是一系列列乘式的的和:然后调用用collect(),对表表达式eq2中中X的幂幂的系数数进行收收集:43eq2=expand(eq)eq2a*3*x*3+3*a*2*x*2+ 3*a*x +b*2*x*2 +2*b*x+2collect(eq2,x)a*3*x*3+x*2

33、*(3*a*2+b*2)+ x*(3*a+ 2*b)+2符号运算算默认情况况下,collect()返返回的是是一个整整理之后后的表达达式,如如果我们们希望得得到x的的各次幂幂的系数数,可以以设置evaluate参数数为False,让它它返回一一个以X的幂为为键、值值为系数数的字典典:44p= collect(eq2,x,evaluate=False)pS(1)#常数项,注意需需要用SymPy中的数值值1,或者使用用px*02px*2# x的2次项系数数b*2 +3*a*2符号运算算45collect()也也可以收收集表达达式的各各次幂的的系数,例如下下面的程程序收集集表达式式“sin(2*x)

34、”的的系数:collect(a*sin(2*x) +b*sin(2*x),sin(2*x)(a+ b)*sin(2*x)符号运算算46方程在SymPy中中,表达达式可以以直接表表示值为为0的方方程。也也可以使使用Eq()创建方程程。solve()可以对对方程进进行符号号求解,它的第第一个参参数是表表示方程程的表达达式,其其后的参参数是表表示方程程中未知知变量的的符号。下面的的例子使使用solve()对对一元二二次方程程进行求求解:a,b,c=symbols(a,b,c)solve(a*x*2+b*x+c,x)(-b +sqrt(-4*a*c+b*2)/(2*a), -(b+ sqrt(-4*a

35、*c +b*2)/(2*a)符号运算算使用Eq创建一个个方程对对象并求求解:47my_eq=Eq(a*x*2+b*x+c,0)solve(my_eq,x)(-b +sqrt(-4*a*c+b*2)/(2*a), -(b+ sqrt(-4*a*c +b*2)/(2*a)符号运算算由于方程程的解可可能有多多组,因因此solve()返返回一个个列表保保存所有有的解。可以传传递包含含多个表表达式的的元组或或列表,让solve()对对方程组组进行求求解,得得到的解解是两层层嵌套的的列表,其中每每个元组组表示方方程组的的一组解解:48#对方程组组求解(用元组组将几个个方程组组成一个个组)solve(x*2

36、+x*y+1,y * 2+x*y+2),x,y)(-sqrt(3)*I/3,-2*sqrt(3)*I/3),(sqrt(3)*I/3, 2*sqrt(3)*I/3)#有两组解解符号运算算微分Derivative是表示示导函数数的类,它的第第一个参参数是需需要进行行求导的的数学函函数,第第二个参参数是是求导的的自变量量.注意意Derivative所得得到的是是一个导导函数,它并不不会进行行求导运运算:如果希望望它进行行实际的的运算,计算出出导函数数,可以以调用其其doit()方方法:49t= Derivative(sin(x),x)#创建了一一个导函函数对象象tDerivative(sin(x)

37、,x)t.doit()cos(x)符号运算算50也可以直直接使用用diff()函数或或表达式式的diff()方法法来计算算导函数数:使用Derivative对对象可以以表示自自定义的的数学函函数的导导函数,例如:diff(sin(2*x),x)2*cos(2*x)sin(2*x).diff(x)2*cos(2*x)diff(sin(2*x),x,2)-4*sin(2*x)diff(sin(2*x),x,3)-8*cos(2*x)Derivative(f(x),x)Derivative(f(x), x)符号运算算由于SymPy不知道道如何对对自定义义的数学学函数进进行求导导,因此此它的diff(

38、)方方法会返返回和上上面相同同的结果果:添加更多多的符号号参数可可以表示示高阶导导函数,例如:51f(x).diff(x) #方法中的的x表示对x符号进行行求导Derivative(f(x), x)Derivative(f(x),x,3)#表示f(x)对x求三阶导导数(或或者偏导导)Derivative(f(x),x,x,x) #也可以写写作符号运算算也可以表表示多个个变量的的导函数数,例如如:diff()求解的格格式和Derivative声明的格格式类似似,例如如下面的的语句计计算sin(xy)对x两两次求导导、对y三次求求导的结结果:52Derivative(f(x,y), x,2,y,3

39、)#对x求二阶导导且对y求三阶导导数(5阶数)Derivative(f(x,y), x, x, y, y, y)diff(sin(x*y),x,2,y,3)x*(x*2*y*2*cos(x*y)+6*x*y*sin(x*y)- 6*cos(x*y)符号运算算微分方程程dsolve()可以以对微分分方程进进行符号号求解。它的第第一个参参数是一一个带未未知函数数的表达达式,第第 二个个参数是是需要进进行求解解的未知知函数。例如下下面的程程序对微微分方程程进进行行求解。 得到到的结果果是一个个自然指指数函数数,它有有一个待待定系数数c1。53f=Function(f)dsolve(Derivativ

40、e(f(x),x)- f(x), f(x)f(x) = C1*exp(x)符号运算算用dsolve()解解微分方方程时可可以传递递一个hint参数,指定微微分方程程的解法法。该参参数的默认值为为“default”,表表示由SymPy自动动挑选解解法。可可以将hint参数设设置为“best”,让dsolve()尝试试所有己己知解法法,并返返回最简简单的解解,例如如下面对对微分方方程:进行求解解。得到到的结果果是一个个一般方方程,它它描述了了f(x)和自自变量之间的的关系。一般把把这种函函数称为为隐函数数:54符号运算算55如果设置置hint参数数为“best”,就就能得到到更简单单的显函函数表达

41、达式:x= symbols(x,real=True) #定义符号号x为实数eq1=dsolve(f(x).diff(x) +f(x)*2+ f(x), f(x)eq1f(x) = -C1/(C1-exp(x)eq2 =dsolve(f(x).diff(x)+ f(x)*2+f(x),f(x),hint=best)eq2f(x) = -C1/(C1-exp(x)符号运算算积分integrate()可以以计算定定积分和和不定积积分:integrate(f,x):计计算不定定积分integrate(f,(x,a,b):计计算定积积分如果要对对多个变变量计算算多重积积分,只只需要将将被积分分的变量量依

42、次列列出即可可:Integrate(f,x,y):计算算双重不不定积分分Integrate(f,(x,a,b),(y,c,d):计算算双重定定积分56符号运算算和Derivative对象象表示微微分表达达式类似似,Integral对象象表示积积分表达达式,它它的参数数和integrate() 类似似,例如如:调用积分分对象的的doit()方法可可以对其其进行求求值计算算:57e= Integral(x*sin(x),x)eIntegral(x*sin(x),x)e.doit()-x*cos(x)+sin(x)符号运算算有些积分分表达式式无法进进行符号号化简,这时可可以调用用其evalf()方方

43、法或用用求值函函数N()对其其进行行数值运运算:由于无法法进行符符号定积积分,可用evalf()和N()对其其 进行行数值运运算:58e2=Integral(sin(x)/x,(x, 0, 1)e2.doit()Si(1)#Sie2.evalf()0.946083070367183N(e2)0.946083070367183N(e2,100)#可以指定定精度0.946083070367183014941353313823符号运算算SymPy的数数值计算算功能还还不够强强大,不不能对应应如下这这种情况况的无限限积分:将积分上上限修改改为10000也没能能计算出出近似结结果,上上限为1000时得到

44、到了/2的近近似值, 不过过还远远远不够精精确:59N(Integral(sin(x)/x,(x,0,oo)# oo表示正无无穷-0.e+0N(Integral(sin(x)/x,(x, 0, 10000)0.e+0N(Integral(sin(x)/x,(x,0,1000)1.57023312196877符号运算算as_sum()方法法可以将将定积分分转换为为近似求求和公式式,它将将积分区区域分割割成N个个小矩形形的面积积之和:60e=Integral(sin(x)/x,(x,0,1)e.as_sum(5)2*sin(9/10)/9 +2*sin(7/10)/7+ 2*sin(1/2)/5+

45、 2*sin(3/10)/3+2*sin(1/10)N(e.as_sum(5)0.946585362780408其他功能能用SymPy做计算器器SymPy有三种内内建的数数值类型型:浮点点数、有有理数和和整数。有理数类类用一对对整数表表示一个个有理数数:分子子和分母母,所以以Rational(1,2)代表1/2, Rational(5,2)代表5/2等等。有些特殊殊的常数数,像e和pi,它们被被视为符符号(1+pi将不被数数值求解解,它将将保持为为1+pi),并且可可以有任任意精度度:61pi*2pi*2其他功能能evalf将表达式式求解为为浮点数数。这还有一一个类表表示数学学上的无无限,叫叫

46、作oo:62pi.evalf()3.14159265358979(pi+exp(1).evalf(50)5.8598744820488384738229308546321653819544164930751oo99999Trueoo+10000oo其他功能能极限极限在sympy中使用很很简单,它们的的语法是是limit(function,variable, point),所以计算算当x趋近于0时f(x)的极限,可以给给出limit(f,x,0):也可以计计算在无无穷的极极限:63fromsympyimport*x=Symbol(x)limit(sin(x)/x, x, 0) 1limit(si

47、n(x)/x,x,oo) 0其他功能能级数展开开使用.series(var,point, order):64(1/cos(x).series(x,0,10)1 +x*2/2 +5*x*4/24 +61*x*6/720+277*x*8/8064 +O(x*10)e= 1/(x+y)s= e.series(x, 0, 5)print(s)1/y-x/y*2+x*2/y*3-x*3/y*4+x*4/y*5+O(x*5)pprint(s)2341xxxx5 -+- +Oxy2345yyyy其他功能能求和计算给定定求和变变量界限限的f的总和(Summation)summation(f,(i, a, b)变量i从a到b计算f的和.如果不能能计算总总和,它它将打印印相应的的求和公公式。求求值可引引入额外外的极限限计算:65from sympy importsummation, oo,symbols,logi,n,m= symbols(inm,integer=True)summation(2*i- 1, (i,1,n)n*2summation(1/2*i,(i,0,oo)2其他功能能66summation(1/log(n)*n,(n,2,oo)Sum(log(n)*(-n),(n,2,oo)summation(i,(i, 0, n)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论