基于Delphi的身高与体重模型分析.doc

上传人:h**** 文档编号:101755 上传时间:2018-07-06 格式:DOC 页数:13 大小:656.50KB
下载 相关 举报
基于Delphi的身高与体重模型分析.doc_第1页
第1页 / 共13页
基于Delphi的身高与体重模型分析.doc_第2页
第2页 / 共13页
基于Delphi的身高与体重模型分析.doc_第3页
第3页 / 共13页
基于Delphi的身高与体重模型分析.doc_第4页
第4页 / 共13页
基于Delphi的身高与体重模型分析.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、 基于 Delphi的身高与体重模型分析 一、概述 本 文 通过对一个人从小到大的身高好体重数据,建立模型,运用 Delphi7 软件对此人的身高和体重数据进行模型估计;分别进行了一元线性回归和指数回归分析,计算出回归系数和均方差。并利用得出的回归系数预测其体重的未来趋势。利用 Delphi7 实现了向 StringGrid导入数据、清空数据、删除某一单元数据以及向某一单元写入数据的功能,并实现了回归分析、预测和绘制关系图的功能,最后实现把绘制的关系图导入到 word 中来。 二、需求与功能分析 1、需求 利用 Delphi完成如 下功能: 1) 能够录入身高与体重数据并具有图形录入的界面;

2、2) 提供一元回归分析; 3)预测未来趋势; 4)绘制身高与体重的关系图; 5) 图形能够导入到 word 中。 2、功能分析 根据需求,首先学习 Delphi 的基本语法和窗口知识,为功能设计打下基础,然后根据需求对 各个模块进行设计: 1)录入功能和图形界面 向界面中加入 StringGrid1 组件 (负责数据存储) , 若干 Edit 组件、 Button 组件 两个 Edit 组件进行身高和体重的录入 实现 Edit 向 StringGrid1 导入数据 ,清空 StringGrid1 中的数据, 对 StringGrid1 中的单元进行写入和删除等功能 把 StringGrid1

3、中的数据导出和导入功能 2) 一元回归分析和预测功能 一元回归分析有线性回归和非线性回归两种,本程序采用一元线性回归和非线性回归中的典型回归方法指数回归进行回归分析 一元线性回归原理 一元线性回归是描述两个变量之间线性相关关系的最简单的回归模型 。 公式为: y a bx 其中 a 和 b 为回归系数 为了计算方便,以 误差的平方和最小 为标准确定回归模型: 利用 Q 对 a 和 b 作微分: 令微分方程为零(使总误差最小),解方程组得到 a 和 b 的计算式 : 2211( ) ( )nni i i iiiQ y y y a bx 112 ( )2 ( ( ) * )niiini i iiQ

4、 y a bxaQ y a bx xb 指数 回归原理 指数回归属于非线性回归, 其 模型为: , a 和 b 为回归系数,一般情况下,非线性回归都会转换成线性回归进行运算, 对公式两边取对数得到 ,令 lnlnYyAaBb可以利用前面描述的线性回归方法进行计算。 因此,对此功能的设计如下: 加入一个 RadioGroup 组件、 button 组件以及 Edit 组件若干 利用 RadioGroup 组件的 item 实现对回归方法的选择,并实现回归功能,把回归系数和均方差显示在 Edit 组件中 预测功能是在回归分析的基础上,输入身高值,对体重进行预测分析 。 3)绘制功能 针对前期在 S

5、tringGrid 中保存的数据和对其进行的回归分析,对原始数据和回归分析,分别绘制关系图, 以便于进行后期对比分析: 加入 Tchart 组件、 CheckListBox 组件和 button 组件 在 Tchart 组件中加入三个 Series 组件以便于绘制原始曲线以及一元线性回归和指数回归曲线 利用 CheckListBox 组件来确定对哪条曲线进行绘制。 4) 向 Word中导入图形 此功能需要把 Tchart 中的数据导入到 Word 中,首先需要把 Tchart 的曲线存储成为位图,然后根据 TImage 组件完成 Word 的导入 加入 WordAppliaction、 Wor

