Matlab基于GUI误差分析与数据处理.docx
- 文档编号:11189778
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:40
- 大小:688.05KB
Matlab基于GUI误差分析与数据处理.docx
《Matlab基于GUI误差分析与数据处理.docx》由会员分享,可在线阅读,更多相关《Matlab基于GUI误差分析与数据处理.docx(40页珍藏版)》请在冰豆网上搜索。
Matlab基于GUI误差分析与数据处理
2011-2012学年的计算机辅助分析的课程设计。
笔者花了好几个星期的课余时间,将其初略的完成了。
这段时间里可以说是现学现用,因为笔者所学的Matlab课程中没有设计到GUI的相关内容。
正是如此,整个设计中难免会有差错,或者说是理解不深的地方。
还是希望那些要借鉴此设计的朋友甄选辨别一下,再做决定。
整个设计尚不完善,还在进一步的修改中。
今笔者将其上传。
本来有个源文档,很是占页数。
因为里面程序较多。
笔者想了一下,大无上传的必要。
这些程序就算复制下来,也不能单独运行,传上来反而增加大家阅读的负担。
所以将打印稿传至XX文库,供大家参考。
课程名称:
计算机辅助分析
设计题目:
基于GUI的误差分析
院系:
电气工程系
专业:
电子信息工程
年级:
2010级
姓名:
XXX
学号:
XXXX
指导教师:
XXXX
西南交通大学峨眉校区
2011年12月16日
第一章摘要
关于GUI(GraphicalUserInterface)
图形用户界面,是指采用图形方式显示的计算机操作用户界面。
与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。
Matlab整个系统中集成了大量的GUI函数,这些函数与Matlab本身兼容良好,调用极为方便。
同时,用户亦可通过编程创建新的GUI函数,这样大大拓展了Matlab的GUI的创造力。
Matlab的工程师们为了用户编程方便提供了一个简便易用的GUI工具,GUIDE(向导)。
GUIDE本身就是一个GUI程序,用于帮助用户直观快速的生成控件的基本代码。
每当用户向GUIDE界面增添控件后,点击运行,便可自动生成与控件相关的程序,减少不必要的书写。
这样使每个初学GUI的朋友快速上手!
本次课程设计,笔者是依靠GUIDE来完成窗口函数的建立的。
程序功能简介
此次编写的程序功能简单,主要针对一维数据,对它们求和、求均值、求A类不确定度、B类不确定度、直接合成不确定度以及间接测量合成不确定度。
用户输入数据时,会根据这些数据绘制原始数据的直角坐标连线图,方便查看数据的变化趋势。
用户可以从Excel表格中导入数据,进行相应的计算;也可以将计算好的数据以表格的形式输出到Excel文件中。
计算过程中会产生各种量的更替,这些更替可以保存到*.datM文件中,在下次进行计算时可直接导入。
如果不需要数据可以先将此状态文件导入,再输入数据或者导入数据,这样先前*.datM中的数据将被覆盖,但是相应的设置未变。
处理关系复杂的数据时可以将计算分成多个部分,依次处理。
数据输入或计算好后可以进行简单的绘图。
程序特点(架构):
现阶段所完成的程序是一个底层,后续的设计将会在这个底层基础上建立模型及库文件,这些模型或库可以描述各种各样数据结构的表格。
这样只需花少量的人力和时间,在文本文档中用易懂的语言描述表格的特征,导入软件就可以实现对这类表格的数据处理。
关键词:
GUI误差分析Excel表格状态导出状态载入绘图模型库
第二章想法的提出
笔者向来热爱物理,更喜欢动手实验。
来到大学之前,一直认为大学将给每个学子以一个更为开放和自由的环境。
可是让人失望的是依旧有许许多多的无奈。
而这种种无可奈何中,又以实验最为让人无奈。
我本无心于对制度指指点点,又提不出任何有建设性的方案。
但对于实验,我确实极为不满,不得不抱怨一下。
实验目的是在于发掘事物间的规律。
实验可以发现一些问题,透过这些问题,我们或可发现规律,或可检验理论,或可掌握知识,或可培养兴趣。
而笔者现在所做过的那么多的大学实验(电路,物理,模电),没有哪个是完完全全的投入精神和时间去完成的!
倒是在平日的时间里,笔者自己用有限的材料和器材完成的探索和实验让笔者兴趣百倍,记忆深刻。
平时的实验冲忙而又浮躁,还有各种制约。
要那样要这样,不要那样不要这样,必须写实验报告,必须计算结果,必须是这个结果,不准迟到,不准乱动仪器……
实验早就成为了一种负担,笔者大部分的可用课余时间都被满纸的实验报告占据,有时还为实验数据(结果)处理焦头烂额。
这种情况不仅仅是出现在笔者一个人身上。
我们大家都不得不去做那些得花一个小时抄报告还弄不清楚上边是什意思的实验。
用身边朋友调侃的话来说,不是每个人都有这样历经高考磨难,交了钱来做这种实验的机会,我们该庆幸啊!
在这种情况下,笔者果断地将Matlab的大作业定为了——误差分析与数据处理。
主要还是因为这个课程设计若完成,在笔者一直没有鼓起勇气逃离制度的情况下,还是非常有用的,至少处理数字型的实验可以派上用场。
二来,能在误差分析方面更深入了解一些,这些知识在今后的工程工作中大有用处。
这个课题大的方面就已经确定好了。
细想一下,只做误差分析和数据处理好像内容过于单调。
加之,要是做一个完完全全依赖于Matlab的程序,这样也不太好用。
如果将这个程序放在一个独立的界面上运行的话,就可以称之为一个小型的简易数据处理软件,这样既便于使用,也更加独立,通用性更强。
于是笔者将题目定为了“基于GUI的误差分析和数据处理”。
除此之外,还有个原因,笔者确实对面向对象的编程饶有兴趣,希望能够找到机会学习,而现在机会来了!
课程设计由此展开,到后来这个程序的复杂程度渐渐增大,时间又紧迫,一方面课程设计需要在第十六周之前完成;另一方面,期末已至,这学期笔者花在课外的时间较多,预习兼复习的任务艰巨。
所以在只勉强完成了“误差分析”的功能后,没有更多的时间去完成更多的功能。
若以后能腾出时间,必要好好将程序完善。
第三章
相关设想
程序及界面(不设置运行数据模型):
Excel表格文件:
读入和保存为表格文件;界面美化:
窗口背景,按钮图标;
多窗口:
依靠主窗口可产生其他副窗口;工具栏:
有一些快捷的工具按钮
提示音:
错误时有提示声音;数据自动保存
不改变已知表格的数据数据校检(可略)
界面输入数据图像输出和保存
数据模型:
考虑单位变换求和、求均值、A类不确定度、B类不确定度
设置最为基本的模型结构,在无加载模型的情况下使用
该模型下的文件输出,输出工作状态和计算结果
库(写出基本库:
密立根油滴和偏振光研究,电阻、电压、电流关系等)模型
B类不确定度的置信因子:
正态分布、均匀分布和三角分布
A类不确定度的扩展倍数(设置初始值1(不能为空))
计算A类不确定度计算B类不确定度计算直接合成不确定度
计算间接测量合成不确定度区分表达式的属性(加减还是乘除)
计算函数关系计算相对误差将计算好的结果覆盖到源数据所在位置
其他细节:
完善帮助文档、完善错误提示、优化窗口结构、光标的指示说明
注:
红色标注的表示尚未实现的功能或想法,其他的都是或多或少完成了的。
2011-12-14
第四章需要解决的问题:
1程序功能方面
什么是面向对象?
什么是GUI?
Matlab的GUI怎么用?
怎么学习Matlab的GUI?
应该用怎样的结构来描述尽可能多的表格,和表格中数据的计算?
(程序设计的核心)
怎么控制程序获得对象数据的起始和终结地址?
行或列的数据读取方向(变量的取值方向)怎么确定?
计算结果的个数?
计算结果的存放在何处?
图像该怎么标注一些文字?
模型名称怎么控制?
变量在程序中的名称如何控制?
变量的个数怎么知道?
变量单位的转换(+-*/(关系式略))如何获得?
怎么转换这个单位?
表头文字的单位问题绘图的图像变量范围怎么确定?
计算的常量(如固定光的波长,固定频率,测量温度)怎么获得?
获得了怎么处理?
各个量的函数关系怎么建立?
函数的变量怎么获得数值?
2数据结构方面:
什么是细胞?
什么是结构体?
Matlab有哪些的数据结构?
怎么建立细胞变量?
怎么获得细胞的行列数?
怎么调用细胞的数据?
怎么调用细胞里的细胞?
怎么建立结构体变量?
什么是域?
怎么调用结构体变量中的域?
什么是类?
什么是对象?
该怎么安排数据的类?
怎么让变量可以被所有函数调用和修改?
全局变量的建立和删除怎么用?
退出GUI时如何把全局变量中的值清空?
什么是符号变量?
怎么申明符号变量?
怎么将符号变量用具体数值代换计算结果?
怎么将字符串转换成符号变量?
怎么将符号变量变成字符串?
怎么求偏导?
符号运算怎么调用函数?
3控件方面:
怎么设置uitable的行列值?
怎么设置uitable不可编辑?
如何读取uitable的内容?
当uitable的数值发生改变时,怎么获取改变位置?
怎么让uitable显示数字和文本?
怎么删除uitable的某行或某列?
怎么关闭一个开启的窗口?
绘图时怎么连接两个点?
怎么用极坐标绘图?
怎么调整网格线的疏密程度?
怎么将图片放置到剪切板?
剪切板怎么调用?
为什么背景图遮挡住其他控件?
怎么解决这个问题?
怎么设置窗口的最大最小化?
怎么显示其他图标?
怎么让窗口置顶?
在buttongroup中怎么获取两个radiobutton的状态?
怎么Group的创建选择函数?
4函数的使用:
怎么用matlab提取字符串中的数字?
什么是正则表达式?
他有什么作用?
语法规则是怎么样的?
怎么添加超链接?
怎么调用对话框?
怎么利用程序(函数)复制文件?
什么是中断?
eval函数怎么用?
eval函数左边可以获得结果吗?
怎么设置控件的字体?
时钟(定时器)怎么回事?
怎么设置?
怎么在定时器中断时调用书写好的中断响应函数?
怎么用Matlab生成独立的可执行文件?
怎么获取当前工作路径?
Matlab如何检查非当前目录下某文件是否存在?
怎么读取Excel文件?
怎么将文件保存为Excel?
怎么读取图片文件?
怎么显示图片?
怎么读取声音文件?
怎么播放声音?
第五章
过程(思路和方法)
1GUI学习
1-IGUI架构(向导)
(打印稿略,详见原稿)
1-II基本控件:
•Select:
用来指示在GUIDE中控件的选中状态。
严格意义上说它不是一个独立的控件;
•PushButton:
命令按钮,其作用是对用户的鼠标单击操作做出反应并触发相应的操作,其上的文本标识按钮的名称(下同);
•ToggleButton:
切换按钮,又称开关按钮,通过鼠标点击它有两种状态,压下和复原,对应触发两种不同的操作;
•RadioButton:
单选按钮,一般都是成组出现的,具有互斥的性质,即同组单选按钮中只能有一个是被选中的。
当单选按钮处于选择状态时,会在圆圈中显示一个黑色实心圆;
•CheckBox:
复选框,通常用来标示一种选择状态,可以有选中、不选中两种状态;当一个选择框处于选择状态时,在小方框内会出现一个“√”;
•StaticText:
静态文本,用于在GUI中显示特定的标识文本;
•EditText:
文本编辑框,用户可在其中输入文本;
•Slider:
滚动条,包括三个独立的部分,分别是滑槽、滑块和滑槽两端的箭头;使用该控件,用户可以沿着滚动槽拖动滑块来选择一个值;一般用于滚动其它控件,比如列表框、文本框等;
•Panel:
面板,用于将其它控件分组,面板内的控件将成为面板的子对象;可以给面板设定自己的名称和边界;
•ButtonGroup:
按钮组,类似于面板,但通常只用于容纳一组互斥的单选或切换按钮;
•Listbox:
列表框,其内容一般是一组选项的列表,用户可以从列表中进行选择一项或多项;
•Pop-upMenu:
弹出式菜单,当鼠标点击箭头时,会弹出一组互斥的选项清单,供用户选择其中的一项;
•Axes:
坐标轴,可以在其中绘制二维或三维图形。
1-III控件属性设置:
(打印稿略,详见原稿)
1-IV控件回调函数(CallbackRoutine)
•回调函数是指对控件施加一个动作时被执行的函数(对应一段程序),例如鼠标点击按钮,或用鼠标移动滚动条的滑块等。
经常用到的回调函数有:
•1)BusyAction:
回调中断响应函数。
当控件的另一个回调函数正在执行时,又对此控件有触发动作,对此动作的相应处理,它属于一种中断响应。
有两种选项:
即Cancel(取消中断事件)和queue(排队),后者为默认设置。
•2)ButtonDownFcn:
当在控件周围5个像素范围内按下鼠标键时执行的回调函数。
•3)CallBack:
与控件密切相关的标准回调函数,实现的功能因控件的不同而有不同的定义。
当对控件施加标准的动作时,执行该函数。
•4)CreateFcn:
在创建对象过程中执行的回调函数。
•5)DeleteFcn:
在删除对象过程中执行的回调函数。
•6)Interruptible属性:
指定当前的回调函数在执行时是否允许中断,去执行其它的函数。
2数据结构:
2-I细胞矩阵
细胞矩阵(或细胞数组)中不同位置(细胞)可有不同数据类型,这就使得它不同于只能由数
字组成的数字矩阵和只能由字符串组成的文本矩阵。
所以,一个细胞矩阵可以包含比如一个
字符串、两个数字和一个细胞矩阵。
细胞矩阵也可象数字矩阵一样有多维的。
对于一维细胞
矩阵,也类似于数字矩阵,称为细胞向量。
有三种方法来创建一个细胞矩阵。
第1种方法是使用大括号,‘{}’,就象用中括号‘[]’
来创建数字矩阵一样;第2种方法是对细胞进行逐一赋值,称为细胞赋值;第3种方法是创建
一个大小合适的空矩阵。
矩阵中所有的行必须要有相同的细胞数。
2-II结构体变量(见课本82页)
结构体变量与细胞相似,都是用于存放不同类型的文件。
但是结构体的数据结构和调用方式更为灵活其限制更少,扩展性更强。
结构体的数据都存放在一个叫“域”的数据结构中,用户通过使用域名就可存入和取出数据。
2-III局部变量和全局变量
1.局部(Local)变量
存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围仅限于该函数本身。
2.全局(Global)变量
通过global指令,matlab也允许几个不同的函数空间以及基本工作空间共享同一个变量,即全局变量。
每个希望共享全局变量的函数或matlab基本工作空间,必须逐个用global对具体变量加以专门定义。
否则将无权享用全局变量。
如果某个函数的运作使全局变量的内容发生了变化,那么其他函数空间以及基本工作空间中的同名变量也就随之变化。
除非与全局变量联系的所有工作空间都被删除,否则全局变量将一直存在。
2-IVGUI中的类、对象:
GUI中每种控件是一个类,这个类有许许多多的属性,如坐标的大小,背景,按钮的图标等。
窗口本身也是一个类,如果我们将某个类的具体的属性给出,如让按钮是蓝色,大小为12*12,这样就使一个类具体化了,这样就是实例化了一个类,这就生成了一个对象。
GUI的编程完全是基于这样一个思想的。
3选择数据的构造方式及选择编程方法
笔者希望编写的程序能够处理多样的实验表格。
所以先对表格进行了抽象概括,以期从格式各样的表格中提取出共性,将这些共性转化成一个固定的可扩展的数据结构。
这样就可以在脱离软件编译器的情况下,用一些更为自然的语言描述出某一类的表格的特征。
若实现了这个功能,也就意味着我们只需要少量的人员花费少量的时间对某类表格进行描述,然后导入程序中运行,就可以处理同类表格的不同数据(像计算不确定度,绘图等)。
通过这种方式就完全可以建立起一个库文件,如大学物理所有需要进行数值处理的实验的库。
同学们做完实验,只需要将数据填入表格里,然后加载模型文件,再将具体的实验数据导入,点击处理即可生成想要的结果。
这个结果又可通过程序导出到表格文件中去。
3-I第一种想法:
依据数据层次建立数据结构,当时写了一个模型的样本文件如下:
%1标准模型配置
%2子可叶制作
%3
%4
%5
%6
%7
%8
%9
%10
Standard_mode%模型名称
0%控制模式0——关闭数据的读取;1——打开
3%模型数据级数
{}%各级数在该模型文件中的跳转位置及其对应关系
{}%结果量在该模型文件中的跳转位置及其对应关系
{}%常量及其名称
{}%常量附加量
%第一级数据属性
1%变量级数
2%变量个数
{}%变量在该文件中的跳转位置及其对应关系
{}%该级与上一级的链接在此文件中的位置
%此级对应变量属性
a%变量名
1%所在级数
0%真值
1%该级中的变量编号
.*1000%单位变换
{'sheet1''B2'}%变量第一个数据的位置
5%测量次数
{}%位置读取信息:
方向范围
{0''}%分布方式
{0''}%有效位
{0''}%A类置信因子
{0''}%B类置信因子
%该变量的计算信息
{0''0''}%求和:
开关变量名开关放置位置
{0''0''}%平均:
开关变量名开关放置位置
{0''0''}%A类标准不确定度
{0''0''}%B类标准不确定度
%一级与二级的连接
1%上级的数据模式:
0——读取;1——计算
0%结果输出标志位
{}%上级数据信息在此文件中的位置
{}%函数对应关系
{}%结果输出
%第二级数据属性
1%变量级数
2%变量个数
{}%变量在该文件中的跳转位置及其对应关系
{}%该级与上一级的链接在此文件中的位置
%此级对应变量属性
a%变量名
1%所在级数
0%真值
1%该级中的变量编号
.*1000%单位变换
{'sheet1''B2'}%变量第一个数据的位置
5%测量次数
{}%位置读取信息:
方向范围
{0''}%分布方式
{0''}%有效位
{0''}%A类置信因子
{0''}%B类置信因子
%该变量的计算信息
{0''0''}%求和:
开关变量名开关放置位置
{0''0''}%平均:
开关变量名开关放置位置
{0''0''}%A类标准不确定度
{0''0''}%B类标准不确定度
%二级与三级的连接
1%上级的数据模式:
0——读取;1——计算
{}%上级数据信息在此文件中的位置
{}%函数对应关系
%第三级数据属性
1%变量级数
2%变量个数
{}%变量在该文件中的跳转位置及其对应关系
{}%该级与上一级的链接在此文件中的位置
%此级对应变量属性
a%变量名
1%所在级数
0%真值
1%该级中的变量编号
.*1000%单位变换
{'sheet1''B2'}%变量第一个数据的位置
5%测量次数
{}%位置读取信息:
方向范围
{0''}%分布方式
{0''}%有效位
{0''}%A类置信因子
{0''}%B类置信因子
%该变量的计算信息
{0''0''}%求和:
开关变量名开关放置位置
{0''0''}%平均:
开关变量名开关放置位置
{0''0''}%A类标准不确定度
{0''0''}%B类标准不确定度
%三级与四级的连接
1%上级的数据模式:
0——读取;1——计算
{}%上级数据信息在此文件中的位置
{}%函数对应关系
3-II第二种想法:
依据表格中的数据位置进行构造
由于时间仓促未能有机会编写这种思路的模型文件,笔者认为,这种算法更为方便,条理更为清晰。
我们将一个表格的实验数据填写好之后,进行相应的计算时确实是依照这种方式来完成的。
比如一个表格中,第二行是电压值,第三行是电流值,第四行是待求解的电阻值。
这个实验的过程是控制电压值,来观测电流值的变化,从而找出电压与电流的关系。
动手计算时,我们当然知道怎样来计算出第四行的所有数据,因为我们能分清楚电流与电压的关系,知道表格中哪些是电压,哪些是电流值。
测量次数
1
2
3
4
5
6
总和
平均值
A类
B类
直接合成
间接合成
U(V)
1
2
3
4
5
6
I(mA)
0.5
1.02
1.49
2.05
2.51
2.98
R(KO)
我们是如何办到的呢?
我想是依靠我们的‘库’,从小到大,我们接触过各种各样的名称、定义、计算方式、思考方法。
所以像这样一个实验,我们可以清楚直接的知道这就是伏安法测电阻,这个实验所填的表格每行每列所代表的意义我们也都清楚。
所以要是计算几组数据不是什么难事!
但是要让你处理几百个量的‘伏安法测电阻’的数据,恐怕就不是那么容易了。
笔者要做的就是将这个计算过程提炼出来,转化成计算机的语言,让计算机来替我们处理复杂的运算,减少我们重复的劳动。
3-III比较一二两种算法:
第一种算法:
统计出变量的层次和级次,在建立各个级次之间的关系,非常的抽象,对程序编写来说困难极大,对库文件的建立者来说也极为困难。
而且很多层级间的关系非常难以描述。
第二种算法:
是以一个时间顺序来完成的,我们对某些变量进行计算处理时,不关心这个数据到底在整个实验表格中是什么层次,我们只关心它在表格中的位置,以及它和其他量通过函数计算后放置的位置。
在计算过程中可以产生各种临时变量。
我们一样只关心它经过函数变换后要放到那里去,以怎样的方式放置。
这个过程可以描述如下:
计算中,我们先计算哪些值,放在某处,再计算表格中已有的数值,在某个位置取得这些值,结果又再放在表格的某些地方。
后续的程序编写均是基于第二个算法来完成的。
库文件结构的建立确实是个非常困难的事情,所以现在并未完成。
但是这个底层的搭建在逐步的完善。
4窗口界面的建立和界面的完善及程序的编写和调试
整个程序的编写,笔者选用的是先建窗口再写程序的方法。
当编写某个功能时,先建立界面或控件,再写控制程序。
在某个功能已经差不多实现的基础上再继续实现其他功能。
以下的图片是界面的建立过程:
起初,笔者选择了两个uitable,一个Axes,panel,Edit和text几类控件
根据经验,下侧和右侧作为输入,左侧和上侧做输入更符合习惯。
菜单设置完成后,加入了背景,按钮图标等后,运行:
(打印稿略,详见原稿)
菜单编辑:
(打印稿略,详见原稿)
uitable有输入和输出两种,Axes用来绘图。
进一步完善:
(打印稿略,详见原稿)
实验和调试:
(打印稿略,详见原稿)
加入设置副窗口:
(打印稿略,详见原稿)
增加数据导出后,计算结果生成的Excel表格:
增加数据导入后:
(打印稿略,详见原稿)
导入时的进度条:
(打印稿略,详见原稿)
增加各种提示、警告窗口:
(打印稿略,详见原稿)
最后修改了快速绘图的设置界面,编写创建了‘关于’窗口(用了火狐的Icon):
(打印稿略,详见原稿)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 基于 GUI 误差 分析 数据处理