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