6、dDocument 以及 button 组件; 在 WordApplication 中需要实现对 Word 的连接判定; 在 WordDocument 组件中完成对 Image 图像的导入、存储和粘贴。 根据以上分析,得到总体的图形录入界面: 211 ( ) ( ) / ( ) nni i iiib x x y y x xa y bx bxy aeln lny a bx三、模块设 计与功能 根据以上功能分析将此程序分为四大模块: StringGrid 控制模块;回归分析和预测模块;绘制曲线模块以及向 Word 输出模块 1、 StringGrid控制模块 主要 功能有向 StringGrid1

7、 导入数据(导入)、 StringGrid1 清空(清空)、删除 StringGrid1某单元数据(删除)、向 StringGrid 某单元输入数据(写入)以及保存 StringGrid1 为文本文档(保存表格)和把文本文档导入到 StringGrid1 中(导入表格); 1)导入 主要功能:录入 身高和体重信息,身高的标准单位为 cm,体重的标准单位为 kg; 其实现代码如下: procedure TForm1.OnButton1Click(Sender: TObject); /录入 身高和体重数据 begin if (rowStringGrid1.RowCount) then begin

8、StringGrid1.Cells1,1:=身高 (cm); /第一行输出标题:身高和体重 StringGrid1.Cells2,1:=体重 (kg); StringGrid1.Cells1,row:= Edit1.Text; /第一列存储身高信息 StringGrid1.Cells2,row:=Edit2.Text; /第二列存储体重信息 row:=row+1; end else /当输入满时,编辑框不再能输入,并把行数置为初始值 begin Edit1.Enabled:=false; Edit2.Enabled:=false; row:=2; end; end; 实现形式如 图 1.1所示

9、。 2)清空 主要功能:清 空 StringGrid1 中的所有数据 实现代码如下: procedure TForm1.OnButton2Click(Sender: TObject); /清空 StringGrid1 中的数据 var i,j:Integer; begin for i:=0 to StringGrid1.ColCount-1 do begin for j:=0 to StringGrid1.RowCount-1 do begin StringGrid1.Cellsi,j:=; /数据清空 end; end; row:=2; / row 初始化 Edit1.Enabled:=tr

10、ue; /使 Edit 能够重新输入数据 Edit2.Enabled:=true; end; 实现形式如图 1.2所示。 3)删除 功能描述:完成删除 StringGrid1 中某一单元的数据 实现代码如下: procedure TForm1.OnButton6Click(Sender: TObject); /删除选定单元格中的数据 var i,j:Integer; begin i:=StringGrid1.Col; /获取选定单元格的行数和列数 j:=StringGrid1.Row; StringGrid1.Cellsi,j:=; end; 实现形式如初 1.3所示。 4)写入 功能描述:完

11、成对 StringGrid 某一单元数据的写入 实现代码如下: procedure TForm1.OnButton9Click(Sender: TObject); /向选定的单元格写入 数据 var i,j:Integer; begin i:=StringGrid1.Col; /获取选定单元格的行数和列数 j:=StringGrid1.Row; if(i=1)then StringGrid1.Cellsi,j:=Edit1.Text else StringGrid1.Cellsi,j:=Edit2.Text; end; 实现形式如图 1.4所示。 5)保存表格 功能:把 StringGrid1

12、 中的数据保存到 d 盘下的 123.txt 文件中 实现代 码如下: procedure TForm1.SaveStringGrid(StringGrid1: TStringGrid; const FileName: TFileName); /将 StringGrid 的数据保存为文本文档 var f: TextFile; i,j:Integer; begin AssignFile(f, FileName); /新建并打开文件 Rewrite(f); /创建一个新文件 f 并打开它 with StringGrid1 do /with 的使用 begin /写入 StringGrid 的行数和

