import math """ Hall Effect Experiment Data Processor 霍尔效应实验数据处理计算器 (直接输入 VH 版) 参考了表面张力系数计算器的高精度与不确定度修约逻辑。 ═══════════════════════════════════════════════════════ 公式说明: ═══════════════════════════════════════════════════════ 1. 霍尔电压 (Hall Voltage): 直接测量输入 VH。 VH > 0 → P 型 (空穴导电) VH < 0 → N 型 (电子导电) 2. 霍尔效应基本公式 (Hall Effect): VH = KH · Is · B 其中: KH = 1 / (n · e · d) — 霍尔灵敏度 [V/(A·T)] RH = 1 / (n · e) — 霍尔系数 [m³/C] Is : 工作电流 (霍尔电流) [A] B : 磁感应强度 [T] d : 霍尔元件厚度 [m] n : 载流子浓度 [m⁻³] e : 元电荷 = 1.602×10⁻¹⁹ [C] 3. 电导率 σ 计算 (Conductivity): σ = Is · L / (Vσ · b · d) 线性回归 Vσ vs Is,斜率 R_slope = Vσ/Is (即样品电阻 [Ω]),则: σ = L / (R_slope · b · d) [S/m] 其中: L : 电压电极间距 (霍尔片长度) [m] b : 霍尔片宽度 [m] d : 霍尔片厚度 [m] 4. 载流子浓度 n 与迁移率 μ (Carrier Concentration & Mobility): n = 1 / (KH · e · d) = 1 / (RH · e) [m⁻³] μ = σ / (n · e) = σ · RH = σ · KH · d [m²/(V·s)] 5. 螺线管中心磁场 (Solenoid Field): B = μ₀ · (N / L_sol) · Im 其中: μ₀ = 4π×10⁻⁷ T·m/A (真空磁导率) N : 螺线管总匝数 L_sol : 螺线管有效长度 [m] ═══════════════════════════════════════════════════════ 不确定度传递公式: ═══════════════════════════════════════════════════════ (a) 线性回归斜率不确定度: u(k) = |k| · √[(1/r² − 1) / (n − 2)] 其中 r 为相关系数, n 为数据点数 (b) 电导率 σ 的不确定度: σ = L / (R_slope · b · d) u_r(σ) = √[(u_R/R)² + (u_L/L)² + (u_b/b)² + (u_d/d)²] (c) 霍尔灵敏度 KH 的不确定度: KH = slope₁ / B u_r(KH) = √[(u_slope₁/slope₁)² + (u_B/B)²] (d) 载流子浓度 n 的不确定度: n = 1 / (KH · e · d) u_r(n) = √[u_r(KH)² + (u_d/d)²] (e) 载流子迁移率 μ 的不确定度: μ = σ · KH · d u_r(μ) = √[u_r(σ)² + u_r(KH)² + (u_d/d)²] (f) 修约规则: 不确定度保留一位有效数字 (四舍六入五凑偶) 结果末位与不确定度对齐 """ # ═══════════════════════════════════════════════════════ # 通用工具函数 # ═══════════════════════════════════════════════════════ from utils import ( scientific_round, linear_regression, input_float ) def print_regression(label, k, b, r, u_k, x_unit, y_unit): """格式化打印线性回归结果""" print(f"\n [{label}] 线性回归结果:") print(f" y = {k:.6f} · x + ({b:.6f})") print(f" 斜率 k = {k:.6f} {y_unit}/{x_unit}") print(f" 截距 b = {b:.6f} {y_unit}") print(f" 相关系数 r = {r:.6f}") print(f" 斜率不确定度 u(k) = {u_k:.4e}") # ═══════════════════════════════════════════════════════ # 主程序 # ═══════════════════════════════════════════════════════ def main(): print("════════════════════════════════════════════════════════════") print(" 霍尔效应实验数据处理计算器 (直接输入VH版)") print(" Hall Effect Experiment Data Processor") print("════════════════════════════════════════════════════════════") # ────────────────────────────────────────────────── # 物理常量 # ────────────────────────────────────────────────── e_charge = 1.602e-19 # C (元电荷) mu_0 = 4.0 * math.pi * 1e-7 # T·m/A (真空磁导率) print(f"\n 物理常量:") print(f" e = {e_charge} C") print(f" μ₀ = {mu_0:.4e} T·m/A") # ────────────────────────────────────────────────── # 霍尔元件参数 # ────────────────────────────────────────────────── print("\n" + "━" * 58) print(" 霍尔元件几何参数") print("━" * 58) d_mm = input_float(" 厚度 d (mm)", 0.095) b_mm = input_float(" 宽度 b (mm)", 0.235) L_mm = input_float(" 长度 L (mm)", 0.27) # 转换为国际单位 m d = d_mm * 1e-3 b = b_mm * 1e-3 L = L_mm * 1e-3 print(f"\n d = {d_mm} mm = {d:.4e} m") print(f" b = {b_mm} mm = {b:.4e} m") print(f" L = {L_mm} mm = {L:.4e} m") # ────────────────────────────────────────────────── # 螺线管参数 (计算磁场) # ────────────────────────────────────────────────── print("\n" + "━" * 58) print(" 螺线管参数 (B = k_sol · Im)") print("━" * 58) print(" 选择输入方式:") print(" 1 - 直接输入 B/Im 比值 k_sol (T/A)") print(" 2 - 输入匝数 N 和有效长度 L_sol") mode = input(" 请选择 (默认 1): ").strip() or "1" if mode == "2": N_turns = input_float(" 螺线管总匝数 N", 2000) L_sol_mm = input_float(" 螺线管有效长度 (mm)", 200) L_sol_m = L_sol_mm * 1e-3 k_sol = mu_0 * N_turns / L_sol_m print(f" k_sol = μ₀·N/L = {mu_0:.4e} × {N_turns:.0f} / {L_sol_m:.4f}") else: k_sol = input_float(" 磁场常数 k_sol = B/Im (T/A)", 0.00209) print(f" ★ 螺线管常数: k_sol = {k_sol:.6e} T/A") # ══════════════════════════════════════════════════ # 第一部分: VH 与 Is 的关系 # ══════════════════════════════════════════════════ print("\n") print("▓" * 58) print(" 第一部分: VH 与 Is 的关系") print(" 条件: 探头在螺线管中心, Im 恒定") print("▓" * 58) Im_fixed_mA = input_float(" 固定励磁电流 Im (mA)", 600) Im_fixed_A = Im_fixed_mA * 1e-3 B_fixed = k_sol * Im_fixed_A print(f" 对应磁场 B = k_sol × Im = {B_fixed:.6f} T") n_pts_1 = 10 Is_1 = [0.20 * (i + 1) for i in range(n_pts_1)] # mA: 0.20 ~ 2.00 print(f"\n 测量要求: 请依次输入各 Is 下对应的霍尔电压 VH (mV)") print(f" 请注意正负号以判断导电类型。\n") VH_signed_1 = [] VH_abs_1 = [] for Is_val in Is_1: vh = input_float(f" Is = {Is_val:.2f} mA → VH (mV)") VH_signed_1.append(vh) VH_abs_1.append(abs(vh)) # 打印数据表 print(f"\n{'─' * 46}") print(f" VH - Is 数据表 (Im = {Im_fixed_mA:.0f} mA, B = {B_fixed:.4f} T)") print(f"{'─' * 46}") print(f" {'Is(mA)':>7} │ {'VH带符号(mV)':>12} {'VH绝对值(mV)':>12}") print(f" {'─' * 42}") for i in range(n_pts_1): print(f" {Is_1[i]:>7.2f} │ {VH_signed_1[i]:>12.3f} {VH_abs_1[i]:>12.3f}") print(f"{'─' * 46}") # 线性回归: VH(mV) vs Is(mA) —— 使用绝对值 VH slope_1, intercept_1, r_1, u_slope_1 = map(float, linear_regression(Is_1, VH_abs_1)) print_regression("VH-Is", slope_1, intercept_1, r_1, u_slope_1, "mA", "mV") # 注: 斜率单位 mV/mA = V/A # 判断导电类型 (由带符号 VH 的正负判定) VH_sign_avg = sum(VH_signed_1) / len(VH_signed_1) if VH_sign_avg > 0: carrier_type = "P 型 (空穴导电)" sign_str = "VH > 0" else: carrier_type = "N 型 (电子导电)" sign_str = "VH < 0" print(f"\n ★ 导电类型判定: {sign_str} → {carrier_type}") input("\n 按回车继续...") # ══════════════════════════════════════════════════ # 第二部分: VH 与 Im 的关系 # ══════════════════════════════════════════════════ print("\n") print("▓" * 58) print(" 第二部分: VH 与 Im 的关系") print(" 条件: 探头在螺线管中心, Is 恒定") print("▓" * 58) Is_fixed_mA = input_float(" 固定工作电流 Is (mA)", 1.50) Is_fixed_A = Is_fixed_mA * 1e-3 Im_start = input_float(" Im 起始值 (mA)", 100) Im_step = input_float(" Im 步长 (mA)", 50) Im_end = input_float(" Im 终止值 (mA)", 600) Im_2 = [] val = Im_start while val <= Im_end + 0.01: Im_2.append(val) val += Im_step n_pts_2 = len(Im_2) print(f"\n 共 {n_pts_2} 个数据点: Im = {Im_start:.0f} ~ {Im_end:.0f} mA, 步长 {Im_step:.0f} mA") print(f" 测量要求: 请依次输入各 Im 下对应的霍尔电压 VH (mV)\n") VH_signed_2 = [] VH_abs_2 = [] for Im_val in Im_2: vh = input_float(f" Im = {Im_val:.0f} mA → VH (mV)") VH_signed_2.append(vh) VH_abs_2.append(abs(vh)) # 打印数据表 print(f"\n{'─' * 46}") print(f" VH - Im 数据表 (Is = {Is_fixed_mA:.2f} mA)") print(f"{'─' * 46}") print(f" {'Im(mA)':>7} │ {'VH带符号(mV)':>12} {'VH绝对值(mV)':>12}") print(f" {'─' * 42}") for i in range(n_pts_2): print(f" {Im_2[i]:>7.0f} │ {VH_signed_2[i]:>12.3f} {VH_abs_2[i]:>12.3f}") print(f"{'─' * 46}") # 线性回归: VH(mV) vs Im(mA) slope_2, intercept_2, r_2, u_slope_2 = map(float, linear_regression(Im_2, VH_abs_2)) print_regression("VH-Im", slope_2, intercept_2, r_2, u_slope_2, "mA", "mV") input("\n 按回车继续...") # ══════════════════════════════════════════════════ # 第三部分: 零磁场 Vσ 测量 (电导率) # ══════════════════════════════════════════════════ print("\n") print("▓" * 58) print(" 第三部分: 零磁场 Vσ 测量 (电导率计算)") print(" 条件: Im = 0, 开关置 Vσ 档") print("▓" * 58) # Is 范围与第一部分相同 Is_3 = list(Is_1) # 0.20 ~ 2.00 mA Vsigma = [] print(f"\n 输入各 Is 下的电压降 Vσ (mV):\n") for Is_val in Is_3: vs = input_float(f" Is = {Is_val:.2f} mA → Vσ (mV)") Vsigma.append(vs) # 打印数据表 print(f"\n{'─' * 36}") print(f" Vσ - Is 数据表") print(f"{'─' * 36}") print(f" {'Is(mA)':>8} │ {'Vσ(mV)':>10}") print(f" {'─' * 26}") for i in range(len(Is_3)): print(f" {Is_3[i]:>8.2f} │ {Vsigma[i]:>10.4f}") print(f"{'─' * 36}") # 线性回归: Vσ(mV) vs Is(mA) slope_3, intercept_3, r_3, u_slope_3 = map(float, linear_regression(Is_3, Vsigma)) print_regression("Vσ-Is", slope_3, intercept_3, r_3, u_slope_3, "mA", "mV") print(f" 注: 斜率 = Vσ/Is, 单位 mV/mA = V/A = Ω (样品电阻)") # ══════════════════════════════════════════════════ # 第四部分: 物理量计算 # ══════════════════════════════════════════════════ print("\n") print("▓" * 58) print(" 第四部分: 物理量计算与不确定度分析") print("▓" * 58) # ─── 4.1 电导率 σ ─── # σ = L / (R · b · d) # R = slope_3 (mV/mA = V/A = Ω) R_sample = slope_3 # Ω sigma = L / (R_sample * b * d) # S/m # 不确定度 (此处仅传递回归斜率的不确定度,几何参数视为已知常量) u_r_R = abs(u_slope_3 / slope_3) if slope_3 != 0 else 0.0 u_r_sigma = u_r_R # 简化: 仅考虑斜率不确定度 u_sigma = abs(sigma) * u_r_sigma print(f"\n ── 4.1 电导率 σ ──") print(f" 样品电阻 R = Vσ/Is (斜率) = {R_sample:.6f} Ω") print(f" σ = L / (R · b · d)") print(f" = {L:.4e} / ({R_sample:.6f} × {b:.4e} × {d:.4e})") print(f" = {sigma:.4f} S/m") print(f" u_r(σ) = u(k₃)/k₃ = {u_r_sigma * 100:.2f}%") sigma_final, u_sigma_final = scientific_round(sigma, u_sigma) print(f" ★ σ = {sigma_final} ± {u_sigma_final} S/m") # ─── 4.2 霍尔灵敏度 KH (由 VH-Is 线性回归) ─── # VH = KH · Is · B → slope₁ = KH · B → KH = slope₁ / B # slope₁ 单位: mV/mA = V/A KH = slope_1 / B_fixed # V/(A·T) u_r_slope1 = abs(u_slope_1 / slope_1) if slope_1 != 0 else 0.0 u_r_KH = u_r_slope1 # B 视为无不确定度 u_KH = abs(KH) * u_r_KH print(f"\n ── 4.2 霍尔灵敏度 KH (VH-Is) ──") print(f" KH = slope₁ / B") print(f" = {slope_1:.6f} / {B_fixed:.6f}") print(f" = {KH:.4f} V/(A·T)") print(f" u_r(KH) = {u_r_KH * 100:.2f}%") KH_final, u_KH_final = scientific_round(abs(KH), u_KH) print(f" ★ |KH| = {KH_final} ± {u_KH_final} V/(A·T)") # ─── 交叉验证: 由 VH-Im 线性回归求 KH ─── # VH = KH · Is · k_sol · Im → slope₂ = KH · Is · k_sol # KH = slope₂ / (Is_fixed_A · k_sol) KH_check = slope_2 / (Is_fixed_A * k_sol) print(f"\n ── 交叉验证: KH (VH-Im) ──") print(f" KH' = slope₂ / (Is · k_sol)") print(f" = {slope_2:.6f} / ({Is_fixed_A:.4e} × {k_sol:.6e})") print(f" = {KH_check:.4f} V/(A·T)") deviation_pct = abs(KH - KH_check) / abs(KH) * 100 if KH != 0 else 0 print(f" 两种方法偏差: {deviation_pct:.2f}%") # ─── 4.3 霍尔系数 RH ─── RH = abs(KH) * d # m³/C print(f"\n ── 4.3 霍尔系数 RH ──") print(f" RH = |KH| × d = {abs(KH):.4f} × {d:.4e}") print(f" RH = {RH:.4e} m³/C") # ─── 4.4 载流子浓度 n ─── # n = 1 / (RH · e) n_carrier = 1.0 / (RH * e_charge) # u_r(n) = u_r(KH) (d 视为精确) u_r_n = u_r_KH u_n = n_carrier * u_r_n print(f"\n ── 4.4 载流子浓度 n ──") print(f" n = 1 / (RH · e)") print(f" = 1 / ({RH:.4e} × {e_charge})") print(f" = {n_carrier:.4e} m⁻³") n_final, u_n_final = scientific_round(n_carrier, u_n) print(f" ★ n = {n_final} ± {u_n_final} m⁻³") # ─── 4.5 载流子迁移率 μ ─── # μ = σ / (n · e) = σ · RH mu = sigma / (n_carrier * e_charge) mu_check = sigma * RH # 验证 u_r_mu = math.sqrt(u_r_sigma ** 2 + u_r_KH ** 2) u_mu = abs(mu) * u_r_mu print(f"\n ── 4.5 载流子迁移率 μ ──") print(f" μ = σ / (n · e)") print(f" = {sigma:.4f} / ({n_carrier:.4e} × {e_charge})") print(f" = {mu:.4e} m²/(V·s)") print(f" 验证: μ = σ · RH = {sigma:.4f} × {RH:.4e} = {mu_check:.4e} m²/(V·s)") mu_final, u_mu_final = scientific_round(mu, u_mu) print(f" ★ μ = {mu_final} ± {u_mu_final} m²/(V·s)") # ══════════════════════════════════════════════════ # 第五部分: 结果汇总 # ══════════════════════════════════════════════════ print("\n") print("╔══════════════════════════════════════════════════════════════╗") print("║ 实 验 结 果 汇 总 ║") print("╠══════════════════════════════════════════════════════════════╣") print(f"║ ║") print(f"║ 导电类型: {carrier_type:<47}║") print(f"║ ║") print(f"╟────────── 线性回归 ────────────────────────────────────────╢") print(f"║ VH-Is: k₁ = {slope_1:>10.6f} V/A r = {r_1:>9.6f} ║") print(f"║ VH-Im: k₂ = {slope_2:>10.6f} V/A r = {r_2:>9.6f} ║") print(f"║ Vσ-Is: k₃ = {slope_3:>10.6f} Ω r = {r_3:>9.6f} ║") print(f"╟────────── 物理参数 ────────────────────────────────────────╢") print(f"║ 电导率 σ = {str(sigma_final):>12} ± {str(u_sigma_final):<10} S/m ║") print(f"║ 霍尔灵敏度 KH = {str(KH_final):>12} ± {str(u_KH_final):<10} V/(A·T) ║") print(f"║ 霍尔系数 RH = {RH:>12.4e} m³/C ║") print(f"║ 载流子浓度 n = {str(n_final):>12} ± {str(u_n_final):<10} m⁻³ ║") print(f"║ 载流子迁移率 μ = {str(mu_final):>12} ± {str(u_mu_final):<10} m²/(V·s) ║") print(f"║ ║") print(f"╟────────── 不确定度 ────────────────────────────────────────╢") print(f"║ u_r(σ) = {u_r_sigma * 100:>6.2f}% ║") print(f"║ u_r(KH) = {u_r_KH * 100:>6.2f}% ║") print(f"║ u_r(n) = {u_r_n * 100:>6.2f}% ║") print(f"║ u_r(μ) = {u_r_mu * 100:>6.2f}% ║") print(f"║ ║") print("╚══════════════════════════════════════════════════════════════╝") if __name__ == "__main__": main()