#作者:王日睿
#中国科学技术大学生命科学学院
#2021.11.12
#物理化学实验:实验03 燃烧热的测定
# Jupyter lab
import numpy as np
import matplotlib.pyplot as plt
import os
def readfile(filename):
x, y = [], []
file = open(filename, 'r')
count = 0
for line in file.readlines():
count = count + 1
if count >= 4:
x.append(int(line[0:6]))
y.append(float(line[7:len(line)]))
return x, y
FILENAME = ["苯甲酸燃烧热.txt", "萘燃烧热.txt"]
time1, T1 = readfile(FILENAME[0])
time2, T2 = readfile(FILENAME[1])
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.figure(1)
plt.plot(time1[:350], T1[:350], "g-", label="苯甲酸燃烧")
plt.xlabel("t/s", fontsize=18)
plt.ylabel("T/摄氏度", rotation=0)
plt.tight_layout()
plt.show()
plt.figure(2)
plt.plot(time2, T2, "r-", label="苯甲酸燃烧")
plt.xlabel("t/s", fontsize=18)
plt.ylabel("T/摄氏度", rotation=0)
plt.tight_layout()
plt.show()
# 不够直观
"""
# 温度变化速率图
def t_rate_curve(t_list, time_list, label=None, axis=(350, 1000, -0.02, 0.05)):
rate_list = [0]
length = len(time_list)
for i in range(length-1):
rate = (t_list[i+1] - t_list[i])/(time_list[i+1] - time_list[i])
rate_list.append(rate)
plt.plot(time_list, rate_list, "g-", label=label)
plt.axhline(0)
plt.xlabel("time/s")
plt.ylabel("rate", rotation=0)
plt.axis(axis)
plt.show()
t_rate_curve(T2, time2, label="苯甲酸")
"""
# 舍去不需要的数据
T1 = T1[:350]
time1 = time1[:350]
# T2,time2不变
# 进行数据分析:
from scipy import optimize
def linear_fit(x, y):
def func(x, k, b):
return k * x + b
k, b = optimize.curve_fit(func, x, y)[0]
return k, b
# 1. 前期直线的拟合
# 直线范围:[0:330/3]
time1_fit_1 = time1[0:110]
T1_fit_1 = T1[0:110]
k1_fit_1, b1_fit_1 = linear_fit(time1_fit_1, T1_fit_1)
time2_fit_1 = time2[0:110]
T2_fit_1 = T2[0:110]
k2_fit_1, b2_fit_1 = linear_fit(time2_fit_1, T2_fit_1)
# 2. 后期直线的拟合
# 直线范围:[700//3:len(list)]=[233:350]
time1_fit_2 = time1[233:350]
T1_fit_2 = T1[233:350]
k1_fit_2, b1_fit_2 = linear_fit(time1_fit_2, T1_fit_2)
time2_fit_2 = time2[233:350]
T2_fit_2 = T2[233:350]
k2_fit_2, b2_fit_2 = linear_fit(time2_fit_2, T2_fit_2)
# 3. 关键点的坐标获取:
def find_the_data(list_, key): # 找到离散的列表与目标值最近的点并返回index
examine = [abs(x-key) for x in list_]
min_value = min(examine)
return examine.index(min_value)
# 3.1 苯甲酸:
# 3.1.1 找B点
env_T1 = (15.167+15.436)/2 # 环境温度 =15.3015
index = find_the_data(T1, env_T1)
B1_x, B1_y = time1[index], T1[index] #B:(447,15.283)
# 3.1.2 找A点
A1_x = B1_x
A1_y = (k1_fit_1 * A1_x + b1_fit_1).round(3) # 14.404
# 3.1.3 找C点
C1_x = B1_x
C1_y = (k1_fit_2 * C1_x + b1_fit_2).round(3) # 15.627
# 3.2 萘
env_T2 = (15.436+15.625)/2 # 环境温度 =15.5305
index = find_the_data(T2, env_T2)
B2_x, B2_y = time2[index], T2[index] #B:(435, 15.523)
A2_x = B2_x
A2_y = (k2_fit_1 * A2_x + b2_fit_1).round(3) # 14.622
C2_x = B2_x
C2_y = (k2_fit_2 * C2_x + b2_fit_2).round(3) # 16.018
# 作图
X1 = np.arange(0, 600, 1)
X2 = np.arange(400, 1000, 1)
Y11 = k1_fit_1 * X1 + b1_fit_1
Y12 = k1_fit_2 * X2 + b1_fit_2
Y21 = k2_fit_1 * X1 + b2_fit_1
Y22 = k2_fit_2 * X2 + b2_fit_2
plt.figure(1)
plt.figure(figsize=(13,7), dpi=400)
plt.title("苯甲酸燃烧的温度-时间曲线",fontsize=20)
plt.xlabel("时间/s",fontsize=13)
plt.ylabel("温度/摄氏度",fontsize=13)
plt.plot(time1, T1, "b-")
plt.plot(X1, Y11, "g--")
plt.plot(X2, Y12, "g--")
plt.axhline(B1_y, linestyle='--')
plt.axvline(B1_x, linestyle='--')
plt.scatter([A1_x, B1_x, C1_x], [A1_y, B1_y, C1_y], color="r")
plt.annotate("C(%d,%4.3f)"%(C1_x, C1_y), xy=(C1_x, C1_y),xytext=(330,15.66),fontsize=13)
plt.annotate("B(%d,%4.3f)"%(B1_x, B1_y), xy=(B1_x, B1_y),xytext=(450,15.23),fontsize=13)
plt.annotate("A(%d,%4.3f)"%(A1_x, A1_y), xy=(A1_x, A1_y),xytext=(450,14.43),fontsize=13)
plt.annotate("环境T=15.283℃", xy=(0,15.283), xytext=(100,15.3),fontsize=13)
plt.annotate(r"$\Delta T=(15.627-14.404)℃=1.223℃$", xy=(A1_x,A1_y),
xytext=(-30, 15), arrowprops=dict(arrowstyle="->"),fontsize=16)
plt.annotate(r"$\Delta T=(15.627-14.404)℃=1.223℃$", xy=(C1_x,C1_y),
xytext=(-30, 15), arrowprops=dict(arrowstyle="->"),fontsize=16)
plt.tight_layout()
plt.savefig("output_1.jpg")
plt.show()
plt.figure(2)
plt.figure(figsize=(13,7), dpi=400)
plt.title("萘燃烧的温度-时间曲线",fontsize=20)
plt.xlabel("时间/s",fontsize=13)
plt.ylabel("温度/摄氏度",fontsize=13)
plt.plot(time2, T2, "b-")
plt.plot(X1, Y21, "g--")
plt.plot(X2, Y22, "g--")
plt.axhline(B2_y, linestyle='--')
plt.axvline(B2_x, linestyle='--')
plt.scatter([A2_x, B2_x, C2_x], [A2_y, B2_y, C2_y], color="r")
plt.annotate("C(%d,%4.3f)"%(C2_x, C2_y), xy=(C2_x, C2_y),xytext=(330,16.05),fontsize=13)
plt.annotate("B(%d,%4.3f)"%(B2_x, B2_y), xy=(B2_x, B2_y),xytext=(450,15.55),fontsize=13)
plt.annotate("A(%d,%4.3f)"%(A2_x, A2_y), xy=(A2_x, A2_y),xytext=(450,14.67),fontsize=13)
plt.annotate("环境T=15.523℃", xy=(0,15.523), xytext=(100,15.54),fontsize=13)
plt.annotate(r"$\Delta T=(16.018-14.622)℃=1.396℃$", xy=(A2_x,A2_y),
xytext=(-30, 15.2), arrowprops=dict(arrowstyle="->"),fontsize=16)
plt.annotate(r"$\Delta T=(16.018-14.622)℃=1.396℃$", xy=(C2_x,C2_y),
xytext=(-30, 15.2), arrowprops=dict(arrowstyle="->"),fontsize=16)
plt.tight_layout()
plt.savefig("output_2.jpg")
plt.show()
2021物理化学实验3:燃烧热的测定
最新推荐文章于 2024-05-21 22:44:12 发布