基于大学物理实验后数据处理庞大的计算量,为了不想再手敲计算器,于是编写
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()
这是所呈现的界面,直接输入数据和公式即可