2021物理化学实验3:燃烧热的测定

#作者:王日睿 
#中国科学技术大学生命科学学院
#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()

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想摸鱼的生信小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值