如何绘制交叉拟合线以确定超导体的临界温度Tc
超导样品临界温度Tc的交叉拟合线绘制方案
我正在测定超导样品的临界温度,现有电阻率随温度变化的测量数据,需要绘制两条交叉拟合线来确定Tc:
- 一条拟合Tc上方的正常态电阻率段(电阻率随温度呈稳定变化的区域)
- 另一条拟合电阻率降至零的转变温度区间
两条线的交叉点即为临界温度Tc,参考示例为:两条直线分别贴合正常态高阻区与转变区数据,交叉点对应Tc值。
现有代码
import matplotlib.pyplot as plt import pandas as pd import numpy as np # 读取数据,跳过前31行 file = pd.read_excel('s400.xlsx', skiprows=31) # 提取温度(x轴)和电阻率(y轴)数据 x = np.array(file['Temperature (K)']) y = np.array(file['Bridge 3 Resistivity (Ohm-m)']) # 绘制原始散点图 plt.figure(figsize=(20,10)) plt.scatter(x, y, marker=".") plt.title("Resistivity vs Temperature") # 需要添加两条交叉拟合线以确定Tc plt.show()
实现步骤与完整代码
1. 筛选拟合数据段
根据电阻率曲线特征,手动选择两个拟合区间:
- 正常态区间:选择温度较高、电阻率无明显下降的稳定段(示例中假设温度大于80K)
- 转变区间:选择电阻率开始快速下降到接近零的区间(示例中假设温度在50-70K之间)
2. 线性拟合与交点计算
使用numpy.polyfit进行一阶线性拟合,联立两个拟合方程求解交叉点Tc:
import matplotlib.pyplot as plt import pandas as pd import numpy as np # 读取数据 file = pd.read_excel('s400.xlsx', skiprows=31) x = np.array(file['Temperature (K)']) y = np.array(file['Bridge 3 Resistivity (Ohm-m)']) # -------------------------- # 1. 筛选拟合区间(根据你的数据调整阈值) # -------------------------- # 正常态拟合区间:温度>80K(示例值,需根据实际曲线调整) mask_normal = x > 80 x_normal = x[mask_normal] y_normal = y[mask_normal] # 转变区拟合区间:温度在50-70K之间(示例值,需根据实际曲线调整) mask_transition = (x > 50) & (x < 70) x_trans = x[mask_transition] y_trans = y[mask_transition] # -------------------------- # 2. 线性拟合 # -------------------------- # 正常态拟合线:y = a1*x + b1 a1, b1 = np.polyfit(x_normal, y_normal, 1) # 生成拟合线的x/y数据(扩展范围以确保交叉点可见) x_fit_normal = np.linspace(min(x), max(x), 100) y_fit_normal = a1 * x_fit_normal + b1 # 转变区拟合线:y = a2*x + b2 a2, b2 = np.polyfit(x_trans, y_trans, 1) x_fit_trans = np.linspace(min(x), max(x), 100) y_fit_trans = a2 * x_fit_trans + b2 # -------------------------- # 3. 计算交叉点Tc # -------------------------- # 联立方程:a1*Tc + b1 = a2*Tc + b2 → Tc = (b2 - b1)/(a1 - a2) Tc = (b2 - b1)/(a1 - a2) # 交叉点的y值 Tc_y = a1 * Tc + b1 # -------------------------- # 4. 绘图 # -------------------------- plt.figure(figsize=(20,10)) plt.scatter(x, y, marker=".", label="Raw Data") # 绘制两条拟合线 plt.plot(x_fit_normal, y_fit_normal, 'r--', label=f'Normal State Fit: y={a1:.4f}x+{b1:.4f}') plt.plot(x_fit_trans, y_fit_trans, 'g--', label=f'Transition Fit: y={a2:.4f}x+{b2:.4f}') # 标记交叉点Tc plt.scatter(Tc, Tc_y, s=200, c='blue', marker='*', label=f'Critical Temperature Tc = {Tc:.2f} K') plt.title("Resistivity vs Temperature with Tc Fit") plt.xlabel("Temperature (K)") plt.ylabel("Resistivity (Ohm-m)") plt.legend() plt.grid(True) plt.show()
注意事项
- 需根据实际电阻率曲线调整
mask_normal和mask_transition中的温度阈值,确保拟合区间符合正常态和转变区的特征 - 如果转变区不是线性的,可尝试用更高阶多项式拟合,但超导临界温度通常采用线性交叉法定义
内容的提问来源于stack exchange,提问作者Benjamin Mark
相关产品推荐
相关产品推荐

