如何用Python利用滴定数据的最大导数求滴定终点pH值
解决滴定终点pH与对应体积的计算问题
你已经完成了导数计算和最大值查找,接下来只需将最大导数对应到原始数据,即可得到滴定终点的体积和pH值,同时可以通过绘图直观展示终点位置。
步骤1:关联最大导数与原始数据
你的导数列表d中每个元素对应原始数据里第i和i+1个点之间的斜率,所以找到最大导数的索引后,取这两个点的体积、pH平均值(比单一点更准确)就是滴定终点的参数。修改代码如下:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 读取数据 fil = pd.read_csv('https://raw.githubusercontent.com/andreasdh/programmering-i-kjemi/master/docs/datafiler/titreringsdata.txt', delimiter = ",") volum = fil['volum'] pH = fil['pH'] # 计算pH随体积的导数(斜率) d = [] for i in range(len(volum)-1): dery = pH[i+1] - pH[i] dert = volum[i+1] - volum[i] dydt = dery/dert d.append(dydt) # 自定义函数:同时返回最大值和对应的索引 def fmax(lst): max_val = lst[0] max_idx = 0 for idx, x in enumerate(lst): if x > max_val: max_val = x max_idx = idx return max_val, max_idx # 获取最大导数及其索引 max_deriv, max_idx = fmax(d) # 计算滴定终点的体积和pH(取两点平均值) end_point_vol = (volum[max_idx] + volum[max_idx+1])/2 end_point_pH = (pH[max_idx] + pH[max_idx+1])/2 print(f"最大导数: {max_deriv:.2f}") print(f"滴定终点体积: {end_point_vol:.2f} mL") print(f"滴定终点pH: {end_point_pH:.2f}")
步骤2:绘图标注滴定终点
在原有绘图代码基础上添加终点标注,同时可以绘制导数曲线更清晰展示最大值位置:
# 绘制滴定曲线并标注终点 plt.plot(volum, pH, color = "#B00B69", label = "滴定曲线") plt.scatter(volum, pH, color = "hotpink", label = "实验数据点") plt.scatter(end_point_vol, end_point_pH, color='red', s=100, marker='*', label='滴定终点') plt.xlabel("加入强碱体积 (mL)") plt.ylabel("pH值") plt.grid() plt.legend() plt.show() # 绘制导数曲线,直观展示最大值位置 deriv_volumes = [(volum[i] + volum[i+1])/2 for i in range(len(volum)-1)] plt.plot(deriv_volumes, d, color='green', label='d(pH)/d(V)') plt.scatter(end_point_vol, max_deriv, color='red', s=100, marker='*', label='最大导数点') plt.xlabel("加入强碱体积 (mL)") plt.ylabel("pH随体积的变化率") plt.grid() plt.legend() plt.show()
关键说明
- 取两点的体积和pH平均值,是因为导数对应两点间的斜率,终点实际处于这两个数据点之间,平均值更接近真实值。
- 绘制导数曲线可以直接看到滴定终点的位置——导数最大值对应的就是pH突变最剧烈的点,也就是滴定终点。
内容的提问来源于stack exchange,提问作者Melissa Rodrigues
相关产品推荐
相关产品推荐

