很多做模型的同学其实不太清楚数值模型如何实现的,导致一些不理解或者不懂,其实不算一个合格的数模技术人员;so,打算借助 python,一步步的构建一些简单的水质模拟,给大家一个较好的认识,图是自己解决一些问题所构建的小工具集(语言:python)
the first day:
(1)前期准备工作,安装python软件,大家可以去网上随便搜下,我现在用的是anconda,大家可以直接去下载它然后安装。(python的一些具体教程需要大家自行学习下,很简单,其实跟MATLAB蛮像,脚本性语言,通俗易懂)
(2)方程基础
我们以简单的一维水质方程为基础,具体方程参照此教材,个人比较喜欢的一本书:
:河段中某种污染物的浓度,mg/l
t :时间,d
x :河水流动距离,km
u :河水平均流速。m/s
e :河流纵向离散系数
:河流水体污染物的源漏项;
(1网格点的划分)
(2差分方程的推导)
(4)编程
安装一个Python的编译环境,我是用的anaconda
首先做一些配置:
import numpy
from matplotlib import pyplot ;
numpy的功能是允许我们像matlab那样操作矩阵,matplotlib是用来画图的。然后是“几何建模”,这里的几何模型很简单,就是一个线段:0
描述这么一个场景 10mg/l的污染物,在边界处恒定释放,河流流速为5m/s。衰减系数k及离散系数e分别给定位0.1,1.我们模拟5000个时间步长的污染沿河分布情况,T=5000*dt=50s,dt时间间隔可以自由设定,但也不是随意的。大家可以试试,结果会不会收敛,因为数值模型还有个柯朗数的限制,即
dt*u/dx
以下是程序:
nx = 50
# 给定网格数量nx及网格间距dx
dx = 49 / (nx-1)
nt = 500
dt = 0.01
a = 1
#离散系数取值
E=1
#衰减系数及流速取值
k=0.1
u=5
#计算α、β、γ
接下来是初始条件及开始值的一些考虑,如c[-1]=c[0](假定)
#给的初始值,这里为1的线性矩阵
c = numpy.ones(nx)
#因为差分方程有c[-1]。初期拟定为c[-1]=c[0]
c[0]=10
c[-1]=c[0]
cn = numpy.ones(nx)
for n in range(nt):
cn = c.copy()
for i in range(1, nx):
c[i] = α*cn[i-2] +β*cn[i-1]+γ*cn[i]
pyplot.plot(numpy.linspace(0, 201, nx), c)
运行的结果大概长这个样子:
可以清晰的看到,随着距离慢慢增加,浓度逐渐接近初始值1,。。可以做个试验,我们调整nt(即污染持续时间,100 200 300 400 500 1000。看到如下效果,即时间越久,沿河浓度逐渐增高。
这次先说到这儿吧。
领取专属 10元无门槛券
私享最新 技术干货