一个暂存文件
1. 问题一
- 可视化数据
# 加载模块
import numpy as np
import matplotlib.pyplot as plt
# 加载数据
# data1 : 浓度检测数据
fp = open("data1.txt", "r")
data1 = []
for i in fp.read().strip().split("\n"):
row = [float(k) for k in i.strip().split(" ")]
data1.append(row)
fp.close()
data1 = np.array(data1)
# 可视化
plt.rcParams['figure.figsize'] = (6, 6)
plt.rcParams['savefig.dpi'] = 300
# x轴
week = np.arange(1, 16)
# y轴
y1 = data1[:, 0] # 检测点1
y2 = data1[:, 1] # 监测点2
y3 = data1[:, 2] # 检测点3
y4 = data1[:, 3] # 监测点4
y5 = data1[:, 4] # 监测点5
plt.scatter(week, y1, color="r", marker="+")
plt.scatter(week, y2, color="g", marker="x")
plt.scatter(week, y3, color="b", marker="o")
plt.scatter(week, y4, color="c", marker="*")
plt.scatter(week, y5, color="m", marker=".")
plt.plot(week, y1, color="r", linewidth=0.5)
plt.plot(week, y2, color="g", linewidth=0.5)
plt.plot(week, y3, color="b", linewidth=0.5)
plt.plot(week, y4, color="c", linewidth=0.5)
plt.plot(week, y5, color="m", linewidth=0.5)
plt.xlabel("t (week)")
plt.ylabel("c (mg/L)")
plt.legend(["Monitoring p1", "Monitoring p2", "Monitoring p3", "Monitoring p4", "Monitoring p5"])
- 计算偏差、均值
# 复用上面数据加载 data1, week
mean = []
std = []
for _w in week:
mean.append(np.mean(data1[_w-1, :]))
std.append(np.std(data1[_w-1, :], ddof=1))
针对每周的监测点数据分析,各监测点数据标准差均在 0.05 以内,其中最大偏差出现在第10周。
偏差在允许范围内,数据中无明显坏点,均为有效数据。
考虑使用周各监测点数据的均值代表该周湖水污染颗粒的浓度情况。则周内变化如下
-
构建模型
假设条件:
1)考虑到湖体积足够大,因流入流出速度差异导致的体积变化忽略不计;
2)污染物流入湖中,其扩散时间考虑为 0,即立马均匀扩散至全湖
3)不考虑渗透、蒸发、降雨等其它因素的影响
考虑 d t dt dt 时间内输入、输出污染物量分别为:
M i n = c 0 ⋅ v i n ⋅ d t M o u t = c ⋅ v o u t ⋅ d t M_{in} = c_0 \cdot v_{in} \cdot dt \\ M_{out} = c \cdot v_{out} \cdot dt Min=c0⋅vin⋅dtMout=c⋅vout⋅dt
构建微分方程
d c = M i n − M o u t V = ( c 0 ⋅ v i n V − c ⋅ v o u t V ) d t dc = \frac{M_{in}-M_{out}}{V}=(\frac{c_0\cdot v_{in}}{V}-\frac{c\cdot v_{out}}{V})dt dc=VMin−Mout=(Vc0⋅vin−Vc⋅vout)dt名词说明:c — 质量浓度,t — 时间, v i n v_{in} vin— 输入流速, v o u t v_{out} vout— 输出流速,V — 湖水体积
求解微分方程,得到湖水污染物浓度随时间变化的数学模型:
c ( t ) = ( c 0 ⋅ v i n V − v o u t V ) − k ⋅ e − v o u t c 0 ⋅ v i n t c(t) = (\frac{c_0\cdot v_{in}}{V}-\frac{v_{out}}{V})-k\cdot e^{-\frac{v_{out}}{c_0\cdot v_{in}}t} c(t)=(Vc0⋅vin−Vvout)−k⋅e−c0⋅vinvoutt -
数据拟合(参数最优化求解)
浓度模型简化为:
c t = λ 1 − λ 2 ⋅ e λ 3 t c_{t} = \lambda_1-\lambda_2\cdot e^{\lambda_3 t} ct=λ1−λ2⋅eλ3t
其中, λ 1 , λ 2 , λ 3 \lambda_1, \lambda_2, \lambda_3 λ1,λ2,λ3 为待定参数。基于每周的观测点均值数据,使用 matlab 拟合工具,可以求解最佳参数,其中
λ 1 = λ 2 = λ 3 = \lambda_1 = \\ \lambda_2 = \\ \lambda_3 = λ1=λ2=λ3=
可以得到最终模型:
c ( t ) = c(t) = c(t)= -
结果验证
模型曲线与实际监测数据符合情况如下:
[此处插入曲线图表]
[此处插入符合的指标数据]
-
模型预测
[预测 t=20, t=30 情况]