VBA程序源代码
- 格式:rtf
- 大小:43.31 KB
- 文档页数:8
VBA程序源代码
'###########################################
'# 北师大实验中学----研究性学习 #
'# 研究成绩波动规律的拟合程序 #
'# Module1主模块部分 #
'# 李博昱编译 #
'# 2007年5月-6月 #
'###########################################
'加 ' 的文字均为本程序的注释
(1)常量的设定
'1、常量e,表示自然对数底
'2、num,表示参与拟合的考试次数,这里取前7次考试成绩
'3、cen,三角拟合时,角度所乘系数中心值,详见原理介绍
'4、le,三角拟合精度,详见原理介绍
'5、un,三角拟合角度系数的偏离值,详见原理介绍
'6、StuNumber,学生容量,这里取2008届高二年级组学生总人数
Public Const e = 2.71
Public Const num = 7
Public Const le = 100
Public Const cen = 1
Public Const un = 0.99
Public Const StuNumber = 534
(2)辅助函数的介绍
'本部分共计运用辅助函数5个,
'每个辅助函数的功能均在其上方注释,
'函数内部的运算原理见代码区内部
'1、StuMark,获取学生成绩
'参变量:
'StuNum,整型变量,表示学生代号
'ExamNum:整型变量,表示考试代号,取值为1-7
'SubNum:整型变量,表示科目代号,取值为1-5
Public Function StuMark(StuNum As Integer, ExamNum As Integer, SubNum As Integer)
As Double
'Select结构对ExamNum进行讨论
Select Case ExamNum
Case 1
StuMark = Sheet1.Cells(StuNum + 1, SubNum + 8)
Case 2
StuMark = Sheet2.Cells(StuNum + 1, SubNum + 8)
Case 3
StuMark = Sheet3.Cells(StuNum + 1, SubNum + 8)
Case 4 StuMark = Sheet4.Cells(StuNum + 1, SubNum + 8)
Case 5
StuMark = Sheet5.Cells(StuNum + 1, SubNum + 8)
Case 6
StuMark = Sheet6.Cells(StuNum + 1, SubNum + 8)
Case 7
StuMark = Sheet7.Cells(StuNum + 1, SubNum + 8)
Case 8
StuMark = Sheet8.Cells(StuNum + 1, SubNum + 8)
End Select
End Function
'2、FitFunc,代表拟合函数的形式,由此和真实值进行线性拟合,详见原理部分
'参变量:
'k:角度系数值,详见原理部分
'j:学生代号
Function FitFunc(k, j) As Double
Dim X
X = Sheet10.Cells(3, j) / k
FitFunc = Tan(X)
End Function
'3、FindFit,线性拟合函数
'变量
'xx:x的离均差平方和
'xy:x,y的离均差的成绩之和
'avx,x的均值
'avy,y的均值
'StuNum,整型变量,同前
'SubNum,同前
Function FindFit(xx, xy, avx, avy, StuNum As Integer, SubNum As Integer)
Dim b
b = xy / xx '由此式确定线性拟合中x的一次项系数
Sheet12.Cells(StuNum + 1, 2 * SubNum) = b
Sheet12.Cells(StuNum + 1, 2 * SubNum + 1) = avy - b * abx
FindFit = 0
End Function
'4、TestMod检验模型
Function TestMod(StuNum As Integer, SubNum As Integer, k, avy)
Dim a, b
a = Sheet12.Cells(StuNum + 1, 2 * SubNum + 1)
b = Sheet12.Cells(StuNum + 1, 2 * SubNum)
Sheet13.Cells(StuNum + 1, 2 * SubNum) = b * FitFunc(k, 8) + a + avy Sheet13.Cells(StuNum + 1, 2 * SubNum + 1) = Sheet8.Cells(StuNum + 1, SubNum + 8)
TestMod = 0
End Function
'5、AppFunc 应用模型
'通过已建立的模型,计算指定次考试中的预期值
Function AppFunc(StuNum As Integer, SubNum As Integer, ExamNum As Integer, k, avy)
Dim a, b
Dim M
M = StuMark(StuNum, ExamNum, SubNum)
If M = 0 Then
AppFunc = 0
Else
a = Sheet12.Cells(StuNum + 1, 2 * SubNum + 1)
b = Sheet12.Cells(StuNum + 1, 2 * SubNum)
AppFunc = Abs((M - (b * FitFunc(k, ExamNum) + a + avy)) / M)
End If
End Function
(3)Module1的主程序CalR
'功能:
'计算线性拟合时,角度系数的最佳值
'这部分程序时本次研究性学习的核心部分
'具体运算过程见其中注释
Sub CalR()
'变量定义区
Dim i, k, avy, avx, xy, xx, yy, avd
Dim j As Integer
Dim mm, mn
'几个数组的定义
Dim Y(1 To num)
Dim X(1 To num)
Dim DY(1 To num)
Dim stNum As Integer
Dim subN As Integer
Dim g(-le To le)
Dim Q
'拟定初始值
subN = 1
'开始循环结构
'共计循环近700万次
'总共用时10-20分钟
For subN = 1 To 5
For stNum = 1 To StuNumber avy = 0
avd = 0
'子循环结
'计算学生平均相对成绩
For j = 1 To num
Y(j) = StuMark(stNum, j, subN)
avy = avy + Y(j) / num
Next j
'子循环结
'计算学生平均相对成绩离均差
For j = 1 To num
DY(j) = Y(j) - avy
avd = avd + DY(j) / num
Next j
'开始循环,寻找角度系数的最佳取值
For i = -le To le
avx = 0
xx = 0
yy = 0
xy = 0
k = cen + i / (le / un) 'k即使角度系数
For j = 1 To num
X(j) = FitFunc(k, j)
avx = avx + X(j) / num
Next j
'计算线性相关系数
For j = 1 To num
xy = xy + (X(j) - avx) * (DY(j) - avd)
xx = xx + (X(j) - avx) ^ 2
yy = yy + (DY(j) - avd) ^ 2
Next j
g(i) = Abs(xy / (Sqr(xx) * Sqr(yy)))
If i = -le Then
mm = g(-le)
mn = k
Else
If g(i) > mm Then
mm = g(i)
mn = k
End If
End If
'判定线性相关系数取极大值时角度系数的值
Next i
Sheet11.Cells(stNum + 1, 2 * subN) = mm