13、列数 Writeln(f, ColCount); Writeln(f, RowCount); for i := 1 to ColCount - 1 do for j := 1 to RowCount - 1 do Writeln(F, Cellsi, j); /写入 StringGrid 的元素 end; CloseFile(F); /关闭文件 end; procedure TForm1.OnButton3Click(Sender: TObject); /调用过程把 StringGrid1 中的数据保存到 d:123.txt中 begin SaveStringGrid(StringGrid1,

14、 d:123.txt); end; 6)导入表格 功能描述: 把 d:123.txt中的数据导入到 StringGrid1 中 实现代码如下: procedure TForm1.LoadStringGrid(StringGrid1: TStringGrid; const FileName: TFileName); var f: TextFile; iTmp,i,j: Integer; strTemp: String; begin AssignFile(f, FileName); /新建并打开文件 Reset(f); /以只读的方式打开文件 with StringGrid1 do begin R

15、eadln(f, iTmp); /获取列数 ColCount := iTmp; Readln(f, iTmp); /获取行数 RowCount := iTmp; for i := 1 to ColCount - 1 do /向 StringGrid 中读入数据 for j := 1 to RowCount - 1 do begin Readln(f, strTemp); /获取元素 Cellsi, j := strTemp; end; end; CloseFile(f); /关闭文件 end; procedure TForm1.OnButton4Click(Sender: TObject);

