Python科学计算:Sympy3

昨天考试,就没有带电脑,所以就没有去写,惊天就来看一看Sympy绘图:

matplotlib这个库,你要往里面传入的是列表,或是Numpy数组等,但是Sympy他生成的表达式实际上是没有办法传入到matplotlib里的,但是,之前我们的学习中,sympy这个库有个函数lambdify,它可以将表达式转换为数组,这样的话我们就可以绘图了:

图1

图一是我之前第一篇关于sympy的博客中截的图,大家可以看到,利用sympy.lambdify函数,就可以计算出一个根据cosdiff计算而得到的数组,这样的数组明显就是我们所想要的,就可以传入pyplot模块里面进行绘制了,但是,Sympy就自己没想到什么解决办法吗?答案是有的Sympy.plot,别看都是plot,但是事实上他和matplotlib模板中的plot的语法格式压根就不一样,所以,今天我们来看看Sympy绘图

首先,先把sympy和绘图模块导入:

import sympy as sy
import sympy.plotting as syp

先看一个书上的简单例子:

import sympy as sy
import sympy.plotting as syp
x,y=sy.symbols("x y")
syp.plot(sy.sin(x),x,x-x**3/6,x-x**3/6+x**5/120,(x,-4,4),
         title='sin(x) and its first Taylor approximate')

图2:sin(x)的泰勒展开的前三项

我觉得这个图做的还可以吧,但是书上说很不理想,咱也不知道人家要的理想到底是个什么状态

对于隐式定义的二维曲线,Matplotlib模块不需要任何修改就可以处理,Sympy则是提供了一个特殊函数syp.plot_paramrtric()函数来处理:

举一个简单的例子:

xc=sy.cos(u)+sy.cos(7*u)/2+sy.cos(17*u)/3
yc=sy.sin(u)+sy.sin(7*u)/2+sy.sin(17*u)/3
fig2=syp.plot_parametric(xc,yc,(u,0,2*sy.pi))

图三,绘制结果

看上去还不错,我试试看能不能调颜色:不知道怎么调。。。

sympy绘图包含了matplotib中没有的功能,就是绘制平面中隐式定义的一条或者多条曲线的能力,跟着书上的来几个练一练,就知道怎么回事情了:

  1. 椭圆:

这里用的函数中,输入的值是我们要绘制的方程(没等号啊),然后是自变量的取值范围:

syp.plot_implicit(x**2+x*y+y**2-1,(x,-1.5,1.5),(y,-1.5,1.5))

我找到调节颜色的方法嘞:line_color=“color”

这里我设置成了红色:

图4:椭圆

既然有了椭圆,我想画个规则一点的椭圆:

syp.plot_implicit(x**2/16+y**2/4-1,(x,-5,5),(y,-5,5),line_color="red")

图5:椭圆

就是,现在还不知道线条的粗细怎么去调节。。。

h,z=sy.symbols("h,z",real=True)
z=x+sy.I*y
w=sy.cos(z**2).expand(complex=True)
wa=sy.Abs(w).expand(complex=True)
syp.plot_implicit(wa**2-1,line_color='r')

图6

我去,竟然还能画交集:

x**2+y**2<4和xy>1的交集:

syp.plot_implicit(sy.And(x**2+y**2<4,x*y>1),(x,0,2),(y,0,2),line_color='red')

图7:交集

那那再试一个交集:

syp.plot_implicit(sy.And(y>1/x,y<x),(x,-10,10),(y,-10,10),line_color='red')

图8交集

也可可以画等高线:

syp.plot_contour((x**2+y**2,(x,-3,3),(y,-3,3)),(x*y,(x,-10,10),(y,-10,10)),surface_color='red')
syp.plot_contour(sy.cos(2*u)*(3+sy.sin(u)+sy.cos(v)),(u,-10,10),(v,-10,10),surface_color="red")

上面的两个各是一张图,,但是,我看源码的时候surface_color是有这个声明的,但是我没有找到该怎么搞这个,所以,就放下了:

图9

图10

注意,图10是后面三维图片的中一个函数的二维展示。

还可以绘制三维的:

绘制一个圆锥曲线看看;

syp.plot3d_parametric_line(u*sy.cos(4*u),u*sy.sin(4*u),u,(u,0,10))

图11

在不同的矩形网格上绘制之叠加图:

syp.plot3d((x**2+y**2,(x,-3,3),(y,-3,3)),(x*y,(x,-5,5),(y,-5,5)))

图12:叠加图片

3维度的是可以自由旋转的,这里就展示一个我觉得看起来比较直观的面就行了

最后,来一个参数化曲面:

syp.plot3d_parametric_surface(sy.cos(2*u)*(3+sy.sin(u)+sy.cos(v)),sy.sin(2*u)*(3+sy.sin(u)+sy.cos(v)),2*sy.cos(u)+sy.sin(v),(u,-10,10),(v,-10,10))

图13

但是,如果你直接用syp.plot3d去画这个函数,得到的是这个样子的:

图14

别说,要是他能像matploylib那像调节colormap,我觉得他的绘图效果也会非常不错的。

好了,Sympy的学习就到这里了,还是多看文档吧,毕竟,你自己敲代码的时候,就会发现,自动补全的提示,比你知道的要多得多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值