大学物理实验数据分析不确定度的运算python

 基于大学物理实验后数据处理庞大的计算量,为了不想再手敲计算器,于是编写

import tkinter as tk
from math import *
from sympy import *
from math import pi
#tp值
tp=[0,0,1.84,1.32,1.20,1.14,1.11,1.09,1.08,1.07,1.06,1.05]
av=0
data_=0
E_1=0
def zhijie():
    global root_2
    root_2=tk.Tk()
    #设置窗口大小
    root_2.geometry('800x330+200+200')
    #设置标题
    root_2.title("直接法计算不确定度")
    frame_1=tk.LabelFrame(root_2)
    frame_2=tk.LabelFrame(root_2)
    frame_3=tk.LabelFrame(root_2)
    global input_va_yi
    global input_va_n
    global input_va_shu
    input_va_yi=tk.StringVar()
    input_va_n=tk.StringVar()
    input_va_shu=tk.StringVar()
    frame_1.pack(pady=0,fill='both')
    frame_2.pack(pady=0,fill='both')
    frame_3.pack(pady=0,fill='both')
    tk.Label(frame_1,text="请输入仪器误差:",font=("黑体",20)).pack(side='top',padx=0)
    #设置输入框
    tk.Entry(frame_1,width=100,relief='flat',textvariable=input_va_yi).pack(fill='both')
    tk.Label(frame_2,text="请输入你测量的次数:",font=("黑体",20)).pack(side='top',pady=0)
    tk.Entry(frame_2,width=100,relief='flat',textvariable=input_va_n).pack(fill='both')
    tk.Label(frame_3,text="请输入你测量的数据:",font=("黑体",20)).pack(side='top',pady=0)
    tk.Entry(frame_3,width=100,relief='flat',textvariable=input_va_shu).pack(fill='both')
    tk.Button(root_2,text="确认数据",font=('黑体',15),relief='flat',bg='#449d44',command=newwind_1).pack()
    root_2.mainloop()
def newwind_1():
    data_yi=eval(input_va_yi.get().replace(',',',').replace(' ',','))
    #输入测量次数n:
    n=eval(input_va_n.get().replace(',',',').replace(' ',','))
    #输入测量的数据
    #lst=eval(input('请输入你测量所得的数据:'))
    lst=eval(input_va_shu.get().replace(',',',').replace(' ',','))
    av=sum(lst)/n
    #print(av)
    av_=0
    data_1=0
    if n!=1:
        for i in lst:
            av_+=(i-av)**2
            #计算标准不确定度
            data_1=tp[n]*sqrt(av_/(n*(n-1)))
            #print(data_1)
    data_2=data_yi/sqrt(3)
        #print(data_2)
    data_=sqrt(data_1**2+data_2**2)
    #print(data_)
    #计算相对误差
    E_1=data_/av
    #print(E_1)
    winNew=tk.Toplevel(root_2)
    winNew.geometry('800x330')
    winNew.title('结果')
    frame_1=tk.LabelFrame(winNew)
    frame_1.pack(pady=0,fill='both')
    tk.Label(frame_1,text="数据的平均值为:{}".format(av),font=("黑体",20)).pack(side='top',pady=0)
    tk.Label(frame_1,text="数据的标准不确定度为:{}".format(data_),font=("黑体",20)).pack(side='top',pady=20)
    tk.Label(frame_1,text="数据的相对不确定度为:{}".format(E_1),font=("黑体",20)).pack(side='top',pady=40)
    btClose=tk.Button(winNew,text='关闭',font=('黑体',15),relief='flat',bg='#449d44',command=winNew.destroy)
    btClose.pack(side='top',pady=40,fill='both') 
