|
[x]
Posted via EE Mobile
|
||
Search, ask, and monitor your questions on the go with EE Mobile. Visit Experts Exchange from your mobile device and never be out of touch again. |
||
| Question |
|
[x]
Attachment Details
|
||
|
[x]
The Solution Rating System
|
||
With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.
Your Input Matters If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support. Thank you! |
||
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: |
Public Function EIGEN_JK(ByRef M() As Variant) As Variant
Dim A() As Variant, Ematrix() As Double
Dim i As Long, j As Long, k As Long, iter As Long, p As Long
Dim den As Double, hold As Double, Sin_ As Double, num As Double
Dim Sin2 As Double, Cos2 As Double, Cos_ As Double, Test As Double
Dim Tan2 As Double, Cot2 As Double, tmp As Double
Const eps As Double = 1E-16
On Error GoTo EndProc
A = M
p = UBound(A, 1)
ReDim Ematrix(1 To p, 1 To p + 1)
For iter = 1 To 15
'Orthogonalize pairs of columns in upper off diag
For j = 1 To p - 1
For k = j + 1 To p
den = 0#
num = 0#
'Perform single plane rotation
For i = 1 To p
num = num + 2 * A(i, j) * A(i, k)
den = den + (A(i, j) + A(i, k)) * _
(A(i, j) - A(i, k))
Next i
'Skip rotation if aij is zero and correct ordering
If Abs(num) < eps And den >= 0 Then Exit For
'Perform Rotation
If Abs(num) <= Abs(den) Then
Tan2 = Abs(num) / Abs(den)
Cos2 = 1 / Sqr(1 + Tan2 * Tan2)
Sin2 = Tan2 * Cos2
Else
Cot2 = Abs(den) / Abs(num)
Sin2 = 1 / Sqr(1 + Cot2 * Cot2)
Cos2 = Cot2 * Sin2
End If
Cos_ = Sqr((1 + Cos2) / 2)
Sin_ = Sin2 / (2 * Cos_)
If den < 0 Then
tmp = Cos_
Cos_ = Sin_
Sin_ = tmp
End If
Sin_ = Sgn(num) * Sin_
'Rotate
For i = 1 To p
tmp = A(i, j)
A(i, j) = tmp * Cos_ + A(i, k) * Sin_
A(i, k) = -tmp * Sin_ + A(i, k) * Cos_
Next i
Next k
Next j
'Test for convergence
Test = Application.SumSq(A)
If Abs(Test - hold) < eps And iter > 5 Then Exit For
hold = Test
Next iter
If iter = 16 Then MsgBox "JK Iteration has not converged."
'Compute eigenvalues/eigenvectors
For j = 1 To p
'Compute eigenvalues
For k = 1 To p
Ematrix(j, 1) = Ematrix(j, 1) + A(k, j) ^ 2
Next k
Ematrix(j, 1) = Sqr(Ematrix(j, 1))
'Normalize eigenvectors
For i = 1 To p
If Ematrix(j, 1) <= 0 Then
Ematrix(i, j + 1) = 0
Else
Ematrix(i, j + 1) = A(i, j) / Ematrix(j, 1)
End If
Next i
Next j
EIGEN_JK = Ematrix
Exit Function
EndProc:
MsgBox prompt:="Error in function EIGEN_JK!" & vbCr & vbCr & _
"Error: " & Err.Description & ".", Buttons:=48, _
Title:="Run time error!"
End Function
|
Advertisement
| Hall of Fame |