Files
Calculators-for-University-…/python/Surface tension coefficient.ipynb
T

191 lines
7.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 拉脱法测液体表面张力系数计算器\n",
"\n",
"本 Notebook 用于通过力敏传感器测定拉脱法实验中液体(水)的表面张力系数 $\\alpha$。包含砝码电压标定(线性回归求传感器灵敏度 $K$)、拉脱峰值电压与吊环内外径统计、不确定度合成及规范修约。\n",
"\n",
"---\n",
"### 实验原理与数学公式\n",
"\n",
"#### 1. 表面张力系数计算公式\n",
"当薄壁圆环从液体表面被拉脱的一瞬间,所受的最大液体表面张力与圆环内外周长成正比:\n",
"$$\\alpha = \\frac{F}{\\pi (d_1 + d_2)}$$\n",
"* $F$:最大拉脱力(通过力敏传感器测得 $F = U_{\\mathrm{pull}} / K$)\n",
"* $K$:力敏传感器灵敏度 $(\\mathrm{V/N})$ 或 $(\\mathrm{mV/N})$\n",
"* $d_1, d_2$:金属圆环的内径与外径\n",
"\n",
"#### 2. 力敏传感器灵敏度标定\n",
"使用单重为 $m$ 的标准小砝码增重与减重 $i$ 个($i = 0, 1, \\dots, 5$),各测得对应的输出电压 $U_{1,i}, U_{2,i}$。取增减重平均值:\n",
"$$\\bar{U}_i = \\frac{U_{1,i} + U_{2,i}}{2}, \\quad F_i = i \\cdot m \\cdot g$$\n",
"使用最小二乘线性回归对 $(F_i, \\bar{U}_i)$ 拟合直线 $U = K \\cdot F + b$,斜率即为灵敏度 $K$,其标准不确定度记为 $u(K)$。\n",
"\n",
"#### 3. 不确定度合成与传递\n",
"* 拉脱力 $F$ 的相对不确定度:\n",
"$$u_r(F) = \\sqrt{ \\left(\\frac{u_U}{\\bar{U}_{\\mathrm{pull}}}\\right)^2 + \\left(\\frac{u_K}{K}\\right)^2 }$$\n",
"* 直径和 $(d_1 + d_2)$ 的不确定度:\n",
"$$u(d_1 + d_2) = \\sqrt{u^2(d_1) + u^2(d_2)}, \\quad u_r(d_1+d_2) = \\frac{u(d_1 + d_2)}{d_1 + d_2}$$\n",
"* 表面张力系数 $\\alpha$ 的总相对不确定度与绝对不确定度:\n",
"$$u_r(\\alpha) = \\sqrt{u_r^2(F) + u_r^2(d_1 + d_2)}, \\quad u(\\alpha) = \\alpha \\cdot u_r(\\alpha)$$"
],
"id": "781711c13d45a52a"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import math\n",
"from decimal import Decimal\n",
"from python.utils import scientific_round, calculate_stats, linear_regression\n",
"\n",
"print(\"表面张力系数模块加载完成。\")"
],
"id": "d1f8bddcdc7a754a"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. 传感器砝码标定数据输入与拟合\n",
"> **提示**:可在此输入单个小砝码质量 `m_mass_g` 以及增重、减重各 6 个点对应的标定电压。"
],
"id": "6a7bf3a6389e57db"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"G = Decimal(\"9.80\") # 重力加速度 (m/s^2)\n",
"PI = Decimal(str(math.pi))\n",
"\n",
"# 单个小砝码质量 (g)\n",
"m_mass_g = Decimal(\"0.50\")\n",
"m_mass_kg = m_mass_g / Decimal(\"1000\")\n",
"\n",
"# 标定电压 (0~5个砝码, 单位与后续拉脱电压保持统一即可, 如 V 或 mV)\n",
"U_calib_1 = [Decimal(\"0.00\"), Decimal(\"0.052\"), Decimal(\"0.104\"), Decimal(\"0.155\"), Decimal(\"0.207\"), Decimal(\"0.259\")] # 增重\n",
"U_calib_2 = [Decimal(\"0.00\"), Decimal(\"0.051\"), Decimal(\"0.103\"), Decimal(\"0.156\"), Decimal(\"0.208\"), Decimal(\"0.260\")] # 减重\n",
"\n",
"# 计算平均电压与外力\n",
"U_calib_avg = [(U_calib_1[i] + U_calib_2[i]) / Decimal(\"2\") for i in range(6)]\n",
"F_calib = [Decimal(str(i)) * m_mass_kg * G for i in range(6)]\n",
"\n",
"# 线性回归拟合灵敏度 K\n",
"K, K_b, r, u_K = linear_regression(F_calib, U_calib_avg)\n",
"\n",
"print(\"=\" * 45)\n",
"print(\" 传 感 器 标 定 拟 合 结 果 \")\n",
"print(\"=\" * 45)\n",
"print(f\"灵敏度斜率 K : {K:.6f} (电压单位/N)\")\n",
"print(f\"截距 b : {K_b:.6f}\")\n",
"print(f\"相关系数 r : {r:.6f}\")\n",
"print(f\"斜率不确定度 u_K: {u_K:.6e}\")"
],
"id": "db8e4e72f93077d5"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. 拉脱实验数据与圆环几何尺寸输入"
],
"id": "37706b6c98e4d762"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 仪器允差\n",
"delta_U = Decimal(\"0.001\") # 电压表仪器误差\n",
"delta_d = Decimal(\"0.02\") # 游标卡尺仪器误差 (mm)\n",
"\n",
"# 6次测量数据列表\n",
"U_pull_vals = [Decimal(\"0.215\"), Decimal(\"0.214\"), Decimal(\"0.216\"), Decimal(\"0.215\"), Decimal(\"0.213\"), Decimal(\"0.215\")]\n",
"d1_vals = [Decimal(\"33.10\"), Decimal(\"33.12\"), Decimal(\"33.08\"), Decimal(\"33.10\"), Decimal(\"33.14\"), Decimal(\"33.10\")] # 内径 (mm)\n",
"d2_vals = [Decimal(\"35.20\"), Decimal(\"35.22\"), Decimal(\"35.18\"), Decimal(\"35.20\"), Decimal(\"35.22\"), Decimal(\"35.20\")] # 外径 (mm)\n",
"\n",
"# 统计各量\n",
"U_pull_mean, U_pull_u = calculate_stats(U_pull_vals, delta_U)[:2]\n",
"d1_mean, d1_u = calculate_stats(d1_vals, delta_d)[:2]\n",
"d2_mean, d2_u = calculate_stats(d2_vals, delta_d)[:2]\n",
"\n",
"print(f\"拉脱平均电压 U_pull: {U_pull_mean:.4f} ± {U_pull_u:.4f}\")\n",
"print(f\"圆环平均内径 d1 : {d1_mean:.3f} ± {d1_u:.3f} mm\")\n",
"print(f\"圆环平均外径 d2 : {d2_mean:.3f} ± {d2_u:.3f} mm\")"
],
"id": "4898cff018c8803b"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. 表面张力系数计算与不确定度修约"
],
"id": "188a7b2b3dc5b54"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 计算拉脱力 F (N)\n",
"F_pull_mean = U_pull_mean / K\n",
"\n",
"# 换算为标准国际单位 m\n",
"d1_m = d1_mean / Decimal(\"1000\")\n",
"d2_m = d2_mean / Decimal(\"1000\")\n",
"d1_u_m = d1_u / Decimal(\"1000\")\n",
"d2_u_m = d2_u / Decimal(\"1000\")\n",
"d_sum = d1_m + d2_m\n",
"\n",
"# 表面张力系数 α = F / [π * (d1 + d2)]\n",
"alpha_val = F_pull_mean / (PI * d_sum)\n",
"\n",
"# 不确定度合成传递\n",
"u_r_F_sq = (U_pull_u / U_pull_mean)**2 + (u_K / K)**2\n",
"u_r_F = Decimal(str(math.sqrt(float(u_r_F_sq))))\n",
"\n",
"u_d_sum = Decimal(str(math.sqrt(float(d1_u_m**2 + d2_u_m**2))))\n",
"u_r_d_sum = u_d_sum / d_sum\n",
"\n",
"u_r_alpha = Decimal(str(math.sqrt(float(u_r_F**2 + u_r_d_sum**2))))\n",
"alpha_u = alpha_val * u_r_alpha\n",
"\n",
"# 科学修约\n",
"alpha_final, u_final = scientific_round(alpha_val, alpha_u)\n",
"\n",
"print(\"=\" * 45)\n",
"print(\" 表 面 张 力 系 数 计 算 结 果 \")\n",
"print(\"=\" * 45)\n",
"print(f\"最大拉脱力 F : {F_pull_mean:.6f} N\")\n",
"print(f\"圆环周长项 (d1+d2): {(d_sum*1000):.3f} mm\")\n",
"print(f\"表面张力系数 α (原始): {alpha_val:.6f} N/m\")\n",
"print(\"-\" * 45)\n",
"print(f\"相对不确定度 u_r : {u_r_alpha * 100:.2f}%\")\n",
"print(f\"绝对不确定度 u_α : {alpha_u:.6f} N/m\")\n",
"print(\"-\" * 45)\n",
"print(f\"★ 最终修约结果 : α = {alpha_final} ± {u_final} N/m\")\n",
"print(\"=\" * 45)"
],
"id": "74791d410688e40a"
}
],
"metadata": {
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 5
}