1. 引言
上期做无机实验的数据分析可视化的时候预告过这一期,但前段时间肝各路论文,也没抽出太多时间来写,今天补上。
沉降物化实验是通过测定一个多级分散体系沉降曲线,得到分散体系粒度分布的实验,其中会要求使用Origin进行数据处理,因为这个实验涉及到几个比较麻烦的地方
- 根据实验所给出的沉降曲线数据(m-t图),绘制沉降曲线并根据已知超越方程对曲线进行拟合
- 通过拟合所得的方程,求导函数,求取给定粒径的粒子沉降完全所对应的时间点并通过做切线的方法得到此时给定粒径区间的粒子的沉降量
- 做条形图来表示各个区间的粒子的沉降量
用python进行曲线拟合是我此前一直没解决的问题,此前我比较喜欢打开matlab的curvefit工具箱进行拟合,不得不说尝试性的曲线拟合确实是用那个方法比较好,但通过在CSDN学习,我发现scipy.optimize模块下有个curve_fit对象,可以用来进行曲线拟合,配合spyder可以达到与matlab的curvefit工具包无异的效果
2. 具体数据处理方法
2.1 实验数据导入
首先导入实验数据,目前还没有做成项目的样子,所以导入方法很直接。csv文件是根据实验导出的数据文件经过一次简单加工而成,是进行了零点较正的数据。
# 引入所需库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import statsmodels.api as sm
from statistic_model import linear # 引入线性拟合
from scipy.optimize import curve_fit
# 数据导入
data = pd.read_csv('10183791.csv')
y = np.array(data['m'])
x = np.array(data['t'])
# 实验参数
eta = 0.0009111 # 黏度,Pa·S
rho = 2700 # 滑石粉密度,kg/m3
rho_0 = 997.2995 # 介质密度,kg/m3
h = 0.13 # 沉降高度,m
g = 9.81
至于为什么要引入线性拟合模块?还请客官往下看
2.2 沉降曲线的拟合
2.2.1 沉降曲线的表达形式
根据实验讲义,沉降曲线的拟合方程为:
此处一个大问题是的值是不知道的,也即这个曲线的上界目前并不确定,需要求取。由于这个沉降曲线类似于酶促反应曲线和Langmuir吸附等温线,在时间足够长时基本平缓,很接近上界,从而当即时有。于是,采用方法如下
- 取最后八组数据,求1/t。将m对1/t线性拟合,得到一条拟合直线,这条拟合直线的R^2应当是0.95以上的
- 线性拟合外推到1/t=0,对应的m即为曲线上界。根据此思路,用我们驾轻就熟的线性拟合方法进行操作:
# 线性拟合求mc
x_c = x[-8:] # t
y_c = y[-8:] # m
x_cc = 1000/x_c
P_linear, R2 = linear(x_cc, y_c)
xx_c = np.linspace(np.min(x_cc), np.max(x_cc), 50)
yy_c = np.polyval(P_linear, xx_c)
mc = P_linear[1] #最大沉降质量,g
print(f'mc:{mc}')
# 线性拟合图作图
# 作图
plt.figure(1)
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['font.size'] = 16
# 调整matpl