def jianjie():
    global root_3
    root_3=tk.Tk()
    #设置窗口大小
    root_3.geometry('800x330+200+200')
    #设置标题
    root_3.title("间接法计算不确定度")
    frame_1=tk.LabelFrame(root_3)
    frame_2=tk.LabelFrame(root_3)
    frame_3=tk.LabelFrame(root_3)
    frame_4=tk.LabelFrame(root_3)
    global input_va_name
    global input_va_ndata
    global input_va_nc
    global input_va_ngs
    input_va_name=tk.StringVar()
    input_va_ndata=tk.StringVar()
    input_va_nc=tk.StringVar()
    input_va_ngs=tk.StringVar()
    frame_1.pack(pady=0,fill='both')
    frame_2.pack(pady=0,fill='both')
    frame_3.pack(pady=0,fill='both')
    frame_4.pack(pady=0,fill='both')
    tk.Label(frame_1,text="请输入测量的变量符号:",font=("黑体",20)).pack(side='top',padx=0)
    #设置输入框
    tk.Entry(frame_1,width=100,relief='flat',textvariable=input_va_name).pack(fill='both')
    tk.Label(frame_2,text="请输入各变量对应的标准不确定度:",font=("黑体",20)).pack(side='top',pady=0)
    tk.Entry(frame_2,width=100,relief='flat',textvariable=input_va_ndata).pack(fill='both')
    tk.Label(frame_3,text="请输入各变量对应的平均值:",font=("黑体",20)).pack(side='top',pady=0)
    tk.Entry(frame_3,width=100,relief='flat',textvariable=input_va_nc).pack(fill='both')
    tk.Label(frame_3,text="请输入公式:",font=("黑体",20)).pack(side='top',pady=0)
    tk.Entry(frame_3,width=100,relief='flat',textvariable=input_va_ngs).pack(fill='both')
    tk.Button(root_3,text="确认数据",font=('黑体',15),relief='flat',bg='#449d44',command=newwind_2)
    root_3.mainloop()
def newwind_2():
    str_=input_va_name.get().replace(',',',').replace(' ',',')
    lst_1=symbols(str_)
    lst_2=eval(input_va_ndata.get().replace(',',',').replace(' ',','))
    lst_3=eval(input_va_nc.get().replace(',',',').replace(' ',','))
    dic_1={}
    dic_2={}
    for i in range(len(lst_1)):
        dic_2[lst_1[i]]=lst_3[i]
    dic_2[symbols('PI')]=pi
    #函数表达式
    f_raw=input_va_ngs.get()
    f=sympify(f_raw)
    #函数求值
    f_=f.subs(dic_2)
    print(f_)
    av_1=0
    for i in range(len(lst_1)):
        av_1+=(diff(f,lst_1[i]).subs(dic_2)*lst_2[i])**2
    #计算出标准不确定度
    data_=sqrt(av_1)
    print(data_)
    E_2=data_/f_
    print(E_2)
    winNew=tk.Toplevel(root_3)
    winNew.geometry('800x330')
    winNew.title('结果')
    frame_1=tk.LabelFrame(winNew)
    frame_1.pack(pady=0,fill='both')
    tk.Label(frame_1,text="数据的平均值为:{}".format(f_),font=("黑体",20)).pack(side='top',pady=0)
    tk.Label(frame_1,text="数据的标准不确定度为:{}".format(data_),font=("黑体",20)).pack(side='top',pady=20)
    tk.Label(frame_1,text="数据的相对不确定度为:{}".format(E_2),font=("黑体",20)).pack(side='top',pady=40)
    btClose=tk.Button(winNew,text='关闭',font=('黑体',15),relief='flat',bg='#449d44',command=winNew.destroy)
    btClose.pack(side='top',pady=40,fill='both') 
def pduan():    
    #关闭窗口
    root_1.destroy()
    #判断接口
    num=num_int_var.get()
    if num==1:
        zhijie()
    else:
        jianjie()
#创建窗口
root_1=tk.Tk()
#设置窗口大小
root_1.geometry('800x130+200+200')
#设置标题
root_1.title("大物实验数据处理")
#设置标签框
choose_frame=tk.LabelFrame(root_1)
choose_frame.pack(pady=0,fill='both')
#设置可变变量
num_int_var=tk.IntVar()
#设置默认选项
num_int_var.set(1)
#设置选择按钮
tk.Radiobutton(choose_frame,text="直接计算法",variable=num_int_var,value=1).pack(side=tk.LEFT,padx=20)
tk.Radiobutton(choose_frame,text="间接计算法",variable=num_int_var,value=2).pack(side=tk.RIGHT,padx=20)
#设置可变变量
tk.Label(choose_frame,text="数据处理",font=("黑体",20)).pack()
tk.Button(root_1,text="点击进行数据处理",font=('黑体',15),relief='flat',bg='#449d44',command=pduan).pack(fill='both')

#让窗口持续展现
root_1.mainloop()   

大学物理实验数据分析不确定度的运算python_第1张图片

 大学物理实验数据分析不确定度的运算python_第2张图片

 大学物理实验数据分析不确定度的运算python_第3张图片

这是所呈现的界面,直接输入数据和公式即可 

你可能感兴趣的:(python)