forked from DanWBR/dwsim5
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGDEM.vb
138 lines (107 loc) · 4.06 KB
/
GDEM.vb
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
Imports Mapack
Namespace MathEx.AccelMethods
Public Class GDEM
Public Shared Function Promote(ByVal currX As Double(), ByVal dXvec As ArrayList, ByVal nu As Integer) As Double()
If nu = 0 Then Return currX
Dim n As Integer = currX.Length - 1
Dim m As Integer = dXvec.Count - 1
Dim newX(n) As Double
Dim mu0 As Mapack.Matrix = New Mapack.Matrix(nu - 1, 1)
Dim mu As Mapack.Matrix = New Mapack.Matrix(nu, 1)
Dim W As Mapack.Matrix = New Mapack.Matrix(n + 1, n + 1)
Dim prod As Mapack.Matrix = New Mapack.Matrix(n + 1, n + 1)
Dim m1 As Mapack.Matrix = New Mapack.Matrix(n + 1, 1)
Dim m2 As Mapack.Matrix = New Mapack.Matrix(1, n + 1)
Dim b As Mapack.Matrix = New Mapack.Matrix(nu - 1, nu - 1)
Dim b1 As Mapack.Matrix = New Mapack.Matrix(nu - 1, 1)
Dim i, j, k As Integer
Dim value, currvalue As Double
i = 0
Do
j = 0
Do
If i <> j Then
W(i, j) = 0
Else
value = 0.0001
currvalue = dXvec(m)(i, 0)
If value < 1 / currvalue ^ 2 Then
W(i, j) = value
Else
W(i, j) = 1 / currvalue ^ 2
End If
End If
j = j + 1
Loop Until j = n + 1
i = i + 1
Loop Until i = n + 1
If nu > 1 Then
j = 1
Do
m1 = dXvec(m - j)
k = 1
Do
m2 = dXvec(m - k)
b(j - 1, k - 1) = (m1.Transpose.Multiply(W).Multiply(m2)).FrobeniusNorm ^ 2
k = k + 1
Loop Until k = nu
j = j + 1
Loop Until j = nu
j = 0
Do
m1 = dXvec(m - j)
m2 = dXvec(m - 1)
b1(j, 0) = (m1.Transpose.Multiply(W).Multiply(m2)).FrobeniusNorm ^ 2
j = j + 1
Loop Until j = nu - 1
'Console.WriteLine(b.ToString)
'Console.ReadKey()
If b.Determinant = 0 Then Return currX Else mu0 = b.Solve(b1)
i = 0
Do
mu(i + 1, 0) = mu0(i, 0)
i = i + 1
Loop Until i = nu - 1
mu(0, 0) = 1
Dim sum1 As Double = 0
i = 0
Do
sum1 += mu(i, 0)
i = i + 1
Loop Until i = nu
Dim sum2 As Double = 0, sum3 As Double = 0
k = 0
Do
sum3 = 0
i = 0
Do
sum2 = 0
j = i + 1
Do
sum2 += mu(j, 0)
j = j + 1
Loop Until j = nu
sum3 += dXvec(m - i)(k, 0) * sum2
i = i + 1
Loop Until i = nu - 1
newX(k) = currX(k) - sum3 / sum1
k = k + 1
Loop Until k = n + 1
Return newX
Else
m1 = dXvec(m)
m2 = dXvec(m - 1)
mu(0, 0) = -(m1.Transpose.Multiply(W).Multiply(m2)).FrobeniusNorm ^ 2
m1 = dXvec(m - 1)
m2 = dXvec(m - 1)
mu(0, 0) = mu(0, 0) / (m1.Transpose.Multiply(W).Multiply(m2)).FrobeniusNorm ^ 2
k = 0
Do
newX(k) = currX(k) + dXvec(m)(k, 0) / (1 + mu(0, 0))
k = k + 1
Loop Until k = n + 1
Return newX
End If
End Function
End Class
End Namespace