[关闭]
@smallcatx0 2018-04-18T01:07:44.000000Z 字数 3858 阅读 1846

直接测量实验的不确定度的计算

编程解决生活中的问题


作 者:smallcatx0;
谨以此文献给 绵阳师范学院 物理学14.1/2班的同学们
转载的同学请注明原链接 http://blog.heykui.cn/index.php/archives/77/

0. 前言

做测量类实验时,计算不确定度往往是个很麻烦的事情。

而我们可以编写一个小程序来解决这个小麻烦,此次我用这个例子来介绍下aardio这个国产的开源编程工具

1 aardio介绍

什么是aardio?

aardio 专用于桌面软件快速开发,开发环境仅 6.5 MB, 绿色软件解压即用 - 无论个人或企业都可以永久免费使用本软件开发商用、或非商用的应用程序。使用aardio开发的软件不需要放置鸣谢链接、不需要声明使用aardio开发。
--摘自官方的简介

aardio有什么特点?

2 准备工作

先从官网下载aardio
解压就可以用了(可以花点时间浏览下aardio的快速入门教程

打开软件,新建一个窗口程序,然后拖一波控件

aardio拖控件

在右边的属性里修改各个控件的大小、颜色、字体等属性

属性页面

3 分析逻辑(别急着上来就写代码)

显然,3个文本框里有两个是数据输入框,一个数据输出框。

此程序的逻辑无非就是

程序主体逻辑如下:

  1. // 获取输入框原始数据(字符串)
  2. var inputStr = mainForm.inData.text;
  3. // 将字符串处理成单个数据(数组)
  4. var arrData = getData(inputStr);
  5. // 获取仪器最小刻度
  6. var dt = mainForm.dt.text;
  7. // 将数据拿去计算
  8. var res = calc(arrData,dt);
  9. // 算完后显示
  10. showRes(res);

4 开始撸代码(根据逻辑分析)

4.1 获取输入原数据

这一条代码就能获取到文本框中的文本数据(得到的是一个字符串)

  1. // 将mainForm窗体里的
  2. // 名称为inData的控件的 text(这里指文本框里的内容)
  3. // 赋值给局部变量inputStr
  4. var inputStr = mainForm.inData.text;

这时可能就有人会问了:我要在哪里写入这行代码呢?并且怎么看我是否获取到了输入框中的数据呢?

下面我就简单的讲一下,事件触发 以及如何调试程序

比如,这个小程序的事件逻辑就是:
用户输入完数据(输入框失去焦点) -> 就将输入的数据存到数组里
用户用鼠标单击了计算按钮 -> 就将数组中的数据计算出来,并显示到结果框

而最简单的鼠标单击事件,只需要在设计窗口双击某个控件

双击计算按钮

比如我现在双击计算按钮,就自动调整到代码页面,并且为我们自动生成了计算按钮鼠标单击事件的监听函数

代码页面

(ps:想回到设计模式只需要点上面的设计视图,或者按快捷键ctrl+u

一起来测试一下这个东东能不能正常工作(写任何代码,在还不是非常熟悉时,都建议每写一个功能就先测试下。避免200行代码,199个Error这种尴尬的情况):

在代码页面第一行写: import console;(不解释,想了解的去看官方的文档
然后在刚才生成的单击事件监听函数内写入
console.log("你点我干啥?") 如图:

测试鼠标单击函数

点上面的运行按钮,或按F5

运行效果

运行效果如图,说明我们的程序计算按钮的鼠标单击正常。

到这里,同学们是否还记得我们刚才讲到的获取输入内容
现在你可以试下将哪行代码写到这个单击监听函数中并将内容用console.log() 控制台输出看看了

  1. mainForm.button.oncommand = function(id,event){
  2. var inputStr = mainForm.inData.text;
  3. console.log(inputStr);
  4. }

运行:

运行效果

此时,我们便获取到了输入框中的源数据

【补】刚才只讲了鼠标单击事件怎么绑定
再贴一个控件失去焦点的事件监听函数,其他的事件可以去这里查看

  1. // mainForm窗口内的名称为inData的控件的失去焦点监听函数
  2. mainForm.inData.wndproc = function(hwnd,message,wParam,lParam){
  3. if(message = 0x0008){//光标焦点离开
  4. // 事件处理代码
  5. }
  6. //无返回值则继续调用默认回调函数
  7. }

4.2 数据的处理

上面我某已经获得了输入的字符串,现在我们要将获得的字符串解析成数组以方便计算

  1. // 解析字符串(以逗号分隔的),返回数组
  2. function getData(inputStr){
  3. // 为了支持中文和英文逗号,我们先将所有中文逗号都替换成英文逗号。
  4. var sTemp = string.replace(inputStr,",",",");
  5. // 用英文逗号分隔字符串,获得输入的数据(数组)
  6. var arrData = string.split(sTemp,",");
  7. return arrData;
  8. }

写完记得测试一下(ps:console.log()只能输出字符串、整数、浮点数等直接储存的东西,要在控制台输出数组或对象等指针变量,请用console.varDump());

此时我们便得到了输入的每个数据(存在数组里)

4.3 计算

拿到了输入的每个数据后,我们下一步做什么呢?

答: 计算

那不确定度到底怎么算呢?

A类不确定度

B类不确定度

根据上图,写代码。

  1. // 计算
  2. function calc(arrData,dt) {
  3. var Data = {
  4. arr = arrData ; // 原数据
  5. arrCount = 0; // 原数据的个数
  6. sum = 0; // 总和
  7. avr = 0; // 平均值
  8. sigma = 0; // 标准差
  9. uA = 0; // A类不确定度
  10. uB = 0; // B类不确定度
  11. U = 0; // 合成标准不确定度
  12. };
  13. var arrDataCount = 0;
  14. // 计算总和
  15. for index in arrData{
  16. // 统计数据的个数
  17. arrDataCount ++;
  18. Data.sum += arrData[index];
  19. }
  20. // 计算平均值
  21. Data.avr = Data.sum/arrDataCount;
  22. Data.arrCount = arrDataCount;
  23. // 计算标准差
  24. var temp = 0;
  25. for index in arrData{
  26. temp += (arrData[index] - Data.avr)*(arrData[index] - Data.avr)
  27. }
  28. Data.sigma = math.sqrt(temp/(arrDataCount-1));
  29. // A类标准不确定度
  30. Data.uA = Data.sigma/math.sqrt(Data.arrCount);
  31. // 判断是否需要计算B类不确定度
  32. if(dt != null){
  33. // 计算B类不确定度
  34. Data.uB = dt/math.sqrt(3);
  35. // 计算合成标准不确定度
  36. Data.U = math.sqrt(Data.uA*Data.uA+Data.uB*Data.uB);
  37. }else {
  38. Data.U = Data.uA;
  39. }
  40. return Data;
  41. }

当然写好了后我们还是要测试一下再往下走

4.4 输出计算结果

这个比较简单
只需要将你需要显示的内容拼接成字符串
再将其赋值给显示控件的text属性
mainForm.calcRes.text = "你想显示的任何内容"

代码如下:

  1. // 结果的显示
  2. function showRes(res){
  3. var resStr = "您输入的数据是:";
  4. for(i=1;#res.arr;1){
  5. resStr += res.arr[i]+' ';
  6. }
  7. resStr += '\n'
  8. resStr += "数据个数:" + res.arrCount +' | ';
  9. resStr += "总和:" + res.sum + ' | ';
  10. resStr += "平均数:" + res.avr + '\n';
  11. resStr += "标准差:" + res.sigma +'\n';
  12. resStr += "A类标准不确定度:" + res.uA + '\n';
  13. if(res.uB == 0){
  14. resStr += "未提供仪器最小刻度,无法估算B类不确定度!" + '\n';
  15. resStr += "标准不确定度:" + res.U ;
  16. }else {
  17. resStr += "B类不确定度:" + res.uB+'\n';
  18. resStr += "合成标准不确定度:" + res.U;
  19. }
  20. // 显示的代码与获取的代码刚好相反
  21. mainForm.calcRes.text = resStr;
  22. }

运行调试:

5 打包发布

做好了后直接点发布或者F7


完整代码:在我的码云

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注