16、/调用过程把 d:123.txt中的数据导入到 StringGrid1 中 begin LoadStringGrid(StringGrid1, d:123.txt); end; 实现形式如 1.5所示。 7)附加功能 功能描述:对 Edit1 和 Edit2 的输入进行控制,只能输入数字和小数点 代码实现: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); /限制编辑框的输入,只接收数字 begin if not(key in0.9,#8,.)then begin key:=#0; messagebeep(1); e

17、nd; end; 图 1.1 导入 图 1.2 清空 图 1.3 删除 图 1.4 写入 图 1.5 导入表格 2、回归分析和预测模块 根据 功能分析中提到的一元线性回归和指数回归的模型,编程实现回归分析和对体重的预测; 功能实现:实现对 StringGrid1 中的数据进行线性回归和一元指数回归分析,并把回归系数和均方差输出到 Edit 组件中 ;给定身高值,对体重值进行预测。 代码实现: procedure TForm1.RadioGroup1Click(Sender: TObject); /回归计算 var height: array0.10 of double; /身高值 weight

18、1: array0.10 of double; /体重值 weight2: array0.10 of double; /体重值对数,为了进行指数回归 u1: array0.10 of double; /中间变量 u2: array0.10 of double; /中间变量 v: array0.10 of double; /中间变量 y: array0.10 of double; /回归结果 / s: array0.10 of double; a,b,s,sumu1,sumv,sumu2,sumheight,sumweight2,sumweight1,avgheight,avgweight1,a

19、vgweight2:double; /中间变量 j,k:Integer; begin sumu1:=0.0; /中间变量的初始化 sumu2:=0.0; sumv:=0.0; sumheight:=0.0; sumweight1:=0.0; sumweight2:=0.0; s:=0; j:=2; if(jStringGrid1.RowCount) then /获取 StringGrid1 中的身高和体重值 begin for k:=0 to 10-1 do begin heightk:=strtoint(StringGrid1.Cells1,j); weight1k:=strtoFloat(

20、StringGrid1.Cells2,j); weight2k:=ln(weight1k); j:=j+1; end; end; for k:=0 to 10-1 do /根据公式对中间变量进行计算 begin sumheight:=sumheight+heightk; sumweight1:=sumweight1+weight1k; sumweight2:=sumweight2+weight2k; end; avgheight:= sumheight/10; avgweight1:= sumweight1/10; avgweight2:= sumweight2/10; for k:=0 to

21、 10-1 do begin u1k:=(heightk-avgheight)*(weight1k-avgweight1); u2k:=(heightk-avgheight)*(weight2k-avgweight2); vk:=sqr(heightk-avgheight); sumu1:=sumu1+u1k; sumu2:=sumu2+u2k; sumv:=sumv+vk; end; if radiogroup1.ItemIndex=0 then /如果选中第一项,则进行一元线性回 归 begin b:=sumu1/sumv; a:=avgweight1-(b*avgheight); for

22、 k:=0 to 10-1 do begin yk:=a+b*heightk; s:=s+sqr(yk-weight1k); /s 代表一元线性回归的均方差 end; end else /进行指数回归 begin b:=sumu2/sumv; A:=avgweight2-(b*avgheight); a:=exp(A); for k:=0 to 10-1 do begin yk:=a*exp(b*heightk); s:=s+sqr(yk-weight1k); /s 代表指数回归的均方差 end; end; Edit3.Text:= floattostr(a); /把回归系数 a、 b 和均方

23、差 s 显示在 Edit3、 Edit4、 Edit5 中 Edit4.Text:= floattostr(b); Edit5.Text:= floattostr(s); end; procedure TForm1.OnButton7Click(Sender: TObject); /对体重进行预测 var x,y:double; begin x:=strtofloat(Edit6.Text); /输入身高值 if radiogroup1.ItemIndex=0 then /线性回归预测结果 begin y:= strtofloat(Edit3.Text)+strtofloat(Edit4.Te

24、xt)*x; end else /指数回归预测 begin y:= strtofloat(Edit3.Text)*exp(strtofloat(Edit4.Text)*x); end; Edit7.Text:=floattostr(y); /把预测结果写入 Edit7 中 end; 实现结果如 2.1、 2.2 所示,从结果中可以看出指数回归跟实际值比较接近,均方差较小 ,线性预测的结果跟实际值偏离也较大 (仅仅针对输入的这组数据)。 2.3 一元线性 回归和 预测结果 2.2 指数 回归和 预测结果 3、绘制关系图 根据 StringGrid1 中的数据以及回归分析的结果,绘制出身高与体重的

25、关系曲线,并把三条曲线在 Tchart 中显示出来。 功能描述:绘制原始点图、一元线 性拟合和指数拟合图,并把结果保存到 d 盘下的“体重曲线 .bmp”中 代码实现: procedure TForm1.OnButton5Click(Sender: TObject); /绘制关系图 var height: array0.10 of double; /身高数组,作为 x 轴 weight: array0.10 of double; /体重数组,作为 y 轴 y1: array0.10 of double; /一元线性拟合后的体重值,作为 y 轴 y2: array0.10 of double;

26、/指数拟合后的值,作为 y 轴 j,k:Integer; begin j:=2; if(jStringGrid1.RowCount) then /获取 StringGrid1 中的身高和体重值 begin for k:=0 to 10-1 do begin heightk:=strtofloat(StringGrid1.Cells1,j); weightk:=strtoFloat(StringGrid1.Cells2,j); j:=j+1; end; end; / my_chart.ClearChart(); my_chart.AddSeries(series1); /增加 Series1、

27、Series2、 Series3 把三幅图显示在my_chart 中 my_chart.AddSeries(Series2); my_chart.AddSeries(Series3); /对 CheckListBox1 中是否被 选中进行判定,哪一个被选中画哪一条曲线 if CheckListBox1.Checked0 then /画 StringGrid1 中身高与体重点图 begin for k:=0 to 10-1 do series1.AddXY(heightk,weightk); end else begin Series1.Active:=False; /没有选中则不显示该曲线 end; if CheckListBox1.Checked1 then /一元线性拟合图,需要先进行线性拟合,获取Edit3 和 Edit4 中的回归系数 begin for k:=0 to 10-1 do begin y1k:= strtofloat(Edit3.Text)+strtofloat(Edit4.Text)*heightk; series2.AddXY(heightk,y1k) end; end else begin Series2.Active:=False;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。