写在前面:转眼之间大学的第2.5年就要结束了,而从2011年搭建博客到现在,也已近7年时光。当下,明确了未来的专业方向,也为了握住青春的尾巴,决定在所学专业领域和计算机技术(爱好)有所对接,毕竟学术上我的老师还是很棒的!(张胤教授、柳召刚教授、方中纯博士和徐洋博士),而本专业相关则长期局限于工科,为了对接到信息化也只是时间问题,作为专业的“独苗”,也有责任进行一些相应的探(zhe)索(teng)。就像自己所期待的那类技术圈的人一样,我希望最后我可以拿着具体到点的问题去问老师,而不是一副“我想做什么但是我不会也不愿意学,你会你就必须给我代工完成xxx”这样的loser的样子。


尊重他人就是尊重你自己!你怎么对待别人,别人就会怎么对你!

以记录工业仿真和计算化学的单元操作coding为主,防止出现版权问题和“基础不牢地动山摇”的情况。

数学参考:

重要配置——关闭win10自动更新

首先要写的是与机器学习无关的内容,因为我所使用的设备是Windows 10系统的辣鸡电脑,而这坑爹系统总容易因为蜜汁更新导致文件缺失,所以,为了解决这个问题就一定要在进行任何软件/环境配置之前关闭自动更新!
操作方法为:计算机(此电脑)-右键-管理-服务和应用程序-服务-Windows update-右键-属性-禁用-关闭

Windows10搭建python数据分析/机器学习环境

这里同理于Linux上搭建机器学习环境,下载安装Anaconda,为了方便和现有开源包的匹配,我选择python2.7版本,对应Anaconda是2.X版本。之后像常规安装软件一样安装就行了。

在安装过程中,可能会遇到

1
failed to create anacoda menue?

解决方案有:

  • 安装目录中不得出现中文或其他奇怪的符号
  • CMD中进入安装目录,然后执行 python .\Libs_nsis.py mkmenus
  • 将JAVA的环境变量JAVA_HOME和PATH先删掉,就可以顺利安装了。

安装好之后,其中Navigator是图形界面,可以切换python版本,同时能够在右侧搜索未安装的包,然而出于众所周知的原因,Anaconda官方的源下载速度基本上你懂的,所以这个时候建议切换国内的源。
添加Anaconda的TUNA镜像

1
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

设置搜索时显示通道地址

1
conda config --set show_channel_urls yes

对于anaconda,建议直接使用其自带的IDE——Spyder,打开后,默认就加载了ipython和python两个解释器。对于conda命令无法使用的情况,在环境变量中添加将anaconda安装目录下的Scripts。对于CMD下不能使用anaconda同理,添加安装目录到环境变量即可。

关于机器学习环境,直接借助开源包即可,这里直接pass掉某显卡包,毕竟我的电脑还要自己用!!直接使用Scikit-Learn,Numpy ,Scipy ,Matplotlib。关于这个网上有很多安装教程,我直接用conda和pip安装,之后遇到需要再拓展的包,随用随装。

1
2
3
4
5
6
7
conda install scipy
conda install theano
conda install keras
pip install tensorflow
pip install sklearn
pip install numpy
pip install matplotlib

emmmm实际上上面有点多此一举了,貌似Anaconda已经集成了这些。总之环境搭建的重心还是放在Anaconda的安装上,其他不懂的就问Google吧。

Runge-Kutta 的python实现

龙格库塔法是工程上常用的微分方程的数值计算方法,因为在冶金、化工过程当中,很多简单模型(如极其简单的那种有边界条件的一维稳态计算)都可以化简为简单的4阶龙哥库塔法模型,所以使用计算机语言掌握这种方法也是很有必要的!!

而在计算机程序运作当中,节约时间成本是非!常!必!要!的!所以这种情况下一般使用构造-调用函数的方法来完成计算。下面具体分析:
首先,根据常微分方程,将其构造为一个自定义函数,如果你是一个常微分方程的计算,就构造一个;如果是常微分方程组就构造多个。python当中使用def语法来构造,比如我将方程f=y-(2*x/y)构造为fxy,代码如下:

