1 |
bournival |
40 |
Module Outils_Math
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
#Region "calcul matriciel & vectoriel"
|
7 |
|
|
|
8 |
|
|
Public Function Addition(ByRef A(,) As Double, ByRef B(,) As Double) As Double(,)
|
9 |
|
|
'additionne deux matrices et le résultat est renvoyé dans la fonction
|
10 |
|
|
|
11 |
|
|
' vérification que l'on peut additionner, si toutes les matrices sont de 1 à nb, on devrait pas faire ça car ça bouffe du temps...
|
12 |
|
|
Dim ua1 As Double, ub1 As Double
|
13 |
|
|
Dim ua2 As Double, ub2 As Double
|
14 |
|
|
|
15 |
|
|
ua1 = UBound(A, 1)
|
16 |
|
|
ua2 = UBound(A, 2)
|
17 |
|
|
ub1 = UBound(B, 1)
|
18 |
|
|
ub2 = UBound(B, 2)
|
19 |
|
|
|
20 |
|
|
If (Not ua1 - ub1 = 0) Or (Not ua2 - ub2 = 0) Then
|
21 |
|
|
MsgBox("deux matrices ne peuvent pas s'additionner")
|
22 |
|
|
Return Nothing
|
23 |
|
|
End If
|
24 |
|
|
|
25 |
|
|
Dim matC(ua1, ua2) As Double
|
26 |
|
|
|
27 |
|
|
Dim i, j As Integer
|
28 |
|
|
For i = 0 To ub1
|
29 |
|
|
For j = 0 To ub2
|
30 |
|
|
matC(i, j) = A(i, j) + B(i, j)
|
31 |
|
|
Next j
|
32 |
|
|
Next i
|
33 |
|
|
|
34 |
|
|
Addition = matC
|
35 |
|
|
End Function
|
36 |
|
|
|
37 |
|
|
Public Function addition(ByRef a() As Double, ByRef b() As Double) As Double()
|
38 |
|
|
' addition de vecteurs
|
39 |
|
|
|
40 |
|
|
If Not UBound(a) = UBound(b) Then
|
41 |
|
|
MsgBox("Deux vecteurs ne peuvent s'additionner...")
|
42 |
|
|
Return Nothing
|
43 |
|
|
End If
|
44 |
|
|
|
45 |
|
|
Dim i As Integer
|
46 |
|
|
Dim c(UBound(a)) As Double
|
47 |
|
|
|
48 |
|
|
For i = 0 To UBound(a)
|
49 |
|
|
c(i) = a(i) + b(i)
|
50 |
|
|
Next
|
51 |
|
|
|
52 |
|
|
Return c
|
53 |
|
|
End Function
|
54 |
|
|
|
55 |
|
|
Public Function multiscal(ByRef A(,) As Double, ByRef c As Double) As Double(,)
|
56 |
|
|
' multiplie la matrice a par le scalaire c
|
57 |
|
|
Dim i As Integer
|
58 |
|
|
Dim j As Integer
|
59 |
|
|
|
60 |
|
|
Dim B(UBound(A, 1), UBound(A, 2)) As Double
|
61 |
|
|
|
62 |
|
|
For i = 0 To UBound(A, 1)
|
63 |
|
|
For j = 0 To UBound(A, 2)
|
64 |
|
|
B(i, j) = A(i, j) * c
|
65 |
|
|
Next j
|
66 |
|
|
Next i
|
67 |
|
|
|
68 |
|
|
multiscal = B
|
69 |
|
|
End Function
|
70 |
|
|
|
71 |
|
|
Public Function multiscal(ByRef A() As Double, ByRef c As Double) As Double()
|
72 |
|
|
'multiplie un vecteur par une certaine valeur
|
73 |
|
|
Dim i As Integer
|
74 |
|
|
Dim b(UBound(A)) As Double
|
75 |
|
|
For i = 0 To UBound(A)
|
76 |
|
|
b(i) = A(i) * c
|
77 |
|
|
Next
|
78 |
|
|
|
79 |
|
|
multiscal = b
|
80 |
|
|
End Function
|
81 |
|
|
|
82 |
|
|
Public Function reduit(ByRef A(,) As Double, Optional ByVal colonne As Integer = -1, Optional ByRef ligne As Integer = -1) As Double(,)
|
83 |
|
|
' fonction qui retire une colonne et /ou une ligne d'une matrice
|
84 |
|
|
Dim temp(UBound(A, 1) - 1, UBound(A, 2) - 1) As Double
|
85 |
|
|
Dim i As Integer, j As Integer, k As Integer, l As Integer
|
86 |
|
|
|
87 |
|
|
|
88 |
|
|
For l = 0 To UBound(A)
|
89 |
|
|
If Not (l = ligne) Then
|
90 |
|
|
j = 0
|
91 |
|
|
For k = 0 To UBound(A)
|
92 |
|
|
If Not (k = colonne) Then
|
93 |
|
|
temp(i, j) = A(l, k)
|
94 |
|
|
j += 1
|
95 |
|
|
End If
|
96 |
|
|
Next k
|
97 |
|
|
i += 1
|
98 |
|
|
End If
|
99 |
|
|
Next l
|
100 |
|
|
|
101 |
|
|
|
102 |
|
|
reduit = temp
|
103 |
|
|
End Function
|
104 |
|
|
|
105 |
|
|
Public Function reduit(ByRef A() As Double, Optional ByVal colonne As Integer = -1) As Double()
|
106 |
|
|
' fonction qui retire un élément d'un vecteur
|
107 |
|
|
Dim temp(UBound(A)) As Double
|
108 |
|
|
Dim i As Double, l As Double
|
109 |
|
|
|
110 |
|
|
While l < UBound(A)
|
111 |
|
|
If Not l = colonne Then
|
112 |
|
|
temp(i) = A(l)
|
113 |
|
|
l = l + 1
|
114 |
|
|
i = i + 1
|
115 |
|
|
Else
|
116 |
|
|
i = i + 1
|
117 |
|
|
End If
|
118 |
|
|
End While
|
119 |
|
|
|
120 |
|
|
Return temp
|
121 |
|
|
End Function
|
122 |
|
|
|
123 |
|
|
Public Function multiplication(ByVal A(,) As Double, ByVal B(,) As Double) As Double(,)
|
124 |
|
|
' le vecteur C est redimensionné correctement
|
125 |
|
|
' [A]*[B] = [C]
|
126 |
|
|
' si B est un vecteur alors on va à la partie en bas
|
127 |
|
|
|
128 |
|
|
Dim i, j, k, n, m As Integer
|
129 |
|
|
Dim c(,) As Double
|
130 |
|
|
|
131 |
|
|
m = UBound(B, 2)
|
132 |
|
|
n = UBound(A, 1)
|
133 |
|
|
|
134 |
|
|
If UBound(B, 1) <> UBound(A, 2) Then MsgBox(" Incompatibilité de matrices pour la multiplication") : Return Nothing
|
135 |
|
|
|
136 |
|
|
ReDim c(n, m)
|
137 |
|
|
|
138 |
|
|
For j = 0 To m
|
139 |
|
|
For i = 0 To n
|
140 |
|
|
For k = 0 To UBound(A, 2)
|
141 |
|
|
c(i, j) = c(i, j) + A(i, k) * B(k, j)
|
142 |
|
|
Next k
|
143 |
|
|
Next i
|
144 |
|
|
Next j
|
145 |
|
|
|
146 |
|
|
multiplication = c
|
147 |
|
|
End Function
|
148 |
|
|
|
149 |
|
|
Public Function multiplication(ByRef A(,) As Double, ByRef b() As Double) As Double()
|
150 |
|
|
' le vecteur C est redimensionné correctement
|
151 |
|
|
' [A]*{B} = {C}
|
152 |
|
|
' B est un vecteur ligne
|
153 |
|
|
|
154 |
|
|
Dim i, j, n, m As Integer
|
155 |
|
|
Dim c() As Double
|
156 |
|
|
|
157 |
|
|
m = UBound(b)
|
158 |
|
|
n = UBound(A, 1)
|
159 |
|
|
|
160 |
|
|
If UBound(A, 2) <> m Then MsgBox("Impossible de multiplier la matrice avec le vecteur, dimensions incompatibles!") : Return Nothing
|
161 |
|
|
|
162 |
|
|
' on multiplie une matrice et un vecteur
|
163 |
|
|
|
164 |
|
|
ReDim c(m)
|
165 |
|
|
|
166 |
|
|
For i = 0 To UBound(b)
|
167 |
|
|
For j = 0 To UBound(b)
|
168 |
|
|
c(i) = c(i) + A(i, j) * b(j)
|
169 |
|
|
Next j
|
170 |
|
|
Next i
|
171 |
|
|
Return c
|
172 |
|
|
End Function
|
173 |
|
|
|
174 |
|
|
Public Function multiplication(ByRef a() As Double, ByRef B(,) As Double) As Double()
|
175 |
|
|
' le vecteur C est redimensionné correctement
|
176 |
|
|
' {A}*[B] = {C}
|
177 |
|
|
' A est un vecteur colonne
|
178 |
|
|
|
179 |
|
|
Dim i, j, n, m As Integer
|
180 |
|
|
Dim c() As Double
|
181 |
|
|
|
182 |
|
|
m = UBound(a)
|
183 |
|
|
n = UBound(B, 2)
|
184 |
|
|
|
185 |
|
|
If m <> UBound(B, 1) Then MsgBox("Impossible de multiplier le veteur par la matrice.") : Return Nothing
|
186 |
|
|
|
187 |
|
|
ReDim c(m)
|
188 |
|
|
|
189 |
|
|
For i = 0 To UBound(B)
|
190 |
|
|
For j = 0 To UBound(B)
|
191 |
|
|
c(i) = c(i) + a(j) * B(j, i)
|
192 |
|
|
Next j
|
193 |
|
|
Next i
|
194 |
|
|
Return c
|
195 |
|
|
End Function
|
196 |
|
|
|
197 |
|
|
Public Function soustraction(ByRef A(,) As Double, ByRef B(,) As Double) As Double(,)
|
198 |
|
|
'C = A - B
|
199 |
|
|
Dim C(,) As Double
|
200 |
|
|
Dim m As Integer, n As Integer
|
201 |
|
|
m = UBound(A, 1)
|
202 |
|
|
n = UBound(A, 2)
|
203 |
|
|
|
204 |
|
|
If (m <> UBound(B, 1)) Or (n <> UBound(B, 2)) Then MsgBox("Impossible de soustraire les matrices, dimensions non compatibles") : Return Nothing
|
205 |
|
|
|
206 |
|
|
ReDim C(m, n)
|
207 |
|
|
|
208 |
|
|
Dim i, j As Integer
|
209 |
|
|
For i = 0 To m
|
210 |
|
|
For j = 0 To n
|
211 |
|
|
C(i, j) = A(i, j) - B(i, j)
|
212 |
|
|
Next j
|
213 |
|
|
Next i
|
214 |
|
|
Return C
|
215 |
|
|
End Function
|
216 |
|
|
|
217 |
|
|
Public Function transpose(ByRef A(,) As Double) As Double(,)
|
218 |
|
|
|
219 |
|
|
Dim c(,) As Double
|
220 |
|
|
Dim i, j As Integer
|
221 |
|
|
ReDim c(UBound(A, 2), UBound(A, 1))
|
222 |
|
|
|
223 |
|
|
For i = 0 To UBound(A, 1)
|
224 |
|
|
For j = 1 To UBound(A, 2)
|
225 |
|
|
c(j, i) = A(i, j)
|
226 |
|
|
Next j
|
227 |
|
|
Next i
|
228 |
|
|
|
229 |
|
|
Return c
|
230 |
|
|
End Function
|
231 |
|
|
|
232 |
|
|
Public Function gauss(ByRef A(,) As Double, ByRef C() As Double) As Double()
|
233 |
|
|
' [A]{X} = {C}
|
234 |
|
|
' les matrices doivent être déjà dimensionnées
|
235 |
|
|
Dim n As Integer
|
236 |
|
|
Dim i, j, k As Integer
|
237 |
|
|
Dim rapport As Double
|
238 |
|
|
|
239 |
|
|
n = UBound(A, 1)
|
240 |
|
|
Dim rep() As Double
|
241 |
|
|
ReDim rep(n)
|
242 |
|
|
|
243 |
|
|
|
244 |
|
|
For i = 0 To n ' de gauche à droite
|
245 |
|
|
pivoter(i, A, C)
|
246 |
|
|
|
247 |
|
|
'Call Form1.affiche(mat(), C())
|
248 |
|
|
'MsgBox i
|
249 |
|
|
|
250 |
|
|
For j = i + 1 To n ' les lignes
|
251 |
|
|
rapport = A(j, i) / A(i, i)
|
252 |
|
|
For k = 1 To n ' les colonnes
|
253 |
|
|
A(j, k) = A(j, k) - A(i, k) * rapport
|
254 |
|
|
Next k
|
255 |
|
|
C(j) = C(j) - C(i) * rapport
|
256 |
|
|
Next j
|
257 |
|
|
|
258 |
|
|
Next i
|
259 |
|
|
|
260 |
|
|
|
261 |
|
|
Dim stuff As Double
|
262 |
|
|
For i = n To 0 Step -1
|
263 |
|
|
stuff = 0
|
264 |
|
|
For j = i + 1 To n
|
265 |
|
|
stuff = stuff + A(i, j) * rep(j)
|
266 |
|
|
Next j
|
267 |
|
|
rep(i) = (C(i) - stuff) / A(i, i)
|
268 |
|
|
Next i
|
269 |
|
|
C = rep
|
270 |
|
|
gauss = rep
|
271 |
|
|
End Function
|
272 |
|
|
|
273 |
|
|
Private Sub pivoter(ByVal i As Integer, ByRef mat(,) As Double, ByRef C() As Double)
|
274 |
|
|
' sub qui pivote la ligne i de la matrice a ( et du vecteur C). Si et seulement si le pivotage est nécessaire.
|
275 |
|
|
Dim n As Integer
|
276 |
|
|
n = UBound(mat, 1)
|
277 |
|
|
Dim a_pivoter As Integer
|
278 |
|
|
|
279 |
|
|
Dim z As Integer
|
280 |
|
|
Dim temp As Double
|
281 |
|
|
Dim tempC As Double
|
282 |
|
|
|
283 |
|
|
For z = i To n
|
284 |
|
|
temp = mat(i, i)
|
285 |
|
|
|
286 |
|
|
If mat(z, i) > Math.Abs(temp) Then ' on a trouvé une ligneà pivoter
|
287 |
|
|
temp = mat(z, i)
|
288 |
|
|
a_pivoter = z
|
289 |
|
|
End If
|
290 |
|
|
Next z
|
291 |
|
|
'MsgBox a_pivoter
|
292 |
|
|
|
293 |
|
|
If a_pivoter <> 0 Then ' on pivote
|
294 |
|
|
' on pivote la ligne i et la ligne a_pivoter
|
295 |
|
|
tempC = C(i)
|
296 |
|
|
C(i) = C(a_pivoter)
|
297 |
|
|
C(a_pivoter) = tempC
|
298 |
|
|
|
299 |
|
|
For z = 0 To n
|
300 |
|
|
temp = mat(i, z)
|
301 |
|
|
mat(i, z) = mat(a_pivoter, z)
|
302 |
|
|
mat(a_pivoter, z) = temp
|
303 |
|
|
Next z
|
304 |
|
|
|
305 |
|
|
End If
|
306 |
|
|
' fin pivot
|
307 |
|
|
End Sub
|
308 |
|
|
|
309 |
|
|
Private Function pivoter(ByVal i As Integer, ByRef mat(,) As Double) As Integer
|
310 |
|
|
' sub qui pivote la ligne i de la matrice a ( et du vecteur C). Si et seulement si le pivotage est nécessaire.
|
311 |
|
|
Dim n As Integer
|
312 |
|
|
n = UBound(mat, 1)
|
313 |
|
|
Dim a_pivoter As Integer
|
314 |
|
|
pivoter = 1
|
315 |
|
|
|
316 |
|
|
Dim z As Integer
|
317 |
|
|
Dim temp As Double
|
318 |
|
|
|
319 |
|
|
For z = i To n
|
320 |
|
|
temp = mat(i, i)
|
321 |
|
|
|
322 |
|
|
If mat(z, i) > Math.Abs(temp) Then ' on a trouvé une ligne à pivoter
|
323 |
|
|
temp = mat(z, i)
|
324 |
|
|
a_pivoter = z
|
325 |
|
|
pivoter = -1
|
326 |
|
|
End If
|
327 |
|
|
Next z
|
328 |
|
|
|
329 |
|
|
If a_pivoter <> 0 Then ' on pivote
|
330 |
|
|
|
331 |
|
|
For z = 0 To n
|
332 |
|
|
temp = mat(i, z)
|
333 |
|
|
mat(i, z) = mat(a_pivoter, z)
|
334 |
|
|
mat(a_pivoter, z) = temp
|
335 |
|
|
Next z
|
336 |
|
|
|
337 |
|
|
End If
|
338 |
|
|
' fin pivot
|
339 |
|
|
End Function
|
340 |
|
|
|
341 |
|
|
Public Function norme(ByRef u() As Double) As Double
|
342 |
|
|
' calcul la norme (longueur) d'un vecteur à xDimensions
|
343 |
|
|
Dim i As Integer
|
344 |
|
|
Dim temp As Double
|
345 |
|
|
|
346 |
|
|
For i = 0 To UBound(u)
|
347 |
|
|
temp = temp + u(i) ^ 2
|
348 |
|
|
Next i
|
349 |
|
|
Return Math.Sqrt(temp)
|
350 |
|
|
End Function
|
351 |
|
|
|
352 |
|
|
Public Function Prod_scalaire(ByRef u() As Double, ByRef v() As Double) As Double
|
353 |
|
|
' fait le produit scalaire entre deux vecteurs
|
354 |
|
|
' en notation indicielle: w = uivi
|
355 |
|
|
Dim i As Integer
|
356 |
|
|
|
357 |
|
|
For i = 0 To UBound(u)
|
358 |
|
|
Prod_scalaire = Prod_scalaire + u(i) * v(i)
|
359 |
|
|
Next i
|
360 |
|
|
|
361 |
|
|
End Function
|
362 |
|
|
|
363 |
|
|
Public Function prod_vect3D(ByRef u() As Double, ByRef v() As Double) As Double()
|
364 |
|
|
' fait le produit vectoriel entre les vecteur 3D u et v
|
365 |
|
|
' [ i j k ]
|
366 |
|
|
' | u1 u2 u3 |
|
367 |
|
|
' [ v1 v2 v3 ]
|
368 |
|
|
'
|
369 |
|
|
' w = (u2*v3 - u3*v2) i - (u1*v3 - u3*v1) j + (u1*v2-u2*v1) k
|
370 |
|
|
Dim w(2) As Double
|
371 |
|
|
w(0) = u(2) * v(3) - u(3) * v(2)
|
372 |
|
|
w(1) = -(u(1) * v(3) - u(3) * v(1))
|
373 |
|
|
w(2) = u(1) * v(2) - u(2) * v(1)
|
374 |
|
|
|
375 |
|
|
prod_vect3D = w
|
376 |
|
|
|
377 |
|
|
End Function
|
378 |
|
|
|
379 |
|
|
Public Function unitaire(ByRef u() As Double) As Double()
|
380 |
|
|
' prend le vecteur u et son vecteur unitaire v
|
381 |
|
|
Dim longueur As Double
|
382 |
|
|
Dim i As Integer
|
383 |
|
|
Dim v() As Double
|
384 |
|
|
ReDim v(UBound(u))
|
385 |
|
|
|
386 |
|
|
Dim temp As Double
|
387 |
|
|
For i = 0 To UBound(u)
|
388 |
|
|
temp = temp + u(i) ^ 2
|
389 |
|
|
Next i
|
390 |
|
|
longueur = Math.Sqrt(temp)
|
391 |
|
|
For i = 0 To UBound(u)
|
392 |
|
|
v(i) = u(i) / longueur
|
393 |
|
|
Next i
|
394 |
|
|
|
395 |
|
|
unitaire = v
|
396 |
|
|
End Function
|
397 |
|
|
|
398 |
|
|
Public Function cosdir(ByRef u() As Double, ByRef v() As Double) As Double
|
399 |
|
|
' retourne le cosinus entre deux vecteurs, u et v
|
400 |
|
|
cosdir = Prod_scalaire(u, v) / norme(u) / norme(v)
|
401 |
|
|
End Function
|
402 |
|
|
|
403 |
|
|
Public Function projection(ByVal u() As Double, ByVal e() As Double) As Double
|
404 |
|
|
' projette le vecteur u sur e et retourne
|
405 |
|
|
' le résultat est la longueur sur le vecteur e
|
406 |
|
|
projection = norme(u) * cosdir(u, e)
|
407 |
|
|
End Function
|
408 |
|
|
|
409 |
|
|
|
410 |
|
|
|
411 |
|
|
Public Function det(ByRef A(,) As Double) As Double
|
412 |
|
|
' calcule le détrminant de la matrice A
|
413 |
|
|
Dim i As Long
|
414 |
|
|
Dim temp As Double
|
415 |
|
|
' contrôle d'erreur:
|
416 |
|
|
If UBound(A, 1) <> UBound(A, 2) Then
|
417 |
|
|
MsgBox("Impossible de calculer le déterminant, la matrice n'est pas carrée")
|
418 |
|
|
End If
|
419 |
|
|
|
420 |
|
|
Dim n As Integer
|
421 |
|
|
Dim j As Integer, k As Integer
|
422 |
|
|
Dim rapport As Double
|
423 |
|
|
|
424 |
|
|
n = UBound(A, 1)
|
425 |
|
|
Dim rep() As Double
|
426 |
|
|
ReDim rep(n)
|
427 |
|
|
|
428 |
|
|
temp = 1
|
429 |
|
|
For i = 0 To n ' de gauche à droite
|
430 |
|
|
temp *= pivoter(i, A)
|
431 |
|
|
|
432 |
|
|
For j = i + 1 To n ' les lignes
|
433 |
|
|
rapport = A(j, i) / A(i, i)
|
434 |
|
|
For k = 1 To n ' les colonnes
|
435 |
|
|
A(j, k) = A(j, k) - A(i, k) * rapport
|
436 |
|
|
Next k
|
437 |
|
|
Next j
|
438 |
|
|
Next i
|
439 |
|
|
|
440 |
|
|
' à partir d'ici on a une matrice triangulaire suppérieure. (mais je me casse pas la tête à mettre des 0...)
|
441 |
|
|
|
442 |
|
|
For i = 0 To UBound(A)
|
443 |
|
|
temp *= A(i, i)
|
444 |
|
|
Next
|
445 |
|
|
|
446 |
|
|
Return temp
|
447 |
|
|
End Function
|
448 |
|
|
|
449 |
|
|
|
450 |
|
|
Public Function det2(ByRef A(,) As Double) As Double
|
451 |
|
|
' calcul du déterminant à l'aide du cofacteur
|
452 |
|
|
|
453 |
|
|
Dim i As Long
|
454 |
|
|
Dim temp As Double
|
455 |
|
|
' contrôle d'erreur:
|
456 |
|
|
If UBound(A, 1) <> UBound(A, 2) Then
|
457 |
|
|
MsgBox("Impossible de calculer le déterminant, la matrice n'est pas carrée")
|
458 |
|
|
End If
|
459 |
|
|
|
460 |
|
|
If UBound(A) = 0 Then det2 = A(0, 0) : Exit Function
|
461 |
|
|
Dim B(,) As Double
|
462 |
|
|
ReDim B(UBound(A) - 1, UBound(A) - 1)
|
463 |
|
|
|
464 |
|
|
|
465 |
|
|
For i = 0 To UBound(A)
|
466 |
|
|
B = (reduit(A, i, 0))
|
467 |
|
|
temp += (-1) ^ i * det2(reduit(A, i, 0)) * A(0, i)
|
468 |
|
|
Next i
|
469 |
|
|
|
470 |
|
|
det2 = temp
|
471 |
|
|
|
472 |
|
|
End Function
|
473 |
|
|
|
474 |
|
|
|
475 |
|
|
'Function qui compare 2 vecteurs. retourne 0 si non alignés. 1 si dans le même sens, 2 si de sens opposé.
|
476 |
|
|
Public Function CompareSens(ByRef u() As Double, ByRef v() As Double, Optional ByVal Epsilon As Double = 0.000000001) As Integer
|
477 |
|
|
If ((u(0) - v(0)) < Epsilon) And ((u(1) - v(1)) < Epsilon) And ((u(2) - v(2)) < Epsilon) Then Return 1
|
478 |
|
|
If ((u(0) + v(0)) < Epsilon) And ((u(1) + v(1)) < Epsilon) And ((u(2) + v(2)) < Epsilon) Then Return 2
|
479 |
|
|
Return 0
|
480 |
|
|
End Function
|
481 |
|
|
|
482 |
|
|
#End Region
|
483 |
|
|
|
484 |
|
|
#Region "calcul intégral"
|
485 |
|
|
|
486 |
|
|
|
487 |
|
|
Function rectangles(ByRef dx As Double, Optional ByVal a As Double = 0, Optional ByVal b As Double = 1) As Double
|
488 |
|
|
' function qui calcule l'intégrale de f par la méthode des rectangles
|
489 |
|
|
Dim ecart As Double
|
490 |
|
|
Dim i As Integer
|
491 |
|
|
Dim nb As Long
|
492 |
|
|
Dim x As Double
|
493 |
|
|
Dim aire As Double
|
494 |
|
|
|
495 |
|
|
ecart = b - a
|
496 |
|
|
|
497 |
|
|
nb = CLng(ecart / dx)
|
498 |
|
|
dx = ecart / nb
|
499 |
|
|
|
500 |
|
|
If nb < 100 Then MsgBox("Attention, moins de 100 rectangles seront utilisés pour calculer l'intégrale")
|
501 |
|
|
|
502 |
|
|
x = a
|
503 |
|
|
For i = 1 To nb
|
504 |
|
|
aire += f(x + dx / 2) * dx
|
505 |
|
|
x += dx
|
506 |
|
|
Next
|
507 |
|
|
|
508 |
|
|
rectangles = aire
|
509 |
|
|
|
510 |
|
|
End Function
|
511 |
|
|
|
512 |
|
|
|
513 |
|
|
Function trapezes(ByRef dx As Double, Optional ByVal a As Double = 0, Optional ByVal b As Double = 1) As Double
|
514 |
|
|
' function qui calcule l'intégrale de f par la méthode des trapezes
|
515 |
|
|
Dim ecart As Double
|
516 |
|
|
Dim i As Integer
|
517 |
|
|
Dim nb As Long
|
518 |
|
|
Dim x As Double
|
519 |
|
|
Dim aire As Double
|
520 |
|
|
|
521 |
|
|
ecart = b - a
|
522 |
|
|
nb = CLng(ecart / dx)
|
523 |
|
|
dx = ecart / nb
|
524 |
|
|
|
525 |
|
|
If nb < 100 Then MsgBox("Attention, moins de 100 trapezes seront utilisés pour calculer l'intégrale")
|
526 |
|
|
|
527 |
|
|
x = a
|
528 |
|
|
For i = 1 To nb
|
529 |
|
|
aire += (f(x) + f(x + dx)) / 2 * dx
|
530 |
|
|
x += dx
|
531 |
|
|
Next
|
532 |
|
|
|
533 |
|
|
trapezes = aire
|
534 |
|
|
End Function
|
535 |
|
|
Function IntegrationGauss(ByRef n As Integer, Optional ByRef noFunction As Integer = 1) As Double
|
536 |
|
|
Dim i As Integer
|
537 |
|
|
Dim temp As Double
|
538 |
|
|
Dim t() As Double
|
539 |
|
|
Dim w() As Double
|
540 |
|
|
ReDim w(0)
|
541 |
|
|
ReDim t(0)
|
542 |
|
|
|
543 |
|
|
Select Case n
|
544 |
|
|
Case 1 ' un seul point d'intégration
|
545 |
|
|
ReDim t(0)
|
546 |
|
|
ReDim w(0)
|
547 |
|
|
|
548 |
|
|
t(0) = 0
|
549 |
|
|
w(0) = 2
|
550 |
|
|
|
551 |
|
|
Case 2 ' deux points d'intégration
|
552 |
|
|
' somme wi f(ri)
|
553 |
|
|
ReDim t(1)
|
554 |
|
|
ReDim w(1)
|
555 |
|
|
|
556 |
|
|
t(0) = -0.57735027
|
557 |
|
|
t(1) = 0.57735027
|
558 |
|
|
|
559 |
|
|
w(0) = 1
|
560 |
|
|
w(1) = 1
|
561 |
|
|
|
562 |
|
|
Case 3 ' trois points
|
563 |
|
|
ReDim t(2)
|
564 |
|
|
ReDim w(2)
|
565 |
|
|
|
566 |
|
|
t(0) = -0.77459667
|
567 |
|
|
t(1) = 0
|
568 |
|
|
t(2) = 0.77459667
|
569 |
|
|
|
570 |
|
|
w(0) = 5 / 9
|
571 |
|
|
w(1) = 8 / 9
|
572 |
|
|
w(2) = 5 / 9
|
573 |
|
|
|
574 |
|
|
Case 4
|
575 |
|
|
|
576 |
|
|
ReDim t(3)
|
577 |
|
|
ReDim w(3)
|
578 |
|
|
|
579 |
|
|
t(0) = -0.86113631
|
580 |
|
|
t(1) = -0.33998104
|
581 |
|
|
t(2) = 0.33998104
|
582 |
|
|
t(3) = 0.86113631
|
583 |
|
|
|
584 |
|
|
w(0) = 0.34785485
|
585 |
|
|
w(1) = 0.65214515
|
586 |
|
|
w(2) = 0.65214515
|
587 |
|
|
w(3) = 0.34785485
|
588 |
|
|
|
589 |
|
|
|
590 |
|
|
Case 5
|
591 |
|
|
ReDim t(4)
|
592 |
|
|
ReDim w(4)
|
593 |
|
|
|
594 |
|
|
t(0) = -0.90617975
|
595 |
|
|
t(1) = -0.53846931
|
596 |
|
|
t(2) = 0
|
597 |
|
|
t(3) = 0.53846931
|
598 |
|
|
t(4) = 0.90617975
|
599 |
|
|
|
600 |
|
|
w(0) = 0.23692689
|
601 |
|
|
w(1) = 0.47862867
|
602 |
|
|
w(2) = 0.56888889
|
603 |
|
|
w(3) = 0.47862867
|
604 |
|
|
w(4) = 0.23692689
|
605 |
|
|
|
606 |
|
|
Case Else
|
607 |
|
|
MsgBox("Problème dans l'intégration de Gauss, nb de points d'intégration non reconnu!?!")
|
608 |
|
|
End Select
|
609 |
|
|
|
610 |
|
|
|
611 |
|
|
For i = 0 To n - 1
|
612 |
|
|
temp = temp + w(i) * Choose(noFunction, f1(t(i)), f2(t(i)), f3(t(i)), f4(t(i)), f5(t(i)))
|
613 |
|
|
Next
|
614 |
|
|
|
615 |
|
|
IntegrationGauss = temp
|
616 |
|
|
End Function
|
617 |
|
|
|
618 |
|
|
|
619 |
|
|
Function simpson(ByRef dx As Double, Optional ByVal a As Double = 0, Optional ByVal b As Double = 1) As Double
|
620 |
|
|
|
621 |
|
|
|
622 |
|
|
End Function
|
623 |
|
|
|
624 |
|
|
#End Region
|
625 |
|
|
|
626 |
|
|
|
627 |
|
|
|
628 |
|
|
|
629 |
|
|
Public Function f(ByVal x As Double) As Double
|
630 |
|
|
f = x ^ 2
|
631 |
|
|
End Function
|
632 |
|
|
Public Function f1(ByVal r As Double) As Double
|
633 |
|
|
f1 = -0.04 * (-3 + r) * r ^ 2
|
634 |
|
|
End Function
|
635 |
|
|
Public Function f2(ByVal r As Double) As Double
|
636 |
|
|
f2 = -0.04 * (-3 + r) * r ^ 2
|
637 |
|
|
End Function
|
638 |
|
|
Public Function f3(ByVal r As Double) As Double
|
639 |
|
|
f3 = -0.04 * (-3 + r) * r ^ 2
|
640 |
|
|
End Function
|
641 |
|
|
Public Function f4(ByVal r As Double) As Double
|
642 |
|
|
f4 = -0.04 * (-3 + r) * r ^ 2
|
643 |
|
|
End Function
|
644 |
|
|
Public Function f5(ByVal r As Double) As Double
|
645 |
|
|
f5 = -0.04 * (-3 + r) * r ^ 2
|
646 |
|
|
End Function
|
647 |
|
|
|
648 |
|
|
|
649 |
|
|
' Secant
|
650 |
|
|
Public Function Sec(ByVal X As Double) As Double
|
651 |
|
|
Sec = 1 / Math.Cos(X)
|
652 |
|
|
End Function
|
653 |
|
|
|
654 |
|
|
' Cosecant
|
655 |
|
|
Public Function CoSec(ByVal X As Double) As Double
|
656 |
|
|
CoSec = 1 / Math.Sin(X)
|
657 |
|
|
End Function
|
658 |
|
|
|
659 |
|
|
' Cotangent
|
660 |
|
|
Public Function CoTan(ByVal X As Double) As Double
|
661 |
|
|
CoTan = 1 / Math.Tan(X)
|
662 |
|
|
End Function
|
663 |
|
|
|
664 |
|
|
' Inverse Sine
|
665 |
|
|
Public Function ArcSin(ByVal X As Double) As Double
|
666 |
|
|
ArcSin = Math.Atan(X / Math.Sqrt(-X * X + 1))
|
667 |
|
|
End Function
|
668 |
|
|
|
669 |
|
|
' Inverse Cosine
|
670 |
|
|
Public Function ArcCos(ByVal X As Double) As Double
|
671 |
|
|
ArcCos = Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
|
672 |
|
|
End Function
|
673 |
|
|
|
674 |
|
|
' Inverse Secant
|
675 |
|
|
Public Function ArcSec(ByVal X As Double) As Double
|
676 |
|
|
ArcSec = Math.Atan(X / Math.Sqrt(X * X - 1)) + Math.Sign(X - 1) * (2 * Math.Atan(1))
|
677 |
|
|
End Function
|
678 |
|
|
|
679 |
|
|
' Inverse Cosecant
|
680 |
|
|
Public Function ArcCoSec(ByVal X As Double) As Double
|
681 |
|
|
ArcCoSec = Math.Atan(X / Math.Sqrt(X * X - 1)) + (Math.Sign(X) - 1) * (2 * Math.Atan(1))
|
682 |
|
|
End Function
|
683 |
|
|
|
684 |
|
|
' Inverse Cotangent
|
685 |
|
|
Public Function ArcCoTan(ByVal X As Double) As Double
|
686 |
|
|
ArcCoTan = Math.Atan(X) + 2 * Math.Atan(1)
|
687 |
|
|
End Function
|
688 |
|
|
|
689 |
|
|
|
690 |
|
|
' Hyperbolic Secant
|
691 |
|
|
Public Function HSec(ByVal X As Double) As Double
|
692 |
|
|
HSec = 2 / (Math.Exp(X) + Math.Exp(-X))
|
693 |
|
|
End Function
|
694 |
|
|
|
695 |
|
|
' Hyperbolic Cosecant
|
696 |
|
|
Public Function HCoSec(ByVal X As Double) As Double
|
697 |
|
|
HCoSec = 2 / (Math.Exp(X) - Math.Exp(-X))
|
698 |
|
|
End Function
|
699 |
|
|
|
700 |
|
|
' Hyperbolic Cotangent
|
701 |
|
|
Public Function HCotan(ByVal X As Double) As Double
|
702 |
|
|
HCotan = (Math.Exp(X) + Math.Exp(-X)) / (Math.Exp(X) - Math.Exp(-X))
|
703 |
|
|
End Function
|
704 |
|
|
|
705 |
|
|
' Inverse Hyperbolic Sine
|
706 |
|
|
Public Function HArcSin(ByVal X As Double) As Double
|
707 |
|
|
HArcSin = Math.Log(X + Math.Sqrt(X * X + 1))
|
708 |
|
|
End Function
|
709 |
|
|
|
710 |
|
|
' Inverse Hyperbolic Cosine
|
711 |
|
|
Public Function HArcCos(ByVal X As Double) As Double
|
712 |
|
|
HArcCos = Math.Log(X + Math.Sqrt(X * X - 1))
|
713 |
|
|
End Function
|
714 |
|
|
|
715 |
|
|
' Inverse Hyperbolic Tangent
|
716 |
|
|
Function HArcTan(ByVal X As Double) As Double
|
717 |
|
|
HArcTan = Math.Log((1 + X) / (1 - X)) / 2
|
718 |
|
|
End Function
|
719 |
|
|
|
720 |
|
|
' Inverse Hyperbolic Secant
|
721 |
|
|
Public Function HArcSec(ByVal X As Double) As Double
|
722 |
|
|
HArcSec = Math.Log((Math.Sqrt(-X * X + 1) + 1) / X)
|
723 |
|
|
End Function
|
724 |
|
|
|
725 |
|
|
' Inverse Hyperbolic Cosecant
|
726 |
|
|
Public Function HArcCoSec(ByVal X As Double) As Double
|
727 |
|
|
HArcCoSec = Math.Log((Math.Sign(X) * Math.Sqrt(X * X + 1) + 1) / X)
|
728 |
|
|
End Function
|
729 |
|
|
|
730 |
|
|
' Inverse Hyperbolic Cotangent
|
731 |
|
|
Public Function HArcCoTan(ByVal X As Double) As Double
|
732 |
|
|
HArcCoTan = Math.Log((X + 1) / (X - 1)) / 2
|
733 |
|
|
End Function
|
734 |
|
|
|
735 |
|
|
' Logarithm to base N
|
736 |
|
|
Public Function LogN(ByVal X As Double, ByVal n As Double) As Double
|
737 |
|
|
LogN = Math.Log(X) / Math.Log(n)
|
738 |
|
|
End Function
|
739 |
|
|
|
740 |
|
|
' function qui effectue la rotation d'un point Pt par la matrice Mat
|
741 |
|
|
Public Function Rotation2D(ByRef Mat(,) As Double, ByVal Pt() As Double) As Double()
|
742 |
|
|
Dim temp(1) As Double
|
743 |
|
|
|
744 |
|
|
temp(0) = Mat(0, 0) * Pt(0) + Mat(0, 1) * Pt(1)
|
745 |
|
|
temp(1) = Mat(0, 1) * Pt(0) + Mat(1, 1) * Pt(1)
|
746 |
|
|
|
747 |
|
|
Return temp
|
748 |
|
|
|
749 |
|
|
End Function
|
750 |
|
|
|
751 |
|
|
' function qui effectue la rotation d'un point Pt par le vecteur UNITAIRE u
|
752 |
|
|
Public Function Rotation2D(ByRef u() As Double, ByVal Pt() As Double) As Double()
|
753 |
|
|
Dim temp(1) As Double
|
754 |
|
|
Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1))
|
755 |
|
|
u(0) /= longueur
|
756 |
|
|
u(1) /= longueur
|
757 |
|
|
|
758 |
|
|
temp(0) = u(0) * Pt(0) - u(1) * Pt(1)
|
759 |
|
|
temp(1) = u(1) * Pt(0) + u(0) * Pt(1)
|
760 |
|
|
|
761 |
|
|
|
762 |
|
|
|
763 |
|
|
Return temp
|
764 |
|
|
|
765 |
|
|
End Function
|
766 |
|
|
|
767 |
|
|
Public Sub Rotation2D(ByRef u() As Double, ByRef Ptx As Double, ByRef Pty As Double)
|
768 |
|
|
Dim temp(1) As Double
|
769 |
|
|
Dim longueur As Double = Math.Sqrt(u(0) * u(0) + u(1) * u(1))
|
770 |
|
|
u(0) /= longueur
|
771 |
|
|
u(1) /= longueur
|
772 |
|
|
|
773 |
|
|
temp(0) = u(0) * Ptx - u(1) * Pty
|
774 |
|
|
temp(1) = u(1) * Ptx + u(0) * Pty
|
775 |
|
|
|
776 |
|
|
Ptx = temp(0)
|
777 |
|
|
Pty = temp(1)
|
778 |
|
|
|
779 |
|
|
End Sub
|
780 |
|
|
|
781 |
|
|
Public Function Angle2Vecteurs(ByRef u() As Double, ByRef v() As Double) As Double
|
782 |
|
|
Dim temp As Double
|
783 |
|
|
temp = Outils_Math.Prod_scalaire(u, v) / norme(u) / norme(v)
|
784 |
|
|
If Math.Abs(temp - 1) < 0.000000000001 Or Math.Abs(temp + 1) < 0.000000000001 Then
|
785 |
|
|
Return Pi
|
786 |
|
|
Else
|
787 |
|
|
Return Math.Acos(temp)
|
788 |
|
|
End If
|
789 |
|
|
End Function
|
790 |
|
|
|
791 |
|
|
End Module
|