代码实现共振法测量杨氏模量实验数据处理

代码实现共振法测量杨氏模量实验数据处理


代码由本人搭建框架,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}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值