140 lines
4.7 KiB
Plaintext
140 lines
4.7 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 长度直接测量与不确定度评定\n",
|
||
"\n",
|
||
"本 Notebook 用于对多次长度直接测量数据进行 A 类不确定度、B 类不确定度及合成不确定度计算,并严格按照“四舍六入五凑偶”规则对测量结果进行科学修约与末位对齐。\n",
|
||
"\n",
|
||
"---\n",
|
||
"### 实验原理与数学公式\n",
|
||
"\n",
|
||
"#### 1. 算术平均值与样本标准差\n",
|
||
"对 $n$ 次独立等精度直接测量值 $x_1, x_2, \\dots, x_n$:\n",
|
||
"$$\\bar{x} = \\frac{1}{n} \\sum_{i=1}^n x_i$$\n",
|
||
"$$s = \\sqrt{\\frac{1}{n-1} \\sum_{i=1}^n (x_i - \\bar{x})^2}$$\n",
|
||
"\n",
|
||
"#### 2. A 类、B 类及合成不确定度\n",
|
||
"* **A 类不确定度**(由有限次测量随机效应引起):\n",
|
||
"$$u_A = \\frac{s}{\\sqrt{n}}$$\n",
|
||
"* **B 类不确定度**(由测量仪器极限误差 $\\Delta_{\\mathrm{inst}}$ 引起,假定均匀分布):\n",
|
||
"$$u_B = \\frac{\\Delta_{\\mathrm{inst}}}{\\sqrt{3}}$$\n",
|
||
"* **合成标准不确定度**:\n",
|
||
"$$u = \\sqrt{u_A^2 + u_B^2}$$\n",
|
||
"\n",
|
||
"#### 3. 修约与结果表示\n",
|
||
"* 不确定度 $u$ 按照“四舍六入五凑偶”原则保留一位有效数字。\n",
|
||
"* 测量平均值末位与不确定度的有效位数对齐。"
|
||
],
|
||
"id": "1ed33dfddc944ff0"
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import math\n",
|
||
"from decimal import Decimal, ROUND_HALF_EVEN\n",
|
||
"from python.utils import get_decimal_places, scientific_round\n",
|
||
"\n",
|
||
"print(\"工具函数加载完成。\")"
|
||
],
|
||
"id": "709179017567e25d"
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 1. 测量数据与仪器参数设置\n",
|
||
"> **提示**:直接在下方修改测量数据列表 `raw_data`(字符串或数值)与仪器分度值/允差 `res_str` 即可。"
|
||
],
|
||
"id": "6e9499ceb295ab05"
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 测量数据列表 (字符串格式保留输入精度)\n",
|
||
"raw_data = [\"10.25\", \"10.24\", \"10.26\", \"10.25\", \"10.24\", \"10.25\"]\n",
|
||
"\n",
|
||
"# 仪器分度值 / 仪器误差限 Δ_inst\n",
|
||
"res_str = \"0.05\"\n",
|
||
"\n",
|
||
"print(f\"输入测量数据 (n={len(raw_data)}): {raw_data}\")\n",
|
||
"print(f\"仪器误差限 Δ_inst: {res_str}\")"
|
||
],
|
||
"id": "722fceaefcc9ac13"
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 2. 不确定度计算与科学修约"
|
||
],
|
||
"id": "376599ba7264087b"
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def calc_uncertainty(data_strs, res_str=\"0.05\"):\n",
|
||
" data = [Decimal(str(s)) for s in data_strs]\n",
|
||
" res = Decimal(str(res_str))\n",
|
||
" n = len(data)\n",
|
||
" \n",
|
||
" # 1. 原始精度平均值\n",
|
||
" places = get_decimal_places(data_strs)\n",
|
||
" sum_val = sum(data)\n",
|
||
" mean = sum_val / n\n",
|
||
" mean_final = mean.quantize(Decimal('1.' + '0' * places), rounding=ROUND_HALF_EVEN)\n",
|
||
" \n",
|
||
" # 2. 样本标准差 s\n",
|
||
" variance = sum((x - mean) ** 2 for x in data) / (n - 1) if n > 1 else Decimal(\"0\")\n",
|
||
" s = Decimal(str(math.sqrt(float(variance))))\n",
|
||
" \n",
|
||
" # 3. A 类不确定度\n",
|
||
" u_A = s / Decimal(str(math.sqrt(n))) if n > 1 else Decimal(\"0\")\n",
|
||
" \n",
|
||
" # 4. B 类不确定度\n",
|
||
" u_B = res / Decimal(str(math.sqrt(3)))\n",
|
||
" \n",
|
||
" # 5. 合成不确定度\n",
|
||
" u = Decimal(str(math.sqrt(float(u_A**2 + u_B**2))))\n",
|
||
" \n",
|
||
" return mean_final, mean, s, u_A, u_B, u\n",
|
||
"\n",
|
||
"mean_display, mean_raw, s, u_A, u_B, u = calc_uncertainty(raw_data, res_str)\n",
|
||
"mean_final, u_final = scientific_round(mean_raw, u)\n",
|
||
"\n",
|
||
"print(\"=\" * 40)\n",
|
||
"print(\" 长 度 测 量 不 确 定 度 分 析 \")\n",
|
||
"print(\"=\" * 40)\n",
|
||
"print(f\"测量次数 n : {len(raw_data)}\")\n",
|
||
"print(f\"算术平均值 : {mean_raw:.6f}\")\n",
|
||
"print(f\"样本标准差 s : {s:.6f}\")\n",
|
||
"print(f\"A 类不确定度 u_A : {u_A:.6f}\")\n",
|
||
"print(f\"B 类不确定度 u_B : {u_B:.6f}\")\n",
|
||
"print(f\"合成不确定度 u : {u:.6f}\")\n",
|
||
"print(\"-\" * 40)\n",
|
||
"print(f\"★ 最终修约结果 : L = {mean_final} ± {u_final}\")\n",
|
||
"print(\"=\" * 40)"
|
||
],
|
||
"id": "5fc60b2526bdc755"
|
||
}
|
||
],
|
||
"metadata": {
|
||
"language_info": {
|
||
"name": "python"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|