Files
Calculators-for-University-…/python/Speed of sound.ipynb
T

159 lines
6.8 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 用于通过**干涉法(驻波法)**与**相位法(李萨如图形法)**测得的接收器位移坐标,利用**逐差法**计算超声波在空气中的波长 $\\lambda$、实际声速 $v$,并与理论声速进行对比和不确定度评定。\n",
"\n",
"---\n",
"### 实验原理与数学公式\n",
"\n",
"#### 1. 理论声速公式\n",
"在摄氏温度 $t\\,({}^\\circ\\mathrm{C})$ 下,空气中理想声速为:\n",
"$$v_t = 331.45 \\sqrt{1 + \\frac{t}{273.15}} \\quad (\\mathrm{m/s})$$\n",
"\n",
"#### 2. 逐差法测波长 $\\lambda$\n",
"两组数据各测 12 个极值或特定相位位置坐标 $x_1, x_2, \\dots, x_{12}$,分成两组逐差:\n",
"$$\\Delta x_i = x_{i+6} - x_i \\quad (i = 1, 2, \\dots, 6), \\quad \\Delta x_{\\mathrm{avg}} = \\frac{1}{6} \\sum_{i=1}^6 \\Delta x_i$$\n",
"* **干涉法(驻波法)**:相邻波腹间距为 $\\lambda/2$,6 个间隔对应 $\\Delta x = 6 \\times (\\lambda/2) = 3\\lambda$,故:\n",
"$$\\lambda = \\frac{\\Delta x_{\\mathrm{avg}}}{3}$$\n",
"* **相位法(李萨如法)**:相邻同向直线相位差为 $2\\pi$,对应间距为 $\\lambda$,6 个间隔对应 $\\Delta x = 6\\lambda$,故:\n",
"$$\\lambda = \\frac{\\Delta x_{\\mathrm{avg}}}{6}$$\n",
"\n",
"#### 3. 声速与不确定度传递公式\n",
"实验测得声速为 $v = f \\cdot \\lambda$。\n",
"* 逐差平均值的 A 类不确定度:$u_A(\\Delta x_{\\mathrm{avg}}) = \\frac{s_\\Delta}{\\sqrt{6}}$\n",
"* 逐差平均值的 B 类不确定度:$u_B(\\Delta x_{\\mathrm{avg}}) = \\sqrt{\\frac{2}{6}} \\frac{\\Delta_{\\mathrm{inst}}}{\\sqrt{3}} = \\frac{\\Delta_{\\mathrm{inst}}}{3}$\n",
"* 合成不确定度:$u_c(\\Delta x_{\\mathrm{avg}}) = \\sqrt{u_A^2 + u_B^2}$\n",
"* 波长及声速不确定度(忽略频率 $f$ 极小的不确定度):\n",
"$$u(\\lambda) = \\frac{u_c(\\Delta x_{\\mathrm{avg}})}{k}, \\quad u(v) = f \\cdot u(\\lambda)$$"
],
"id": "db386d820ed39819"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import math\n",
"from decimal import Decimal\n",
"from python.utils import scientific_round\n",
"\n",
"print(\"声速计算模块加载完成。\")"
],
"id": "72c0a986ef718706"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. 实验条件与测量数据输入\n",
"> **提示**:可在此输入环境温度、激励信号源频率,以及干涉法和相位法分别测得的 12 个坐标值 $x_i\\,(\\mathrm{mm})$。"
],
"id": "b2da551f9b00370d"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 实验环境参数\n",
"t_celsius = 24.0 # 环境温度 (℃)\n",
"freq = 37000.0 # 谐振超声波频率 (Hz)\n",
"delta_inst = Decimal(\"0.02\") # 游标卡尺/测微鼓轮分度值误差 (mm)\n",
"\n",
"# 1. 干涉法 (驻波法) 12 个坐标 (mm)\n",
"x_vals_interference = [\n",
" Decimal(\"10.20\"), Decimal(\"14.85\"), Decimal(\"19.50\"), Decimal(\"24.15\"), Decimal(\"28.80\"), Decimal(\"33.45\"),\n",
" Decimal(\"38.10\"), Decimal(\"42.75\"), Decimal(\"47.40\"), Decimal(\"52.05\"), Decimal(\"56.70\"), Decimal(\"61.35\")\n",
"]\n",
"\n",
"# 2. 相位法 (李萨如图形法) 12 个坐标 (mm)\n",
"x_vals_phase = [\n",
" Decimal(\"12.00\"), Decimal(\"21.30\"), Decimal(\"30.60\"), Decimal(\"39.90\"), Decimal(\"49.20\"), Decimal(\"58.50\"),\n",
" Decimal(\"67.80\"), Decimal(\"77.10\"), Decimal(\"86.40\"), Decimal(\"95.70\"), Decimal(\"105.00\"), Decimal(\"114.30\")\n",
"]\n",
"\n",
"v_theory = 331.45 * math.sqrt(1 + t_celsius / 273.15)\n",
"print(f\"当前温度 {t_celsius} ℃ 下的理论声速 v_t: {v_theory:.2f} m/s\")"
],
"id": "634f5ee7bd5300e5"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. 逐差法处理与声速不确定度评定"
],
"id": "223b20661658522d"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def process_speed_of_sound(method_name, x_vals, f, k, delta_inst):\n",
" M = 6\n",
" deltas = []\n",
" for i in range(M):\n",
" diff = x_vals[i + M] - x_vals[i]\n",
" deltas.append(diff)\n",
" mean_delta = sum(deltas) / Decimal(str(M))\n",
" \n",
" # 计算波长 (mm -> m)\n",
" wavelength_mm = mean_delta / Decimal(str(k))\n",
" wavelength_m = wavelength_mm / Decimal(\"1000\")\n",
" velocity = Decimal(str(f)) * wavelength_m\n",
" \n",
" # 不确定度分析\n",
" variance_delta = sum((d - mean_delta)**2 for d in deltas) / Decimal(str(M - 1))\n",
" s_delta = Decimal(str(math.sqrt(float(variance_delta))))\n",
" u_a_delta = s_delta / Decimal(str(math.sqrt(M)))\n",
" \n",
" u_x = delta_inst / Decimal(str(math.sqrt(3)))\n",
" u_b_delta = Decimal(str(math.sqrt(2.0 / M))) * u_x\n",
" u_delta_combined = Decimal(str(math.sqrt(float(u_a_delta**2 + u_b_delta**2))))\n",
" \n",
" u_wavelength_mm = u_delta_combined / Decimal(str(k))\n",
" u_wavelength_m = u_wavelength_mm / Decimal(\"1000\")\n",
" u_velocity = Decimal(str(f)) * u_wavelength_m\n",
" \n",
" v_final, uv_final = scientific_round(velocity, u_velocity)\n",
" \n",
" print(\"=\" * 45)\n",
" print(f\" {method_name} 计算结果 \")\n",
" print(\"=\" * 45)\n",
" print(f\"逐差平均位移 Δx_avg : {mean_delta:.4f} mm\")\n",
" print(f\"位移标准差 s(Δx) : {s_delta:.4f} mm\")\n",
" print(f\"声波波长 λ : {wavelength_mm:.4f} mm\")\n",
" print(f\"波长不确定度 u(λ) : {u_wavelength_mm:.4f} mm\")\n",
" print(f\"实验声速 v (原始) : {velocity:.2f} m/s\")\n",
" print(f\"声速合成不确定度 u(v): {u_velocity:.2f} m/s\")\n",
" rel_error = abs(float(velocity) - v_theory) / v_theory * 100\n",
" print(f\"与理论声速相对误差 : {rel_error:.2f}%\")\n",
" print(\"-\" * 45)\n",
" print(f\"★ 最终修约结果 : v = {v_final} ± {uv_final} m/s\")\n",
" print(\"=\" * 45 + \"\\n\")\n",
"\n",
"# 处理两种方法\n",
"process_speed_of_sound(\"干涉法 (驻波法)\", x_vals_interference, freq, 3, delta_inst)\n",
"process_speed_of_sound(\"相位法 (李萨如法)\", x_vals_phase, freq, 6, delta_inst)"
],
"id": "70554a3d5158f78e"
}
],
"metadata": {
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 5
}