1
2
3
def fxy(x,y):  
f = y - (2 * x / y)
return f

接下来就是构造一个迭代器,用于解常微分方程(组)。龙格库塔法的数学表达并不难,这里必须强调的几个点是:

  • x0,y0均为初值条件
  • h为步长,即微积分当中所谓的极小长度dx或dy
  • N为迭代数,迭代次数为N-n,一般来说迭代次数越多,输出值约精确。这是一种迭代逼近。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
def rk4(x0,y0,h,N):  
n = 1
while(n != N):
x1 = x0 + h
k1 = fxy(x0, y0)
k2 = fxy(x0+h/2, y0+h*k1/2)
k3 = fxy(x0+h/2, y0+h*k2/2)
k4 = fxy(x1, y0+h*k3)
y1 = y0 + h * (k1 + 2* k2 + 2 * k3 + k4) / 6
print("%.2f, %.6f" %(x1, y1))
n = n + 1
x0 = x1
y0 = y1

接下来就是主要计算的部分了,为了方便设定,初值条件、步长、迭代数实现自设定,直接人工输入,之后调用上面写好的函数即可,这里你也可以把主要计算构造成一个函数,然后执行即可。代码如下:

1
2
3
4
5
6
7
def main():  
x0=float(input("x0= "))
y0=float(input("y0= "))
h=float(input("h= "))
N=float(input("N= "))
rk4(x0,y0,h,N)
main()

接下来可以举个例子来计算常微分方程组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def fxyzw(x, y, z, w):
f = z * 0.1
return f
def gxyzw(x, y, z, w):
g = w * 0.1
return g
def pxyzw(x, y, z, w):
p = (x **2 + y ** 2 + z ** 2 + w ** 2) ** (1 / 2) * 0.1
return p
def rg4(x0,y0,z0,w0,h,N):
n = 1
while(n != N):
x1 = x0 + h
k1 = fxyzw(x0, y0, z0, w0)
l1 = gxyzw(x0, y0, z0, w0)
m1 = pxyzw(x0, y0, z0, w0)
k2 = fxyzw(x0+h/2, y0+h*k1/2, z0+h*l1/2, w0+h*m1/2)
l2 = gxyzw(x0+h/2, y0+h*k1/2, z0+h*l1/2, w0+h*m1/2)
m2 = pxyzw(x0+h/2, y0+h*k1/2, z0+h*l1/2, w0+h*m1/2)
k3 = fxyzw(x0+h/2, y0+h*k2/2, z0+h*l2/2, w0+h*m2/2)
l3 = gxyzw(x0+h/2, y0+h*k2/2, z0+h*l2/2, w0+h*m2/2)
m3 = pxyzw(x0+h/2, y0+h*k2/2, z0+h*l2/2, w0+h*m2/2)
k4 = fxyzw(x1, y0+h*k3, z0+h*l3, w0+h*m3)
l4 = gxyzw(x1, y0+h*k3, z0+h*l3, w0+h*m3)
m4 = pxyzw(x1, y0+h*k3, z0+h*l3, w0+h*m3)
y1 = y0 + h * (k1 + 2* k2 + 2 * k3 + k4) / 6
z1 = z0 + h * (l1 + 2* l2 + 2 * l3 + l4) / 6
w1 = w0 + h * (m1 + 2* m2 + 2 * m3 + m4) / 6
print("%.2f, %.6f, %.6f, %.6f" %(x1, y1, z1, w1))
n = n + 1
x0 = x1
y0 = y1
z0 = z1
w0 = w1
def main():
x0=float(input("x0= "))
y0=float(input("y0= "))
z0=float(input("z0= "))
w0=float(input("w0= "))
h=float(input("h= "))
N=float(input("N= "))
rg4(x0,y0,z0,w0,h,N)
main()

这里注意2点:

  • Python中有单目运算符+(正号)、-(负号)。双目运算符:+、 - 、 、 /、 %、*、//,分别表示加、减、乘、除法、取余、求幂、整除。所以要用对符号!!
  • 类似一个多元常微分方程组,记得把程序里的变量数和元数匹配!!