什么是正交试验分析方法设计和主成分分析

上传用户:tuujncepne资料价格:5财富值&&『』文档下载 :『』&&『』所属分类:机构:黑龙江烟草公司有限公司绥化卷烟厂分类号:F426.8文献出处:关 键 词 :&&&&&&权力声明:若本站收录的文献无意侵犯了您的著作版权,请点击。摘要:在经济实力及设备工艺均较落后的卷烟工业企业中,产品质量和原料消耗尤为显得重要。本文在充分利用实验数据以及双因素回归分析、主成分分析和正交试验等分析实验手段的基础上,研究了卷烟某些物理指标间的内在关系及它们在产品质量和原料消耗两个方面的总体表现形式,给出了主要影响因素的控制位级,通过烟支含水率与烟丝含水率的线性关系及烟丝含水率能够有效可控,探索出了通过控制主要影响因素有效降低原料消耗的重要途径。Abstract:In the cigarette industrial enterprise with the economic strength and equipment technology, the product quality and the material consumption are particularly important. This paper in making full use of experimental data and two factor regression analysis, principal component analysis and orthogonal experiment analysis of experimental methods on the basis of the intrinsic relationship between some physical indexes of cigarette and in the quality of the products and raw materials consumption form the total performance of the two aspects, are the main factors affecting the control level, the cigarette moisture content and moisture of cigarette rate of linear relationship and the moisture of cigarette rate can be effectively controlled, to explore the main influence factors through effectively reducing the consumption of raw materials is an important way.正文快照:本文基于充分发挥试验或检验数据的作用,充分挖掘质量指标间的内在关系及其在产品质量和卷烟原料消耗方面的总体表现形式,凸显主要影响因素在产品质量及原料消耗方面所起的作用,通过有效控制与主要影响因素有着良好线性关系的可控变量达到降低卷烟原料消耗的目的。1确定影响分享到:相关文献|试验设计与数据分析试题A_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
试验设计与数据分析试题A
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢主成分分析与方差最大化正交旋转程序设计
声明:任何人可以修改此代码并个人无偿使用此程序,但不得商用,否则将追究法律责任。此文中包含大量共性程序模块,希望有志于统计学程序代码国产化的同仁与我协作,其它大量代码将来适当时机会公开,最后将以教材方式与大家见面。
Option Explicit
Const PI = 3.
Public deltaVr As Double
Public Times As Long:
'''************************************************************************
'''EingenValues() As Double特征根向量 ByVal nx As Integer,特征根数目 _
mainrate As Double返回主要特征根和点迹的比例
'''************************************************************************
Function EingenValuesStat(EingenValues() As Double, ByVal nx As
Integer, _
mainrate As Double) As Integer '''返回主要特征根数目
&&& Dim i As
&&& Dim sum As
Double, Summain As Double
&&& sum = 0:
Summain = 0
&&& For i = 1 To
sum = sum + EingenValues(i)
&&& For i = 1 To
Summain = Summain + EingenValues(i)
mainrate = Summain / sum
If mainrate & 0.85 Then
&&&&&&&&&&&
EingenValuesStat = i
&&&&&&&&&&&
Exit Function
End Function
'''************************************************************************************
''''''countCompoScore主成分得分计算程序
'''v() As Double特征向量, x() As Double观察值, ByVal nx As Integer观察值指标数,
nsamples As Integer观察值样本数, ByVal nv As Integer特征向量个数, score() As
Double得分
'''ave()平均值,用于标准化& v()是列向量
'''var()方差,用于标准化
'''iscorrelation as boolen是否是相关阵结果
'''************************************************************************************
Function countCompoScore(v() As Double, x() As Double, ByVal nx
As Integer, _
nsamples As Integer, ByVal nv As Integer, score() As Double,
&&& ave() As
Double, var() As Double, ByVal isCorrelation As Boolean) As
&&& Dim i As
Integer, j As Integer, k As Integer
isCorrelation Then '''相关阵分析结果
For i = 1 To nsamples
&&&&&&&&&&&
For j = 1 To nv
&&&&&&&&&&&&&&&
score(i, j) = 0
&&&&&&&&&&&&&&&
For k = 1 To nx
&&&&&&&&&&&&&&&&&&&
score(i, j) = score(i, j) + (x(i, k) - ave(k)) / var(k) * v(k,
&&&&&&&&&&&&&&&
&&&&&&&&&&&
'''协离差阵分析结果
For i = 1 To nsamples
&&&&&&&&&&&
For j = 1 To nv
&&&&&&&&&&&&&&&
score(i, j) = 0
&&&&&&&&&&&&&&&
For k = 1 To nx
&&&&&&&&&&&&&&&&&&&
score(i, j) = score(i, j) + x(i, k) * v(k, j)
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& End If
End Function
'''********************VerticalCircumgyrate********************************************
'''a() As Double特征向量数组,& ByVal m As Integer a的行数,
ByVal L As Integer& a 的列数
''' right& 方差最大化正交旋转变换 主控程序
'''************************************************************************************
Sub VerticalCircumgyrate(a() As Double, ByVal m As Integer, ByVal L
As Integer)&&&
'''use fore data
&&& Const eps =
0.0001 '''精度要求,可修改,主控程序
&&& Times =
&&& Dim i, j,
J1, j2, k As Long
&&& Dim row,
column As Long
&&& ReDim h(m)
varj(L) As Double
&&& Dim var,
lastvar As Double: var = 0
&&& Dim sum22,
sum2 As Double
lastvar = var
For i = 1 To m
&&&&&&&&&&&
For i = 1 To m
&&&&&&&&&&&
For j = 1 To L
&&&&&&&&&&&&&&&
h(i) = h(i) + a(i, j) * a(i, j)
&&&&&&&&&&&
&&&&&&&&&&&
h(i) = VBA.Sqr(h(i))
'MsgBox "h(I)"
For j = 1 To L
&&&&&&&&&&&
sum22 = 0: sum2 = 0
&&&&&&&&&&&
For i = 1 To m
&&&&&&&&&&&&&&&
sum22 = sum22 + (a(i, j) / h(i)) ^ 4
&&&&&&&&&&&&&&&
sum2 = sum2 + (a(i, j) / h(i)) ^ 2
&&&&&&&&&&&
&&&&&&&&&&
' MsgBox "sum22= " & sum22
&&&&&&&&&&
' MsgBox "sum2= " & sum2
&&&&&&&&&&
' MsgBox "m= " & m
&&&&&&&&&&&
varj(j) = sum22 / m - sum2 ^ 2 / m / m
&&&&&&&&&&&
var = var + varj(j)
&&&&&&&&&&
' MsgBox "var(" & J & ")= "
'MsgBox lastvar & "& "
& Var '''right
For J1 = 1 To L
&&&&&&&&&&&
For j2 = J1 + 1 To L
&&&&&&&&&&&&&&&
VCrotation a, h, J1, j2, m, L '''USE VCrotation
&&&&&&&&&&&
Times = Times + 1
'MsgBox "times= " & times
&&& Loop Until
VBA.Abs(var - lastvar) & eps
'''********************VCrotation********************************************
'''a() As Double, h() As Double, ByVal J1 As Long, ByVal j2 As
&&& ByVal m As
Integer a的行数, ByVal L As Integer& a 的列数
''' right&&
方差最大化正交旋转变换从 程序
'''**************************************************************************
Private Sub VCrotation(a() As Double, h() As Double, ByVal J1 As
Long, ByVal j2 As Long, _
&&& ByVal m As
Integer, ByVal L As
Integer)&&&&
'''从 程序
&&& Dim i, j, k
&&& ReDim U(m),
v(m), aj1(m), aj2(m) As Double
&&& Dim e, F, c,
d, kapa, tan4kapa, y, x, sin, cos As Double
&&& For i = 1 To
aj1(i) = a(i, J1)
aj2(i) = a(i, j2)
&&& e = 0: F =
0: c = 0: d = 0
&&& For i = 1 To
U(i) = (a(i, J1) / h(i)) ^ 2 - (a(i, j2) / h(i)) ^ 2
v(i) = 2 * ((a(i, J1) / h(i)) * (a(i, j2) / h(i)))
e = e + U(i)
F = F + v(i)
c = c + U(i) * U(i) - v(i) * v(i)
d = d + U(i) * v(i) * 2
&&& y = (d - 2 *
e * F / m)
&&& x = (c - (e
* e - F * F) / m)
&&& If x = 0
If y & 0 Then kapa = PI / 8 Else If y
& 0 Then kapa = -1 * PI / 8
tan4kapa = y / x
kapa = VBA.Atn(tan4kapa) / 4
If x & 0 Then
&&&&&&&&&&&
If y &= 0 Then kapa = kapa + PI / 4 Else kapa = kapa
&&& End If
&&& 'MsgBox "y="
"&& x=" & x
& "&& kapa="
VBA.sin(kapa)
VBA.cos(kapa)
&&& For i = 1 To
a(i, J1) = aj1(i) * cos + aj2(i) * sin
a(i, j2) = aj1(i) * sin * -1 + aj2(i) * cos
'本模块已经修改完 陈庭木
'''***********************************************************************************
'''矩阵乘法,同时处理向量与向量,向量与矩阵间,矩阵与矩阵间乘法运算
'''a() As Double,前矩阵
'''ByVal MA As Integer, ByVal NA As Integer 前矩阵规格
''' b() As Double,后矩阵
'''ByVal MB As
Integer,&&&
ByVal NB As Integer 后矩阵规格
'''RESULT() As Double 结果矩阵
chentingmu&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'''向量当作特别二维数组,方便几类方法的融合,不可用一维数组表示(会越界)
'''***********************************************************************************
Function m_mult(a() As Double, ByVal MA As Integer, ByVal NA As
Integer, b() As Double, ByVal MB As Integer, _
&&& ByVal NB As
Integer, RESULT() As Double) As
Boolean&& '''right
&&& Dim i As
Long, j As Long, k As Long ''' CTM,重新修正,能处理行向量或列向量.
&& MB Then '''不合要求
m_mult = False
Exit Function
&&& ElseIf MA =
1 And NA & 1 And MB & 1 And NB = 1
Then '''a为行向量,b为列向量
Dim T As Double: T = 0
For i = 1 To NA '''RIGHT
&&&&&&&&&&&&&&&
T = T + a(1, i) * b(i, 1)
RESULT(1, 1) = T
m_mult = True
&&& ElseIf MA
& 1 And NA = 1 And MB = 1 And NB & 1
Then '''a为列向量,b为行向量
For i = 1 To MA
&&&&&&&&&&&
For j = 1 To NB
&&&&&&&&&&&&&&&
RESULT(i, j) = a(i, 1) * b(1, j)
&&&&&&&&&&&
m_mult = True
&&& ElseIf MA =
1 And NA & 1 And MB & 1 And NB
& 1 Then '''a为行向量,b为普通矩阵
For i = 1 To NB '''RIGHT
&&&&&&&&&&&
RESULT(1, i) = 0
&&&&&&&&&&&
For j = 1 To MB
&&&&&&&&&&&&&&&
RESULT(1, i) = RESULT(1, i) + a(1, j) * b(j, i)
&&&&&&&&&&&
m_mult = True
&&& ElseIf MA
& 1 And NA & 1 And MB
& 1 And NB = 1 Then '''a为普通矩阵,b为列向量
For i = 1 To MA
&&&&&&&&&&&
RESULT(i, 1) = 0
&&&&&&&&&&&
For j = 1 To NA
&&&&&&&&&&&&&&&
RESULT(i, 1) = RESULT(i, 1) + a(i, j) * b(j, 1)
&&&&&&&&&&&
m_mult = True
&&& ElseIf MA
& 1 And NA & 1 And MB
& 1 And NB & 1 Then
'''a,b均为普通矩阵
For i = 1 To MA '''RIGHT
&&&&&&&&&&&
For j = 1 To NB
&&&&&&&&&&&&&&&
RESULT(i, j) = 0
&&&&&&&&&&&&&&&
For k = 1 To NA
&&&&&&&&&&&&&&&&&&&
RESULT(i, j) = RESULT(i, j) + a(i, k) * b(k, j)
&&&&&&&&&&&&&&&
&&&&&&&&&&&
m_mult = True
&&& End If
End Function
'''======================================================
'''函数名:jcb2
'''功能描述:对称矩阵求特征值,jacobii 过关法 陈庭木 right
'''输入参数:a&& 指向存放对称矩阵的指针
'n 矩阵阶数
'U 返回的特征值
'eps 精度要求,用于判断元素是否为0
'itmax 最大迭代次数
'''返回值:整型。运行成功则返回1,失败则返回0
'=========================================================
&Function jcb2(ByRef a() As Double, ByVal n As
Integer, ByRef U() As Double, _
&&&&&&&&&&&&&&&&
ByVal eps As Double, ByVal itmax As Integer) As Long
&&& Dim i, j, P,
Q, it, flag As Long
&&& Dim sint,
cost, sin2t, cos2t, tmp, R, t1, T2, t3 As Double
&&& R = 0#
&&& For i = 2 To
For j = 1 To i - 1
&&&&&&&&&&&
R = R + a(i, j) * a(i, j)
&&& R = 2# *
R&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 求出初始的r
&&& it = 0
&&& Do While
((it & itmax) And (R & eps))
it = it + 1
Do While (flag = 1)
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
For i = 2 To
n&&&&&&&&&&&&&&&
''' 寻找大于r的非对角线元素
&&&&&&&&&&&&&&&
For j = 1 To i - 1
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
tmp = Abs(a(i, j))
&&&&&&&&&&&&&&&&&&&
If (tmp & R) Then
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
P = i: Q = j
&&&&&&&&&&&&&&&&&&&&&&&
j = i: i =
n&&&&&&&&&&&&&&&
''' 找到第一个,终止扫描
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
If (P = 0)
Then&&&&&&&&&&&&&&&&&&&&&&
''' 没有大于r的非对角线元素,此次扫描完成
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
sint = 2 * a(P, Q)
&&&&&&&&&&&&&&&
cost = a(Q, Q) - a(P, P)
&&&&&&&&&&&&&&&
sin2t = sint / (Sqr(sint * sint + cost * cost)) ''' 计算sin(2
&&&&&&&&&&&&&&&
If (cost & 0#) Then sin2t = -sin2t
&&&&&&&&&&&&&&&
cos2t = Sqr(1# - sin2t * sin2t)
&&&&&&&&&&&&&&&
sint = sin2t / (Sqr(2 * (1# + cos2t)))& '''
计算givens矩阵元素
&&&&&&&&&&&&&&&
cost = Sqr(1# - sint * sint)
&&&&&&&&&&&&&&&
tmp = a(P,
P)&&&&&&&&&&&&&&&&&
''' 相似变换
&&&&&&&&&&&&&&&
t1 = tmp * cost * cost
&&&&&&&&&&&&&&&
T2 = a(Q, Q) * cost * cost
&&&&&&&&&&&&&&&
t3 = a(P, Q) * sin2t
&&&&&&&&&&&&&&&
a(P, P) = t1 + a(Q, Q) - T2 - t3
&&&&&&&&&&&&&&&
a(Q, Q) = tmp - t1 + T2 + t3
&&&&&&&&&&&&&&&
a(P, Q) = 0#
&&&&&&&&&&&&&&&
a(Q, P) = 0#
&&&&&&&&&&&&&&&
For j = 1 To
n&&&&&&&&&&&&&&
''' 第p行和第q行的变换
&&&&&&&&&&&&&&&&&&&
If ((j && P) And (j
&& Q)) Then
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
tmp = a(P, j)
&&&&&&&&&&&&&&&&&&&&&&&
a(P, j) = tmp * cost - a(Q, j) * sint
&&&&&&&&&&&&&&&&&&&&&&&
a(Q, j) = tmp * sint + a(Q, j) * cost
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For i = 1 To
n&&&&&&&&&&&&
''' 用对称性可求得第p列和第q列
&&&&&&&&&&&&&&&&&&&
If ((i && P) And (i
&& Q)) Then
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
a(i, P) = a(P, i)
&&&&&&&&&&&&&&&&&&&&&&&
a(i, Q) = a(Q, i)
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& For i = 1 To
n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 计算特征值
U(i) = a(i, i)
&&& jcb2 =
&&& 'jcb2 = (it
itmax)&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 若it&itmax,则说明迭代成功
&End Function
'''======================================================
'''函数名:r_chdet
'''功能描述:求对称正定矩阵的行列式值 陈庭木 right
'''输入参数:mat(输入的矩阵) n(矩阵阶数) eps(精度)
'''返回值:矩阵的行列式值
'=========================================================
&Function r_chdet(ByRef mat() As Double, ByVal
n As Integer, ByVal eps As Double) As Double
&&& Dim i, j,
k, L, v As Integer
&&& Dim det As
cpmat(n, n) As Double ''' 将输入矩阵的内容拷贝一份,以免破坏
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
cpmat(i, j) = mat(i, j)
1#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 赋初值
&&& For k = 1 To
For j = 1 To k -
1&&&&&&&&&&&&&&&&&&&&&&&&&
''' 求出Lkk
&&&&&&&&&&&
cpmat(k, k) = cpmat(k, k) - cpmat(k, j) * cpmat(k, j)
If (cpmat(k, k) & eps)
Then&&&&&&&&&&&&&&&&&&&&&&
''' 判断矩阵是否为正定
&&&&&&&&&&&
MsgBox ("matrix is Not positive definite.!")
&&&&&&&&&&&
r_chdet = (0#)
&&&&&&&&&&&
Exit Function
cpmat(k, k) = Sqr(cpmat(k, k))
det = det * cpmat(k,
k)&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 更新det
For i = k + 1 To
n&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 求出Lik
&&&&&&&&&&&&&&&
For j = 1 To k - 1
&&&&&&&&&&&&&&&&&&&
cpmat(i, k) = cpmat(i, k) - cpmat(i, j) * cpmat(k, j)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
cpmat(i, k) = cpmat(i, k) / cpmat(k, k)
&&& det = det *
det&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 行列式值是det的平方
&&& r_chdet =
End Function
'''======================================================
'''函数名:r_mdet
'''功能描述:求实矩阵的行列式值 陈庭木right
'''输入参数:mat(输入的矩阵数组) n(矩阵阶数) eps(精度)
'''返回值:矩阵的行列式值
'=========================================================
&Function r_mdet(ByRef mat() As Double, ByVal n
As Integer, ByVal eps As Double) As Double
&&& Dim i, j, k,
iis, jjs, L, v As Integer
&&& Dim det,
flag, tmp, pivot As Double
cpmat(n, n) As Double
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
cpmat(i, j) = mat(i, j)
1#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 设置行列式值初置
&&& flag =
1#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 这个变量原来记录行列式值的符号
&&& For k = 1 To
''' 最多进行n-1次消去
0#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 选择主元
For i = k To n
&&&&&&&&&&&
For j = k To n
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
tmp = Abs(cpmat(i, j))
&&&&&&&&&&&&&&&&
If (tmp & pivot) Then
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
pivot = tmp
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&
If (pivot & eps)
Then&&&&&&&&&&&&&&&&&&&&&&&&
''' 如果找到的主元小于eps,则认为是0。
&&&&&&&&&&&&&&
0#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'''此时行列式值也是0。
&&&&&&&&&&&&&
r_mdet = (det)
&&&&&&&&&&&&&
Exit Function
If (iis && k)
Then&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 判断是否需要行交换
&&&&&&&&&&&
-flag&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 行交换一次,行列式值变号
&&&&&&&&&&&
For j = k To
n&&&&&&&&&&&&&&&&&&&
''' 进行行交换
&&&&&&&&&&&&&&&
tmp = cpmat(k, j)
&&&&&&&&&&&&&&&
cpmat(k, j) = cpmat(iis, j)
&&&&&&&&&&&&&&&
cpmat(iis, j) = tmp
&&&&&&&&&&&
If (jjs && k)
Then&&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 判断是否需要列交换
&&&&&&&&&&&
-flag&&&&&&&&&&&&&&&&&&&&&&&&&&&
''' 列交换一次,行列式值变号
&&&&&&&&&&&
For i = k To
n&&&&&&&&&&&&&&&&&&&&&&
''' 进行列交换
&&&&&&&&&&&
&&&&&&&&&&&&&
tmp = cpmat(i, k)
&&&&&&&&&&&&&
cpmat(i, k) = cpmat(i, jjs)
&&&&&&&&&&&&&
cpmat(i, jjs) = tmp
&&&&&&&&&&&
For i = k + 1 To
n&&&&&&&&&&&&&&
''' 进行消去
&&&&&&&&&&&&&&&
tmp = cpmat(i, k) / cpmat(k,
记录下此值,减少除法的次数
&&&&&&&&&&&&&&&
For j = k + 1 To
n&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
cpmat(i, j) = cpmat(i, j) - tmp * cpmat(k, j)
&&&&&&&&&&&&&&&
det = det * cpmat(k,
'''更新det的值
&&& det = flag *
det * cpmat(k, k)& ''' 最终更新det的值
&&& r_mdet =
End Function
'''======================================================
'''函数名:r_mrank&&
?????????????
'''功能描述:求实矩阵的秩
'''输入参数:mat(输入的矩阵) m(矩阵行数) p(矩阵列数) eps(精度)
'''返回值:运行成功则返回矩阵的秩,失败则返回0
'=========================================================
&Function r_mrank(ByVal mat As Range, ByVal m,
n As Integer, ByVal eps As Double) As Integer
&&& Dim i, j,
k, P, iis, jjs, L, v, rank As Integer
&&& Dim tmp,
pivot As Double
cpmat(m, n) As Double
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
cpmat(i, j) = mat(i, j)
& n Then P = m Else P =
n&&&&&&&&&&&&
''' 求出m和n中的较小者,即秩的最大值
&&& rank =
&&& For k = 1 To
0#&&&&&&&&&&&&&&&&&&&&
''' 选主元
For i = k To m
&&&&&&&&&&&
For j = k To n
&&&&&&&&&&&&&&&
tmp = Abs(cpmat(i, j))
&&&&&&&&&&&&&&&
If (tmp & pivot) Then
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&
pivot = tmp
&&&&&&&&&&&&&&&&&&&&&
i&&&&&&&&&&&&&&&&&&
''' 记录下主元的位置
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
If (pivot & eps)
Then&&&&&&&&&&&&&
''' 主元小于精度值时,认为高斯消元已经完成
&&&&&&&&&&&
r_mrank = (rank)
&&&&&&&&&&&
Exit Function
rank = rank +
1&&&&&&&&&&&&&&&&
''' 主元不为零,秩加1
If (iis && k)
Then&&&&&&&&&&&&
''' 判断是否需要进行行交换
&&&&&&&&&&&
For j = k To
n&&&&&&&&&&
''' 进行行交换
&&&&&&&&&&&
&&&&&&&&&&&&&&&&&
tmp = cpmat(k, j)
&&&&&&&&&&&&&&&&&
cpmat(k, j) = cpmat(iis, j)
&&&&&&&&&&&&&&&&&
cpmat(iis, j) = tmp
&&&&&&&&&&&
If (jjs && k) Then
&&&&&&&&&&&
For i = k To
m&&&&&&&&&&&&&
''' 进行列交换
&&&&&&&&&&&&&&&&&
tmp = cpmat(i, k)
&&&&&&&&&&&&&&&&&
cpmat(i, k) = cpmat(i, jjs)
&&&&&&&&&&&&&&&&&
cpmat(i, jjs) = tmp
&&&&&&&&&&&
For i = k + 1 To
m&&&&&&&&&&
&&&&&&&&&&
tmp = cpmat(i, k) / cpmat(k, k)&&
''' 减少除法的次数
&&&&&&&&&&&
For j = k + 1 To
&&&&&&&&&&&&&&&
cpmat(i, j) = cpmat(i, j) - tmp * cpmat(k, j)
&&&&&&&&&&&
&&& r_mrank =
End Function
'''======================================================
'''函数名:sdminv 陈庭木 right
'''功能描述:对称正定矩阵原地求逆
'''输入参数:mat 指向待分解的矩阵的指针
&'&&&&&&&&&&
n 矩阵阶数
'''返回值:整型。运行成功则返回1,失败则返回0
'=========================================================
Function sdminv(ByRef mat() As Double, ByVal n As Integer, ByVal
eps As Double) As Integer
&&& Dim i, j,
k As Integer
&&& Dim P, Q,
c() As Double
c(n)&& ''' 为临时变量分配空间并检查是否成功
&&& For k = 1 To
n&&&&&&&&&&&&&
''' 循环求解
P = mat(1, 1)
If (P & eps)
Then&&&&&&&&&&&&&&&&
''' 判断是否满足正定的条件
&&&&&&&&&&
MsgBox ("Fail to invert!")
&&&&&&&&&&
sdminv = (0)
&&&&&&&&&&
Exit Function
P&&&&&&&&&&&&&&&&&&&&
''' 将要进行的多次除法转化为乘法
For i = 2 To n - k + 1 ''' 求出矩阵下三角部分前n-k行的值
&&&&&&&&&&&
Q = mat(i, 1)
&&&&&&&&&&
c(i) = -Q * P
&&&&&&&&&&
For j = 2 To i
&&&&&&&&&&&&&&
mat(i - 1, j - 1) = mat(i, j) + Q * c(j)
&&&&&&&&&&
For i = n - k + 2 To
''' 求出矩阵下三角部分中第n-k行至第n-1行的值
&&&&&&&&&&
Q = mat(i, 1)
&&&&&&&&&&
c(i) = Q * P
&&&&&&&&&&
For j = 2 To i
&&&&&&&&&&&&
mat((i - 1), j - 1) = mat(i, j) + Q * c(j)
&&&&&&&&&&
mat(n, n) =
P&&&&&&&&&&&
''' 求出矩阵下三角部分中第n行的值
For i = 2 To n
mat(n, i - 1) = c(i)
&&& For i = 1 To
1&&&&&&&&&&
''' 依据对称性对矩阵的上三角部分进行赋值
For j = i + 1 To n
mat(i, j) = mat(j, i)
&&& sdminv =
End Function
Sub CompactTrans(ByRef R() As Double, ByVal n As Long, ByVal main_n
As Long) ''' 陈庭木
''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
紧凑变换 经验证正确,,工作量较大
&&& 'MsgBox "= "
&&& Dim i, j As
&&& Dim main,
mainrow(), maincolumn() As Double
mainrow(n), maincolumn(n)
&&& For i = 1 To
n '''read main row and column value
mainrow(i) = R(main_n, i)
maincolumn(i) = R(i, main_n)
&&& main =
R(main_n, main_n)
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
If i = main_n And j = main_n Then
&&&&&&&&&&&&&&&
R(i, j) = 1 / main
&&&&&&&&&&&
ElseIf i = main_n And j && main_n
&&&&&&&&&&&&&&&
R(i, j) = R(i, j) / main
&&&&&&&&&&&
ElseIf i && main_n And j = main_n
&&&&&&&&&&&&&&&
R(i, j) = R(i, j) / main * -1
&&&&&&&&&&&
&&&&&&&&&&&&&&&
R(i, j) = R(i, j) - mainrow(j) * maincolumn(i) / main
&&&&&&&&&&&
Sub partCompactTrans(R() As Double, m As Long, P As Long, main_n
As Long) '''部分紧凑变换
&&& Dim main,
mainrow(), maincolumn() As Double
&&& Dim i, j As
mainrow(m + P), maincolumn(m + P)
&&& For i = 1 To
mainrow(i) = R(main_n, i)
maincolumn(i) = R(i, main_n)
&&& main =
R(main_n, main_n)
&&& If main_n
For i = 1 To m + P '''除Ryy外
&&&&&&&&&&&
For j = 1 To m + P
&&&&&&&&&&&&&&&
If i &= m Or j &= m Then
&&&&&&&&&&&&&&&&&&&
If i = main_n And j = main_n Then
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = 1 / main
&&&&&&&&&&&&&&&&&&&
ElseIf i = main_n And j && main_n
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = R(i, j) / main
&&&&&&&&&&&&&&&&&&&
ElseIf i && main_n And j = main_n
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = R(i, j) / main * -1
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = R(i, j) - mainrow(j) * maincolumn(i) / main
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
For i = 1 To m + P '''Ryy
&&&&&&&&&&&
For j = 1 To m + P
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
If i & m And j & m Then
&&&&&&&&&&&&&&&&&&&
If i = main_n And j = main_n Then
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = 1 / main
&&&&&&&&&&&&&&&&&&&
ElseIf i = main_n And j && main_n
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = R(i, j) / main
&&&&&&&&&&&&&&&&&&&
ElseIf i && main_n And j = main_n
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = R(i, j) / main * -1
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
R(i, j) = R(i, j) - mainrow(j) * maincolumn(i) / main
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& End If
Function m_add(a() As Double, b() As Double, RESULT() As Double,
ByVal m As Long, ByVal n As Long) As
Boolean&& '''right
&&& Dim i, j As
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
RESULT(i, j) = a(i, j) + b(i, j)
&&&&&&&&&&&&&&
End Function
Function m_substruct(a() As Double, b() As Double, RESULT() As
Double, ByVal m As Long, ByVal n As Long) As Boolean '''right
&&& Dim i, j As
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
RESULT(i, j) = a(i, j) - b(i, j)
End Function
Function m_mult_k(a() As Double, ByVal k As Double, RESULT() As
Double, ByVal m As Long, ByVal n As Long) As Boolean '''
&&& Dim i, j As
&&& ReDim c(m,
n) As Double
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
RESULT(i, j) = a(i, j) * k
End Function
Function matrix_transpose(a() As Double, transpose() As Double,
ByVal m As Long, ByVal n As Long) As Range '''
&&& Dim i, j As
&&& For i = 1 To
For j = 1 To n
&&&&&&&&&&&
transpose(j, i) = a(i, j)
End Function
''以下为jacobi从程序 right
Private Sub jacobirotation(m() As Double, ByVal P As Long, ByVal Q
As Long, v() As Double, ByVal n As Long)&
''''????????????
&&& Dim g, h,
mpp, mqq, mpq, mpj, mqj, tempr, angle, c, S, cs, Csquared, Ssquared
&&& Dim j As
&&& Const PI =
nearzero = 0.
&&& mpp = m(P,
&&& mpq = m(P,
&&& mqq = m(Q,
If Abs(mpp - mqq) & nearzero Then
&&&&&&&&&&&
angle = Atn(2 * mpq / (mpp - mqq)) / 2
&&&&&&&&&&&
If angle & PI / 4 Then angle = angle - PI / 2
&&&&&&&&&&&
If mpq & 0 Then angle = PI / 4 Else angle = -PI /
' MsgBox p & "& "
& q & " angle=" &
c = cos(angle)
S = sin(angle)
Csquared = c ^ 2
Ssquared = S ^ 2
cs = c * S
tempr = 2 * mpq * cs
m(P, P) = mpp * Csquared + tempr + mqq * Ssquared
m(Q, Q) = mpp * Ssquared - tempr + mqq * Csquared
m(P, Q) = 0
m(Q, P) = 0
''''tau=s/(1+c)
For j = 1 To n
&&&&&&&&&&&
If j && P And j
&&&&&&&&&&&&&&&
mpj = m(P, j) * c + m(Q, j) * S
&&&&&&&&&&&&&&&
mqj = m(Q, j) * c - m(P, j) * S
&&&&&&&&&&&&&&&
m(P, j) = mpj
&&&&&&&&&&&&&&&
m(j, P) = mpj
&&&&&&&&&&&&&&&
m(Q, j) = mqj
&&&&&&&&&&&&&&&
m(j, Q) = mqj
&&&&&&&&&&&&
For j = 1 To n
&&&&&&&&&&&
g = v(j, P)
&&&&&&&&&&&
h = v(j, Q)
&&&&&&&&&&&
'MsgBox "g= " & g & ",h= "
&&&&&&&&&&&
v(j, P) = c * g + S * h
&&&&&&&&&&&
v(j, Q) = -S * g + c * h
'''*********************************************************************************************
'''CyclicJacobi
'''a() As Double方阵 EingenValues() As Double特征根, v() As
Double特征向量,& —
''' ByVal count As
Long最大迭代次数,&&&&
ByVal n As Long方阵除数
''' by 陈庭木&& right
'''*********************************************************************************************
Sub CyclicJacobi(a() As Double, EingenValues() As Double, v() As
Double, ByVal count As Long, _
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ByVal n As
'''jacobi主程序
tolerance = 0.
maxcount, selfcount, i, P, Q As Long
&&& Dim Sumsq,
avp(), avq() As Double
&&& ReDim avp(n,
n), avq(n, n)
&&& Dim success
As Boolean: success = False
&&& maxcount =
&&& selfcount =
&&& For P = 1 To
n '''特征向量初始化
For Q = 1 To n
&&&&&&&&&&&
v(P, Q) = 0
v(P, P) = 1
selfcount = selfcount + 1
For P = 1 To n ''主对角线元素平方和
&&&&&&&&&&&
Sumsq = Sumsq + a(P, P) * a(P, P)
'MsgBox "主对角线元素平方和=&& "
success = True
For P = 1 To n - 1 '''中心,JACOBI计算
&&&&&&&&&&&
For Q = P + 1 To n
&&&&&&&&&&&&&&&
If Abs(a(P, Q) / Sumsq) & tolerance Then
&&&&&&&&&&&&&&&&&&&
success = False
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
jacobirotation a, P, Q, v, n
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& Loop While
Not (success Or selfcount & maxcount)
&&& If success
For P = 1 To n
&&&&&&&&&&&
EingenValues(P) = a(P, P)
&&& End If
Function standardize(ByVal xyname As Range, ByVal samplesname As
Range, ByVal xy As Range) As Range
'''数据阵的标准化处理,*****************针对区域变量********************
&&& Dim i, j, k,
n_xy, n_samples, lastrow As Long
&&& Dim ave(),
var() As Double
&&& n_samples =
xy.Rows.count: n_xy = xy.Columns.count
'求比较数列内部方差值与平均值
&&& Dim sum,
sum2 As Double
&&& For j = 1 To
sum = 0: sum2 = 0
For i = 1 To n_samples
&&&&&&&&&&&
sum = sum + xy(i, j)
&&&&&&&&&&&
sum2 = sum2 + xy(i, j) * xy(i, j)
var(j) = VBA.Sqr((sum2 - sum * sum / nr) / (nr - 1)) 'var
ave(j) = sum / nr 'average value
&&& lastrow =
xy.Cells(1, 1).row + n_samples + 3
standard_xy As Range
standard_xy = Range(Cells(lastrow, 2), Cells(lastrow - 1 +
n_samples, n_xy + 1))
&&& 'count
standard value lable
&&& For i = 1 To
Cells(lastrow - 1, i + 1) = xyname(i)
&&& For i = 1 To
Cells(lastrow + i - 1, 1) = samplesname(i)
Cells(lastrow - 1, 1) = "无量纲化数据"
&&& For j = 1 To
For i = 1 To n_samples '''写值
&&&&&&&&&&&
standard_xy(i, j) = (xy(i, j) - ave(j)) / var(j)
standardize = standard_xy
End Function
Sub SORTEingenvaluesANDvectors(eig() As Double, vector() As Double,
ByVal tolarge As Boolean, _
&&& ByVal n As
Integer)&&&
'''特征根与特征向量数值排序
'''针对array变量 right
&&& Dim j, i,
k& As Long
&&& Dim maxroot,
maxI, minroot, minI, t1, T2, T() As Double
&&& If tolarge
Then '''从小至大
For j = 1 To n& '''冒泡法排序
&&&&&&&&&&&
minroot = eig(j): minI = j& '''赋初值
&&&&&&&&&&&
&&&&&&&&&&&
For i = j + 1 To n
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
If eig(i) & minroot Then&
&&&&&&&&&&&&&&&&&&&
minroot = eig(i): minI = i
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
'MsgBox "minroot=& " &
&&&&&&&&&&&
If minI && j Then
&&&&&&&&&&&&&&&
t1 = eig(minI): T2 = eig(minI):
&&&&&&&&&&&&&&&
eig(minI) =
eig(j):&&&
eig(minI) =
eig(j)&&&&
'''交换,最后元素赋给最大元素
&&&&&&&&&&&&&&&
eig(j) = t1: eig(j) = T2&&
'''最大元素赋给最后元素
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To n
&&&&&&&&&&&&&&&&&&&
T(k) = vector(k, j)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To n
&&&&&&&&&&&&&&&&&&&
vector(k, j) = vector(k, minI)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To n
&&&&&&&&&&&&&&&&&&&
vector(k, minI) = T(k)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
'''从大到小
For j = 1 To n '''冒泡法排序
&&&&&&&&&&&
maxroot = eig(j): maxI = j& '''赋初值
&&&&&&&&&&&
&&&&&&&&&&&
For i = j + 1 To n
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
If eig(i) & maxroot Then&
&&&&&&&&&&&&&&&&&&&
maxroot = eig(i): maxI = i
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&
' MsgBox "maxroot& =& "
&&&&&&&&&&&
If maxI && j Then
&&&&&&&&&&&&&&&
t1 = eig(maxI): T2 = eig(maxI)
&&&&&&&&&&&&&&&
eig(maxI) = eig(j): eig(maxI) =
eig(j)&&&&&
'''交换,最后元素赋给最大元素
&&&&&&&&&&&&&&&
eig(j) = t1: eig(j) = T2&&
'''最大元素赋给最后元素
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To n
&&&&&&&&&&&&&&&&&&&
T(k) = vector(k, j)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To n
&&&&&&&&&&&&&&&&&&&
vector(k, j) = vector(k, maxI)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To n
&&&&&&&&&&&&&&&&&&&
vector(k, maxI) = T(k)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& End If
'本模块已经修改完 陈庭木
'''**************************************************************************
'''简单相关计算程序&&&&&&&&&&&&&&&&&&&&&&&&&
'''xy() 原始数据,& nxy
变量个数,&& Nsamples观察值组数
'''ave() 均值 , var() 方差
'''**************************************************************************
Sub simple_r(xy() As Double, ByVal Nxy As Integer, ByVal nsamples
As Integer, _
&&& r0() As
Double, ave() As Double, var() As Double)
&&& Dim i, j, k
As Integer
&&& Dim sx As
Double, sx2 As Double, sy As Double, sy2 As Double, sxy As
&&& For i = 1 To
Nxy '''求简单相关系数
For j = i To Nxy
&&&&&&&&&&&
If i = j Then
&&&&&&&&&&&&&&&
r0(i, j) = 1
&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To nsamples
&&&&&&&&&&&&&&&&&&&
sx = sx + xy(k, i)
&&&&&&&&&&&&&&&&&&&
sx2 = sx2 + xy(k, i) * xy(k, i)
&&&&&&&&&&&&&&&&&&&
sy = sy + xy(k, j)
&&&&&&&&&&&&&&&&&&&
sy2 = sy2 + xy(k, j) * xy(k, j)
&&&&&&&&&&&&&&&&&&&
sxy = sxy + xy(k, i) * xy(k, j)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
r0(i, j) = (sxy - sx * sy / nsamples) / Sqr((sx2 - sx * sx /
nsamples) * (sy2 - sy * sy / nsamples))
&&&&&&&&&&&&&&&
r0(j, i) = r0(i, j)
&&&&&&&&&&&
&&& For i = 1 To
For k = 1 To nsamples
&&&&&&&&&&&
sx = sx + xy(k, i)
&&&&&&&&&&&
sx2 = sx2 + xy(k, i) * xy(k, i)
ave(i) = sx / nsamples
var(i) = Sqr((sx2 - sx ^ 2 / nsamples) / (nsamples - 1))
'''**************************************************************************
'''协方差计算程序&&&&&&&&&&&&&&&&&&&&&&&&&
'''xy() 原始数据,& nxy
变量个数,&& Nsamples观察值组数
'''**************************************************************************
Sub SP_XXY(xy() As Double, ByVal Nxy As Integer, ByVal nsamples As
Integer, sp() As Double)
&&& Dim i, j, k
As Integer
&&& Dim sx As
Double, sx2 As Double, sy As Double, sy2 As Double, sxy As
&&& For i = 1 To
Nxy '''求简单相关系数
For j = i To Nxy
&&&&&&&&&&&
If i = j Then
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To nsamples
&&&&&&&&&&&&&&&&&&&
sx = sx + xy(k, i)
&&&&&&&&&&&&&&&&&&&
sx2 = sx2 + xy(k, i) * xy(k, i)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
sp(i, j) = (sx2 - sx * sx / nsamples)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
For k = 1 To nsamples
&&&&&&&&&&&&&&&&&&&
sx = sx + xy(k, i)
&&&&&&&&&&&&&&&&&&&
sx2 = sx2 + xy(k, i) * xy(k, i)
&&&&&&&&&&&&&&&&&&&
sy = sy + xy(k, j)
&&&&&&&&&&&&&&&&&&&
sy2 = sy2 + xy(k, j) * xy(k, j)
&&&&&&&&&&&&&&&&&&&
sxy = sxy + xy(k, i) * xy(k, j)
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
sp(i, j) = (sxy - sx * sy / nsamples)
&&&&&&&&&&&&&&&
sp(j, i) = r0(i, j)
&&&&&&&&&&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 excel正交试验分析 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信