主要就是这四个模块,如果要安装的话,前三个可以直接使用 sudo pip install xxx
来安装。对于mayavi,安装起来比较复杂,主要是vtk的安装,我安装了几次都没有成功,不管是使用ccmake还是使用independent installer都没法用,在尝试了一个下午之后,发现了python科学计算的神器 Canopy 。
Canopy是Python科学计算的集成环境,里面集成了你所知道,你所需要的所有python科学计算需要的module,这是他的主页截图。
我在Package Manager中直接搜索下载了mayavi,一键完成安装,特别方便,推荐所有用Python科学计算,或者是为了毕业论文等同学使用Canopy,我要是早发现就好了! 常量主要是在numpy包里, np.e
, np.pi
之类的,当然先要导入这个包。
import numpy as np
简单的运算也通过numpy完成,比如 np.cos
, np.sin
, np.tan
之类的,可以尝试,基本的运算都在里面。
对于积分运算,需要使用scipy中的integrate模块,关于scipy的参考文档,可以参考 这里 。下面是一个简单的求黑体的辐射的积分,还自带误差,对数值计算有要求的同学有福了。
#encoding:utf-8 from scipy import integrate import numpy as np #函数定义 def blackBodyM(x,c1,c2,T): return (c1/(x**5))*(1/((np.e**(c2/(x*T)))-1)) c1 = 3.7415*10**8 c2 = 1.43879*10**4 T = 800 #结果,误差 resut,err = integrate.quad(blackBodyM,3,5,args=(c1,c2,T))
重头戏来了,python的绘图功能,完全不亚于matlab,matlab能做的,python里面都能实现,对于2D绘图,不管是函数图像还是数值统计图,都可以使用 matplotlib
库来完成。当然,也可以用 matplotlib
来完成3D绘图,不过个人对比体验了下,3D绘图,尤其是建模,还是使用 mayavi
更方便快速。
从 matplotlib参考文档 和 mayavi参考文档 对比也可以发现,mayavi主要针对3D建模,matplotlib主要是2D绘图。
下面我对matplotlib的主要绘图模块pyplot分析。
我们画一个这样的图像。#序之前的代码 def functionI(fi,ks,n,a,e0): return e0*ks*((-350*np.sin(fi)+(700*np.sqrt(3)/2)*np.cos(fi))**n)*a*a*np.cos(fi) from matplotlib import pyplot as plt plt.figure(1) #图1:n不变,ks变化 #fi的取值范围 0-pi/2,分100个点 fi = np.linspace(0,np.pi/2,100) ax1 = plt.subplot(211) plt.sca(ax1) #ks = 0.1-0.9 n=5 for ks in range(1,10): ks = ks*0.1 plt.plot(fi,functionI(fi,ks,3,1,e0),label='ks='+str(ks)) plt.legend(loc='upper right',bbox_to_anchor = (1, 1.15)) plt.xlabel(u'角度fi') plt.ylabel(u'n=5,ks变化 辐射强度I') ax2 = plt.subplot(212) #ks = 0.5,n=2-10 for n in range(2,11): plt.plot(fi,functionI(fi,0.5,n,1,e0),label='n='+str(n)) plt.legend(loc='upper right',bbox_to_anchor = (1, 1.15)) plt.xlabel(u'角度fi') plt.ylabel(u'ks=0.5,n变化 辐射强度I') plt.show()
几个地方说明一下:
np.linspace
:构造线性list,用来取点,其实画函数图像的本质就是画很多点,然后连接起来。 plt.figure
:运行以后,一个figure对应一个 plt.show()
,其实就是对应一个窗口。 plt.subplot
:一个figure里有多少个图像(坐标轴),每次运行这个返回一个ax坐标轴对象,每次走完这行代码,就选中这个ax,接下来的操作都是在这个ax上完成的。 plt.legend
:图例显示。 这里介绍一下使用mayavi进行模拟光照实验(Phong模型),首先使用如下代码构造一个表面。
import numpy as np from mayavi import mlab x, y = np.mgrid[-3:3:150j,-3:3:150j] z =x**2+y**2+2 surf = mlab.surf(x, y, z, colormap='RdYlBu', warp_scale='auto') surf.actor.property.interpolation = 'phong' #对应参数表面反射率和n高光系数 surf.actor.property.specular = 0.5 #ks surf.actor.property.specular_power = 2 #n mlab.show()
运行以后得到一个这样的模型表面,为了展示整个表面,这里使用4处光照。 点击左上角很酷的那个按钮,可以打开表面参数设置和光照设置。 可以看到这里使用4个白光光源照射。并且可以很方便的进行参数设置。 当然这里我也用matplotlib画了同样的图形,但跑起来的时候机器很卡,使用 matplotlib
处理便面和光照,还需要使用其他的库来辅助,这里只贴出import的部分代码。
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import LightSource
总之处理和模型有关的3D,还是使用 mayavi
,简单粗暴。 如果需要更深入的学习,还是需要看计算机图形学和相关库的参考文档。