Python科学计算:Sympy2

昨天早上主要学习了Sympy的一些基础语法,感觉这个包其自身有很强的特点,希望它能够在后面的计算中发挥更好的作用。

首先呢,我们先对一些基础的微积分运算函数进行学习:

import sympy as sy
#微分:
sy.diff(D,x)
D.diff(x)
#第二种微分方法依赖于D是一个符号,也就是一个类,并且这个类里面包含导数函数
D.diff(x,y,y)
D.diff(y,2,x)
f(x,y).diff(y,2,x)
#如果我们有时候不想显式的计算倒数,那么就可以由:
sy.Derivative()
#如果说后面要求值的话,用类方法doit就可以执行延迟计算:
D_xyy=sy.Derivative(D,x,y,2)
print(D_xyy.doit)
Python科学计算:Sympy2_第1张图片

图1:D对x求偏导

Python科学计算:Sympy2_第2张图片

图2:D对x,y求偏导

#积分运算
sp.integrate(D,y)
D.integrate(y)
D.integrate(x,y)
#不希望显式的计算积分的话
yD=sp.Integral(D,y)
#输出也是.doit
#定积分也很简单,只要你简单的使用元组(变量,上限,下线)来替换积分参数的变量:
sp.integrate(D,(y,0,sp.pi))
D.integrate((y,0,sp.pi))
#同样的,多重积分就加两个元组:
sp.integrate(sp.exp(-x**2-y**2),(x,0,sy.oo),(y,0,sp.oo))
#当然,这里也有惰性版本:
dint=(sp.exp(-x**2-y**2),(x,0,sy.oo),(y,0,sp.oo)),
Python科学计算:Sympy2_第3张图片

图3:命运

Python科学计算:Sympy2_第4张图片

图4:运行结果

然后是级数:

#首先定义:
foo=sp.exp(sp.sin(x))
#可以考虑先把foo展开成x的泰勒级数,这是一致收敛的,因为,任意y的指数函数e的y次方,逐项积分呢能够给出一个有用的近似
#eg:
f_oo=sp.exp(sp/sin(x))
#假设我们在这里,Symu允许我们计算比如Taylor展开式的指数函数e的,

Sympy是允许我们计算如Taylor公式展开式的前十项之何:

f_oo=sp.exp(sp.sin(x))
foo__ser=foo.series(x,0,10)
#我妈可以通过类属性来拿删除他,eg:
f00_ser.removeO()
#极限处理也很直观
sp.limit((foo-1-x)/x**@,x,0)
#在不连续点上,上面的或者下面的极限是有可能不相同的,约定俗成的是取上面极限的数值
goo=1/(x-1)
print(sp.limit(goo,x,1,dir='+/-'))#+就是右极限,-就是左极限

比如说,我们要得到的是左极限:

print(sp.limit(goo,x,1,dir='-'))
Python科学计算:Sympy2_第5张图片

图5:左极限

很简单,也很方便的。

那么,微积分和极限咱们都搞完了,有个问题,对于一个很长的等式,我们能化简他吗,或者说是,有两个等式,我们怎样去确定,这俩等式是否相等?

#sympy提供了这几个函数:
ex1.expand()
ex1,factor()
sy.expand_trig()
#我们可以输出sy.expand_Tab来看看
#一个非常有用的函数:sy.cancel,这个函数可以接受任何有利表达式作为参数,并且将其转化成规范形式:

但是,我在敲的时候,报错了,错误的原因很简单,没有expand_Tab这个函数。。。。。。。可能是废弃了吧

A=M*M.inv()
print(A)
A[1,0]=A[1,0].cancel()
A[1,1]=A[1,1].cancel()
print(A)
Python科学计算:Sympy2_第6张图片

图6:输出

为什么cancel这个函数不是默认执行的嘞?

我们试一下书上的一个示例:

c=(x**256-1)/(x-1)
print(x)
print("after cancel:")
print(c.cancel())
Python科学计算:Sympy2_第7张图片

图7:示例输出结果展示

娘嘞呀,咋成这嘞!!!

好家伙,怪不得。

