113 lines
4.3 KiB
Python
113 lines
4.3 KiB
Python
import math
|
|
from decimal import Decimal
|
|
|
|
"""
|
|
Newton's Rings Curvature Radius Calculator (Successive Difference Method)
|
|
牛顿环曲率半径计算器 (逐差法)
|
|
|
|
参考 lenth.py 的高精度与不确定度修约逻辑。
|
|
"""
|
|
|
|
from utils import get_decimal_places, scientific_round
|
|
|
|
def main():
|
|
# --- 1. 参数与常量初始化 ---
|
|
WAVELENGTH = Decimal("0.0005893") # 钠光波长默认 589.3 nm = 0.0005893 mm
|
|
M = 10 # 逐差法的差值项数 (30-20=10)
|
|
|
|
print("========================================")
|
|
print(" 牛顿环曲率半径计算 (逐差法) ")
|
|
print("========================================")
|
|
print(f"默认波长 λ = {WAVELENGTH} mm (钠光)")
|
|
print("参考环数: 第 11 环 到 第 30 环 (共 20 个数据)")
|
|
|
|
# --- 2. 数据输入 ---
|
|
d_squared_vals = []
|
|
data_strs = []
|
|
print("\n[第一步] 请输入暗环直径平方 D^2 (单位: mm^2)")
|
|
print("支持粘贴或逐个输入,精确到小数点后三位。")
|
|
|
|
for i in range(11, 31):
|
|
while True:
|
|
try:
|
|
user_input = input(f"D_{i:02d}^2 = ").strip()
|
|
if not user_input:
|
|
continue
|
|
val = Decimal(user_input)
|
|
d_squared_vals.append(val)
|
|
data_strs.append(user_input)
|
|
break
|
|
except Exception:
|
|
print("无效输入!请输入正确的直径平方值(如 12.345)。")
|
|
|
|
print("\n[第二步] 仪器参数输入")
|
|
res_input = input("请输入仪器分度值 (默认 0.01 mm): ").strip() or "0.01"
|
|
delta_inst_input = input("请输入仪器误差 Δ_inst (默认 0.005 mm): ").strip() or "0.005"
|
|
|
|
res = Decimal(res_input)
|
|
delta_inst = Decimal(delta_inst_input)
|
|
|
|
# --- 3. 逐差计算 ---
|
|
# Δ_i = D_{i+M}^2 - D_i^2 (i = 11...20)
|
|
deltas = []
|
|
sum_d_pairs = Decimal("0") # 用于 B 类不确定度传播: sum(D_low^2 + D_high^2)
|
|
|
|
print("\n--- 逐差过程 ---")
|
|
for i in range(10):
|
|
d_low_sq = d_squared_vals[i]
|
|
d_high_sq = d_squared_vals[i + 10]
|
|
diff = d_high_sq - d_low_sq
|
|
deltas.append(diff)
|
|
sum_d_pairs += (d_low_sq + d_high_sq)
|
|
print(f"Δ_{i+11:02d} = D_{i+21}^2 - D_{i+11}^2 = {diff} mm^2")
|
|
|
|
mean_delta = sum(deltas) / Decimal(str(M))
|
|
|
|
# --- 4. 曲率半径计算 ---
|
|
# R = Δ_avg / (4 * M * λ)
|
|
# M = 10, 所以分母是 40 * λ
|
|
denominator = Decimal("4") * Decimal(str(M)) * WAVELENGTH
|
|
r_val = mean_delta / denominator
|
|
|
|
# --- 5. 不确定度计算 ---
|
|
# (1) A 类不确定度 u_A (针对逐差后的 Δ)
|
|
variance_delta = sum((x - mean_delta)**2 for x in deltas) / Decimal(str(M - 1))
|
|
s_delta = Decimal(str(math.sqrt(float(variance_delta))))
|
|
u_a_delta = s_delta / Decimal(str(math.sqrt(M)))
|
|
|
|
# (2) B 类不确定度 u_B (传播自读数显微镜的仪器误差)
|
|
# 推导过程:
|
|
# u(x) = delta_inst / sqrt(3)
|
|
# u(D^2) = sqrt( (2D u_x)^2 + (2D u_x)^2 ) = 2 * sqrt(2) * D * u_x
|
|
# u(D^2)^2 = 8 * D^2 * u_x^2
|
|
# u(Δ)^2 = u(D_high^2)^2 + u(D_low^2)^2 = 8 * u_x^2 * (D_high^2 + D_low^2)
|
|
# u(Δ_avg)^2 = (1/M^2) * sum( u(Δ_i)^2 ) = (8 * u_x^2 / M^2) * sum_d_pairs
|
|
u_x = delta_inst / Decimal(str(math.sqrt(3)))
|
|
u_b_delta_sq = (Decimal("8") * (u_x**2) * sum_d_pairs) / (Decimal(str(M))**2)
|
|
u_b_delta = Decimal(str(math.sqrt(float(u_b_delta_sq))))
|
|
|
|
# (3) 合成不确定度 u(Δ) 并在 R 上传播
|
|
u_delta_combined = Decimal(str(math.sqrt(float(u_a_delta**2 + u_b_delta**2))))
|
|
u_r = u_delta_combined / denominator
|
|
|
|
# --- 6. 修约与展示 ---
|
|
r_final, u_final = scientific_round(r_val, u_r)
|
|
|
|
print("\n--- 中间统计结果 (高精度) ---")
|
|
print(f"平均差值 Δ_avg: {mean_delta:.6f} mm^2")
|
|
print(f"Δ 的标准差 s: {s_delta:.6f}")
|
|
print(f"Δ 的 A 类不确定度 u_A(Δ): {u_a_delta:.6f}")
|
|
print(f"Δ 的 B 类不确定度 u_B(Δ): {u_b_delta:.6f}")
|
|
|
|
print("\n--- 最终计算结果 (R) ---")
|
|
print(f"曲率半径 R (原始): {r_val:.4f} mm")
|
|
print(f"R 的合成不确定度 u(R): {u_r:.4f} mm")
|
|
|
|
print("\n========================================")
|
|
print(" 最终修约结果 (四舍六入五凑偶)")
|
|
print(f" R = {r_final} ± {u_final} mm")
|
|
print("========================================")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|