dingsir的个人博客分享 http://blog.sciencenet.cn/u/dingsir

博文

TMSP蒸气压温度曲线之拟合

已有 634 次阅读 2020-7-24 17:27 |个人分类:锂电电解液|系统分类:科研笔记| 添加剂, 蒸气压, 拟合过程, 初始值, 边界

为了填写化学品的《安全周知卡》蒸气压的数据, 同事反映找不到这个物质在25℃下的蒸气压值. 我在CA数据库中查了一下 三(三甲基硅基)磷酸酯(TMSP). 果然没有常温下的蒸气压数据. 它是有很多不同压力下的沸点数据,经过粗处理后如下:

沸点/℃压强/mmHg
490.2
581.5
67.50.5
774
864
864
925
95.57
976
1006
10510.5
11012
1104
228720
231.8749.5

我们知道,一种液体在某一压强P下的沸点t, 换种表达方式就是, 它在这个温度t下,它的饱和蒸气压就是这个压强P. 比如说,水在760mmHg下的饱和蒸气压, 就是1个大气压. 再加热升高温度,蒸气压超过1个大气压,蒸气压大于外界气压, 水就沸腾了,沸腾吸热快,水温就下来了.从而达到一个平衡. 如果在高原地区,外界气压小了, 温度不用到100℃水的蒸气压就能大于外界气压,达到沸腾状态,这也就是低压下沸点变低的现象。不单是水, 其它液体也遵守这个规律.


理解了上面的原理,我们可以说,以上不同压强下的沸点,实际上也是不同温度下该物质的蒸气压。根据这些蒸气压,我们就可以进行数据的回归分析了。依据还是使用安托宁方程:  


在回归之前,需要对数据进行一些预先处理.  先对温度列进行排序,从低到高. 再转化成绝对温度T (=273.15+ ℃ ) 和lgP(P的单位统一用KPa, 1 Torr=1mmHg=0.1333KPa):

沸点/℃压强/mmHg绝对温度 TlgP
490.2322.15-1.57413985
581.5331.15-0.69907859
67.50.5340.65-1.17619985
774350.15-0.27310986
864359.15-0.27310986
864359.15-0.27310986
925365.15-0.17619985
95.57368.65-0.03007181
976370.15-0.0970186
1006373.15-0.0970186
10510.5378.150.146019448
11012383.150.204011395
1104383.15-0.27310986
228720501.151.982162646
231.8749.5504.951.999601787

在Excel中对lgP和K值作散点图, 初步看看数据的分布情况。 这一步很重要,由于数据的来源质量不一样, 需要进行初步的数据筛选,以去除明显不合理的数据, 否则可能出现拟合无优化解的情况。特别是数据量很少的情况下,对异常值尤为敏感。 这组数据还不错, 回归出来效果不错.

将数据另存为data.txt来方便Python程序导入.处理的代码如下, 较之前的版本,此处加入了拟合时A,B,C参数的初始值设置(initialABC数组), 和A,B,C取值的范围(ABC_bounds数组).

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import sys
import pylab as plb
# 拟合的函数设置为Antonnie方程 lgP=A-B/(C+T)
def func(T, A, B, C):
    return A - B / (C + T)

# 定义x、y散点坐标,T为绝对温度, lgP中P的单位为KPa再取对数.
data=plb.loadtxt("data.txt") #2列多行的数据, 第1列为T, 第2列为lgP.存为txt格式.
T = data[:,0]
lgP = data[:,1]
if len(T) != len(lgP):  # 检查x,y值是否尺寸一致。
    print("X轴与Y轴数据个数不一致"); sys.exit()
initialABC=[1,1,1] #设定A,B,C拟合时的初始值
ABC_bounds=([-np.inf, -np.inf, -250],[np.inf,np.inf,np.inf])#设定A,B,C的聚值范围,两个数据分别为A,B,C的下边界数组, 上边界数组.
popt, pcov = curve_fit(func, T, lgP, p0=initialABC, bounds=ABC_bounds)  #拟合过程在此函数中执行
A,B,C = popt
print('系数A, 参数B, 参数C');print('{0}\n{1}\n{2}'.format(A,B,C));
print('系数pcov:', pcov);
# 原始数据绘图
plot1 = plt.plot(T, lgP, 's', label='original data')
#拟合数据绘图
yvals = func(T, A, B, C)  # 拟合y值
print('根据拟合公式计算的结果:', yvals)
plot2 = plt.plot(T, yvals, 'r', label='fitting value')
plt.xlabel('T');plt.ylabel('lgP');plt.legend(loc=4);plt.title('lgP = {0} - {1}/({2}+T)'.format(A,B,C))
plt.show()

(吐槽一下,科学网对代码的高亮和着色的效果也太差了.)

产生的结果如下:Figure_1.png

系数A, 参数B, 参数C
7.162279914086799
2416.3636628886093
-37.53694425240029


根据上述的结果, 可以得到TMSP的蒸气压回归方程为

(再吐槽一下,上面这个公式编辑器竟然不能复制数字进去)


将温度298K代入上述方程(2)中, lgP=-2.109564, P即为7.7Pa. 即TMSP在25℃的蒸气压.

不过,有意思的是,我从Reaxys数据库也查到一组TMSP的沸点数据,它的拟合结果却不太合理, 有兴趣的朋友可以一起研究下.image-20200724170218186.png

系数A: 0.26641985125269513
系数B: 14.815356637371815
系数C: -320.15321203726046  (这个拟合值有问题,导致温度低于320K时计算的蒸气压反而上升)

由于科学网博客的显示效果不太好,我在末尾附上本文的PDF文件供您查看.


TMSP蒸气压温度曲线之拟合(CA数据版).pdf




http://blog.sciencenet.cn/blog-1213210-1243425.html

上一篇:学习笔记: Python解析XML
下一篇:命令直通车的巧妙利用 | 过度拟合与如何避免

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2020-10-1 21:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部