方程求解:

我们能不能用你解方程嘞?Sympy说:“中”。

在Sympy中创建方程的方法有两种:

lhs=D
rhs=cosdiff
#first solution
eqn1=sy.Eq(lhs,rhs)
#second solution:
eqn2=lhs-rhs
Python科学计算:Sympy2_第8张图片

图8:eqn1和eqn2 输出

从输出结果来看,基本上两者没区别,就是因为我们用Eq函数创建的eqn1,所以这里他会用Eq来表示这括号里的两个式子共同组成了一个方程。

通常,用的求解方程的包的导入是这样的:

from sympy.solvers import solveset
#下面这个是解决线性方程组的
from sympy.solvers.solveset import linsolve

首先,我们来解决单变量方程:

第一种方法:简单粗暴的用solveset来解决:

print(solveset(4*x-3,x))
print(solveset(3*x**3-16*x**2+23*x-6,x))
Python科学计算:Sympy2_第9张图片

图9:输出单变量方程的解

solveset他回返回一组解,同时也会忽略重复解,但是sy.roots()就可以包含重复的解:

quad=x**2-2*x+1
print(solveset(quad,x))
print("roots:",sp.roots(quad))
Python科学计算:Sympy2_第10张图片

图10:输出解的对比

默认情况下,简单的超越方程是在复平面上求解的,如果说,solveset没法求解一个方程,那他就会返回一个数学术语:

print(solveset(sp.cos(x)-x,x))

:这句话输出的是:”ConditionSet(x, Eq(-x + cos(x), 0), Complexes)

当我们有多个自变量的时候,我们实际上要解决的是一个线性方程组:

这个就难解了,对于矩阵A来说,我们手工计算的话,要去计算他的秩,满秩,不满秩,具体情况就得具体分析了,那么这个情况之下,Sympy怎么结局呢?来看看书上的讲解,当然我们在solveset那里就已经导入专门解决线性方程组的linsolve模块,后面就不用再次导入这个模块了。

  1. 非奇异情况下:

Eqs=[x+2*y,3*x+4*y-2]
print(linsolve(Eqs,[x,y]))
Python科学计算:Sympy2_第11张图片

图11:非奇异矩阵求解

多数情况下,我们可以指定矩阵A和等式右边界向量B,这样的话,会更加方便:

A=sp.Matrix([[1,2],[3,4]])
B=sp.Matrix([[1],[2]])
print(linsolve((A,B),[x,y]))
Python科学计算:Sympy2_第12张图片

图12:线性方程求解

这个时候,并不是说,x=0,y=1/2,实际上输出的 意思是,y可以去任何值,而x=1-2y。

如果方程是某些其他函数的输出,那么通常以奇异矩阵的形式提供:

A_B=sp.Matrix([[1,2,1],[2,4,1]])
print(linsolve(A_B,[x,y]))

这里的输出是EmptySet,也就是空集。

solve模块是求解线性方程组或者非线性方程组的通用工具,一般的方程组他都能够解决,但是,有时候会有根丢失的情况,这样的情况其实我们可以再solve里面加一个check=False,通过这样的方式来修正错误行为就好。

来到了今天的最后,常微分方程的求解,这个我看了一下,厚民有一章都在讲这个常微分方程如何去用Python求解,而且,会用到一个功能更强大的包Scipy,明天考试,,明天就不写了,后天闲下来之后,把Sympy包的绘图学完,然后就开始学习用Scipy来求解常微分方程,好了,今天的内容就到这里了,回顾一下今天的内容:学习了微积分和符号的相关操作,了解了怎样使用Sympy求解一些数学问题,最重要的是我们学习到了如何用Sympy的solves来求解方程,这个是非常重要的,之后,我们又对线性方程组的求解展开了学习,但只能说是皮毛,因为很多问题我们还没有真正的进行实际编程学习,只是照着书上的代码学习了一下。这是远远不够的,还是要多看文档(昨天的博客里面我附加了Sympy的官方文档的地址)。

ok,今天就到这里吧!!!

你可能感兴趣的:(Python科学计算,python,开发语言,Sympy)