代码实现共振法测量杨氏模量实验数据处理
代码由本人搭建框架,ai修改所以显得很人机,请见谅
核心公式
E = 1.6067 L 3 m d 4 f 2 E=1.6067\frac{L^3m}{d^4}f^2 E=1.6067d4L3mf2
直接测量量的不确定度
import math
def calculate_average(n, arr):
"""
计算一组数据的平均值
:param n: 数据的个数
:param arr: 数据列表
:return: 平均值
"""
return sum(arr) / n
def calculate_a_uncertainty(n, arr, average):
"""
计算一组数据的 A 类不确定度
:param n: 数据的个数
:param arr: 数据列表
:param average: 数据的平均值
:return: A 类不确定度
"""
print("\n计算 A 类不确定度:")
print("残差公式:x_i - 平均值")
print("残差平方公式:(x_i - 平均值)^2")
print("A 类不确定度公式:sqrt(Σ(x_i - 平均值)^2 / (n * (n - 1)))")
sum_squared_diff = 0.0
print("\n残差及残差平方计算:")
for i, x in enumerate(arr):
diff = x - average
squared_diff = diff ** 2
sum_squared_diff += squared_diff
print(f"数据 {i + 1}: 残差 = {diff:.5f}, 残差平方 = {squared_diff:.5f}")
a_uncertainty = math.sqrt(sum_squared_diff / (n * (n - 1)))
print(f"\nΣ(残差平方) = {sum_squared_diff:.5f}")
print(f"A 类不确定度 = sqrt({sum_squared_diff:.5f} / ({n} * ({n} - 1))) = {a_uncertainty:.5f}")
return a_uncertainty
def calculate_b_uncertainty():
"""
计算 B 类不确定度,通过用户输入仪器的分度值
:return: B 类不确定度
"""
while True:
try:
fenduzhi = float(input("请输入该仪器对应的分度值为: "))
if fenduzhi <= 0:
print("分度值必须为正数,请重新输入。")
else:
b_uncertainty = fenduzhi / math.sqrt(3)
print("\n计算 B 类不确定度:")
print(f"B 类不确定度公式:分度值 / sqrt(3) = {fenduzhi:.5f} / sqrt(3) = {b_uncertainty:.5f}")
return b_uncertainty
except ValueError:
print("输入无效,请输入一个有效的数字。")
def calculate_uncertainty(a, b):
"""
计算合成不确定度
:param a: A 类不确定度
:param b: B 类不确定度
:return: 合成不确定度
"""
uncertainty = math.sqrt(a * a + b * b)
print("\n计算合成不确定度:")
print(f"合成不确定度公式:sqrt(A^2 + B^2) = sqrt({a:.5f}^2 + {b:.5f}^2) = {uncertainty:.5f}")
return uncertainty
def calculate_relative_uncertainty(average, uncertainty):
"""
计算相对不确定度并输出结果
:param average: 平均值
:param uncertainty: 合成不确定度
"""
relative_uncertainty = (uncertainty / average) * 100
print("\n计算相对不确定度:")
print(f"相对不确定度公式:(不确定度 / 平均值) * 100 = ({uncertainty:.5f} / {average:.5f}) * 100 = {relative_uncertainty:.5f}%")
def show_result(average, uncertainty):
"""
输出测量结果
:param average: 平均值
:param uncertainty: 合成不确定度
"""
print("\n最终测量结果:")
print(f"其测量结果为 {average:.5f} ± {2 * uncertainty:.5f}")
def get_positive_integer(prompt):
"""
获取用户输入的正整数
:param prompt: 提示信息
:return: 正整数
"""
while True:
try:
value = int(input(prompt))
if value <= 0:
print("输入必须为正整数,请重新输入。")
else:
return value
except ValueError:
print("输入无效,请输入一个有效的整数。")
def get_float(prompt):
"""
获取用户输入的浮点数
:param prompt: 提示信息
:return: 浮点数
"""
while True:
try:
return float(input(prompt))
except ValueError:
print("输入无效,请输入一个有效的数字。")
def main():
choice = 1
while choice != 0:
n = get_positive_integer("请输入数据的个数: ")
arr = []
print(f"请输入 {n} 个数据(浮点数):")
for i in range(n):
arr.append(get_float(f"数据 {i + 1}: "))
average_value = calculate_average(n, arr)
print(f"\n计算平均值:")
print(f"平均值公式:Σx_i / n = {sum(arr):.5f} / {n} = {average_value:.5f}")
a_uncertainty = calculate_a_uncertainty(n, arr, average_value)
b_uncertainty = calculate_b_uncertainty()
uncertainty_value = calculate_uncertainty(a_uncertainty, b_uncertainty)
calculate_relative_uncertainty(average_value, uncertainty_value)
show_result(average_value, uncertainty_value)
print("\n输入 0 退出,输入其他数字继续计算: ", end="")
choice = get_positive_integer("")
if __name__ == "__main__":
main()
传递不确定度的公式
import math
# 定义常量
constant = 1.6067
# 输入各物理量的值及其不确定度
L = float(input("请输入 L 的值: "))
u_L = float(input("请输入 L 的不确定度: "))
m = float(input("请输入 m 的值: "))
u_m = float(input("请输入 m 的不确定度: "))
d = float(input("请输入 d 的值: "))
u_d = float(input("请输入 d 的不确定度: "))
f = float(input("请输入 f 的值: "))
u_f = float(input("请输入 f 的不确定度: "))
# 计算 E 的值
E = constant * (L**3 * m) / (d**4 * f**2)
# 计算相对不确定度
relative_uncertainty = math.sqrt((3 * (u_L / L))**2 + (u_m / m)**2 + (4 * (u_d / d))**2 + (2 * (u_f / f))**2)
# 计算 E 的不确定度
u_E = E * relative_uncertainty
# 输出结果
print(f"E 的值为: {E:.5f}")
print(f"E 的不确定度为: {u_E:.5f}")
print(f"不确定度表达式为: E = {E:.5f} ± {u_E:.5f}")