Accueil > > > PROGRAMME DE RÉSOLUTION DE N ÉQUATIONS À N INCONNUES
PROGRAMME DE RÉSOLUTION DE N ÉQUATIONS À N INCONNUES
Information sur la source
Description
il sagit de transformer son système d'équations en matrices, que le programme transforme en matrice diagonale supérieure (donc résolvable) en gardant le pivot le plus grand (élimine les erreurs d'arrondi) on obtient alors le résultat par un dernier calcul rapide. Pour l'instant, toutes les opérations sont visualisables, ce qui ralenti le calcul... je vais changer ça et bientôt optimiser le code pour la rapidité ...
Source
- Dim dec As Integer
- Dim tabmat() As Double
- Dim m As Integer
- Dim var(), y(), temp(), ytemp() As Variant
-
- Private Sub cmdgauss_Click()
-
- m = Flexmat.Cols
- ProgressBar1.Min = 0
- ProgressBar1.Max = 100
-
- If txtdec = "" Then dec = 20 Else dec = txtdec.Text
-
- ReDim var(m), y(m), temp(m, m), ytemp(m)
- Dim pgb As Double
- ReDim tabmat(m, m) As Double
- Dim a, maxp, maxs As Double
-
- 'a est le coeff de l'algorithme'
- a = 1
- colmax = 0
- rowmax = 0
- maxs = 0
- maxp = 0
- pgb = 99 / (7 * m - 5)
-
- 'remplissage du tableau'
- For i = 0 To m - 1
- flexvar.Row = i
- Flexvarini.Row = i
- flexvar.Text = Flexvarini.Text
- For j = 0 To m - 1
- Flexmat.Row = i
- Flexmat.Col = j
- tabmat(i, j) = Flexmat.Text
- Next j
- Next i
- ProgressBar1.Value = pgb
-
- '''''''''''''''début de l'algorithme''''''''''''''''
-
-
- 'écriture dans flexresult'
- For i = k To m - 1
- For j = k To m - 1
- temp(i, j) = tabmat(i, j)
- Next j
- Next i
- ProgressBar1.Value = ProgressBar1.Value + pgb
-
- 'écriture dans var()'
- For i = 0 To m - 1
- Flexvarini.Row = i
- var(i) = Flexvarini.Text
- Next i
-
- 'écriture dans y()'
- For i = 0 To m - 1
- flex_yini.Row = i
- y(i) = flex_yini.Text
- Next i
-
- For k = 0 To m - 2
-
- 'recherche du maximum'
- maxp = 0
- For i = k To m - 1
- For j = k To m - 2
- maxs = Max(tabmat(i, j), tabmat(i, j + 1))
- If maxs > maxp Then maxp = maxs
- Next j
- Next i
- ProgressBar1.Value = ProgressBar1.Value + pgb
-
- 'recherche de l'emplacement du maximum'
- For i = k To m - 1
- For j = k To m - 1
- If temp(i, j) = maxp Then
- colmax = j
- rowmax = i
- End If
- Next j
- Next i
-
- suite:
- ProgressBar1.Value = ProgressBar1.Value + pgb
-
- 'réécriture dans flexresult pour obtenir le pivot le plus grand'
-
- 'changement de la ligne'
- For j = k To m - 1
- temp(k, j) = Round(tabmat(rowmax, j), dec)
- temp(rowmax, j) = Round(tabmat(k, j), dec)
- Next j
- ytemp(rowmax) = Round(y(k), dec)
- ytemp(k) = Round(y(rowmax), dec)
-
- ProgressBar1.Value = ProgressBar1.Value + pgb
-
- 'réécriture du tableau'
- For i = k To m - 1
- y(i) = ytemp(i)
- For j = k To m - 1
- tabmat(i, j) = temp(i, j)
- Next j
- Next i
- ProgressBar1.Value = ProgressBar1.Value + pgb
-
- 'changement de colonne'
- For i = k To m - 1
- temp(k, i) = Round(tabmat(i, colmax), dec)
- temp(colmax, i) = Round(tabmat(i, k), dec)
- Next i
- flexvar.Row = k
- flexvar.Text = var(colmax)
- flexvar.Row = colmax
- flexvar.Text = var(k)
- ProgressBar1.Value = ProgressBar1.Value + pgb
-
-
- 'réécriture du tableau'
- For i = k To m - 1
- flexvar.Row = i
- var(i) = flexvar.Text
- flex_y.Row = i
- flex_y.Text = ytemp(i)
- For j = k To m - 1
- Flexresult.Row = i
- Flexresult.Col = j
- Flexresult.Text = temp(i, j)
- Next j
- Next i
- ProgressBar1.Value = ProgressBar1.Value + pgb
-
- For i = k + 1 To m - 1
- If tabmat(k, k) <> 0 Then
- a = tabmat(i, k) / tabmat(k, k) 'calcul de a'
- Else
- MsgBox "les équations ne sont pas indépendantes !", vbOKOnly, "erreur"
- Cmdresult.Enabled = False
- GoTo break
- End If
- y(i) = y(i) - (y(k) * a)
- flex_y.Row = i
- flex_y.Text = Round(y(i), dec)
- For j = k To m - 1
- Flexresult.Row = i
- Flexresult.Col = j
- tabmat(i, j) = tabmat(i, j) - (tabmat(k, j) * a)
- Flexresult.Col = j
- Flexresult.Row = i
- Flexresult.Text = Round(tabmat(i, j), dec)
- Next j
- Next i
- For i = 0 To m - 1
- flex_y.Row = i
- y(i) = flex_y.Text
- For j = 0 To m - 1
- tabmat(i, j) = temp(i, j)
- Next j
- Next i
- ProgressBar1.Value = ProgressBar1.Value + pgb
- Next k
- 'fin de l'agorithme'
- ProgressBar1.Value = 0
- For i = 0 To m - 1
- For j = 0 To m - 1
- tabmat(i, j) = temp(i, j)
- Next j
- Next i
- Cmdresult.Enabled = True
- If tabmat(m - 1, m - 1) = 0 Then
- MsgBox "Les équations ne sont pas indépendantes !", vbExclamation, "Matrice 1.0.0."
- Cmdresult.Enabled = False
- End If
- break:
- MsgBox "La matrice à été simplifiée pour permettre le calcul du résultat. cliquez sur 'resultat final' pour calculer les inconnus !", vbInformation, "Matrice 1.0.0."
- End Sub
-
- Private Sub cmdmodif_Click()
- Flexmat.Text = InputBox("Rentrez la nouvelle valeur :", "Matrice 1.0.0.", 0, 2000, 200)
- End Sub
-
- Private Sub cmdrandom_Click()
- Randomize
- For i = 0 To m - 1
- flex_yini.Row = i
- flex_yini.Text = Round(20 * Rnd(20), 0)
- For j = 0 To m - 1
- Flexmat.Col = j
- Flexmat.Row = i
- Flexmat.Text = Round(20 * Rnd(20), 0)
- Next j
- Next i
- cmdmodif.Enabled = True
- cmdsecond.Enabled = True
- cmdgauss.Enabled = True
- End Sub
-
- Private Sub cmdremp_Click()
- For i = 0 To m - 1
- For j = 0 To m - 1
- Flexmat.Col = j
- Flexmat.Row = i
- Flexmat.Text = InputBox("Veuillez rentrer la valeur de a(" & i & "," & j & ") :", "Matrice 1.0.0.", 0, 2000, 200)
- Next j
- Next i
- cmdmodif.Enabled = True
- cmdsecond.Enabled = True
- End Sub
-
- Private Sub Cmdresult_Click()
- Dim res() As Double
- ReDim res(m)
- Dim somme, val As Double
- Dim j, kinv As Integer
-
- 'initialisation de res()'
- For i = 1 To m - 1
- res(i) = 0
- Next i
-
- 'début de l'algorithme'
- For k = 0 To m - 1
- kinv = m - 1 - k
-
- 'somme des coeff.'
- somme = 0
- val = 0
- j = m - 1
- Do While j > kinv
- val = tabmat(m - 1 - k, j) * res(j)
- somme = somme + val
- j = j - 1
- Loop
- res(kinv) = (y(kinv) - somme) / tabmat(kinv, kinv)
- Next k
-
- 'écriture des résultats'
- For i = 0 To m - 1
- flex_y.Row = i
- flex_y.Text = Round(res(i), dec)
- Next i
-
- MsgBox "c'est fini!", vbInformation, "matrice 1.0.0."
-
- End Sub
-
- Private Sub cmdsecond_Click()
- For i = 0 To m - 1
- flex_yini.Row = i
- flex_yini.Text = InputBox("variable " & i, "Matrice 1.0.0.", 0)
- Next i
- Cmdresult.Enabled = True
- cmdgauss.Enabled = True
- End Sub
-
- Private Sub cmdvar_Click()
- For i = 0 To m - 1
- Flexvarini.Row = i
- Flexvarini.Text = InputBox("variable " & i, "Matrice 1.0.0.", "x" & i)
- Next i
- End Sub
-
- Private Sub Description_Click()
- MsgBox "Ce programme permet de résoudre n équations à n inconnues. Il nécessite cependant une bonne connaissance de l'utilisation des matrices. ", vbInformation, "Matrice 1.0.0."
- End Sub
-
- Private Sub Form_Load()
- Flexmat.FixedCols = 0
- Flexmat.FixedRows = 0
- Flexresult.FixedRows = 0
- Flexresult.FixedCols = 0
- m = 3
- cmdgauss.Enabled = False
- cmdmodif.Enabled = False
- Cmdresult.Enabled = False
- cmdsecond.Enabled = False
- Call Rang_Click
- End Sub
-
- Private Sub Newmat_Click()
- Flexmat.Clear
- Flexresult.Clear
- flex_yini.Clear
- flex_y.Clear
- flexvar.Clear
- txtdec.Text = ""
- Label1.Caption = ""
- Cmdresult.Enabled = False
- cmdmodif.Enabled = False
- cmdgauss.Enabled = False
- cmdsecond.Enabled = False
- Call Rang_Click
- End Sub
-
- Private Sub Quitter_Click()
- End
- End Sub
-
- Private Sub Rang_Click()
- m = InputBox("Rang de la matrice carrée :", "Matrice 1.0.0. ", 3, 100, 200)
- Flexmat.Cols = m
- Flexmat.Rows = m
- Flexresult.Cols = m
- Flexresult.Rows = m
- Flexvarini.Rows = m
- flex_yini.Rows = m
- flexvar.Rows = m
- flex_y.Rows = m
- For i = 0 To m - 1
- Flexvarini.Row = i
- Flexvarini.Text = "x" & i
- Next i
- End Sub
-
- Private Sub Rng_Click()
- Call Rang_Click
- End Sub
Dim dec As Integer
Dim tabmat() As Double
Dim m As Integer
Dim var(), y(), temp(), ytemp() As Variant
Private Sub cmdgauss_Click()
m = Flexmat.Cols
ProgressBar1.Min = 0
ProgressBar1.Max = 100
If txtdec = "" Then dec = 20 Else dec = txtdec.Text
ReDim var(m), y(m), temp(m, m), ytemp(m)
Dim pgb As Double
ReDim tabmat(m, m) As Double
Dim a, maxp, maxs As Double
'a est le coeff de l'algorithme'
a = 1
colmax = 0
rowmax = 0
maxs = 0
maxp = 0
pgb = 99 / (7 * m - 5)
'remplissage du tableau'
For i = 0 To m - 1
flexvar.Row = i
Flexvarini.Row = i
flexvar.Text = Flexvarini.Text
For j = 0 To m - 1
Flexmat.Row = i
Flexmat.Col = j
tabmat(i, j) = Flexmat.Text
Next j
Next i
ProgressBar1.Value = pgb
'''''''''''''''début de l'algorithme''''''''''''''''
'écriture dans flexresult'
For i = k To m - 1
For j = k To m - 1
temp(i, j) = tabmat(i, j)
Next j
Next i
ProgressBar1.Value = ProgressBar1.Value + pgb
'écriture dans var()'
For i = 0 To m - 1
Flexvarini.Row = i
var(i) = Flexvarini.Text
Next i
'écriture dans y()'
For i = 0 To m - 1
flex_yini.Row = i
y(i) = flex_yini.Text
Next i
For k = 0 To m - 2
'recherche du maximum'
maxp = 0
For i = k To m - 1
For j = k To m - 2
maxs = Max(tabmat(i, j), tabmat(i, j + 1))
If maxs > maxp Then maxp = maxs
Next j
Next i
ProgressBar1.Value = ProgressBar1.Value + pgb
'recherche de l'emplacement du maximum'
For i = k To m - 1
For j = k To m - 1
If temp(i, j) = maxp Then
colmax = j
rowmax = i
End If
Next j
Next i
suite:
ProgressBar1.Value = ProgressBar1.Value + pgb
'réécriture dans flexresult pour obtenir le pivot le plus grand'
'changement de la ligne'
For j = k To m - 1
temp(k, j) = Round(tabmat(rowmax, j), dec)
temp(rowmax, j) = Round(tabmat(k, j), dec)
Next j
ytemp(rowmax) = Round(y(k), dec)
ytemp(k) = Round(y(rowmax), dec)
ProgressBar1.Value = ProgressBar1.Value + pgb
'réécriture du tableau'
For i = k To m - 1
y(i) = ytemp(i)
For j = k To m - 1
tabmat(i, j) = temp(i, j)
Next j
Next i
ProgressBar1.Value = ProgressBar1.Value + pgb
'changement de colonne'
For i = k To m - 1
temp(k, i) = Round(tabmat(i, colmax), dec)
temp(colmax, i) = Round(tabmat(i, k), dec)
Next i
flexvar.Row = k
flexvar.Text = var(colmax)
flexvar.Row = colmax
flexvar.Text = var(k)
ProgressBar1.Value = ProgressBar1.Value + pgb
'réécriture du tableau'
For i = k To m - 1
flexvar.Row = i
var(i) = flexvar.Text
flex_y.Row = i
flex_y.Text = ytemp(i)
For j = k To m - 1
Flexresult.Row = i
Flexresult.Col = j
Flexresult.Text = temp(i, j)
Next j
Next i
ProgressBar1.Value = ProgressBar1.Value + pgb
For i = k + 1 To m - 1
If tabmat(k, k) <> 0 Then
a = tabmat(i, k) / tabmat(k, k) 'calcul de a'
Else
MsgBox "les équations ne sont pas indépendantes !", vbOKOnly, "erreur"
Cmdresult.Enabled = False
GoTo break
End If
y(i) = y(i) - (y(k) * a)
flex_y.Row = i
flex_y.Text = Round(y(i), dec)
For j = k To m - 1
Flexresult.Row = i
Flexresult.Col = j
tabmat(i, j) = tabmat(i, j) - (tabmat(k, j) * a)
Flexresult.Col = j
Flexresult.Row = i
Flexresult.Text = Round(tabmat(i, j), dec)
Next j
Next i
For i = 0 To m - 1
flex_y.Row = i
y(i) = flex_y.Text
For j = 0 To m - 1
tabmat(i, j) = temp(i, j)
Next j
Next i
ProgressBar1.Value = ProgressBar1.Value + pgb
Next k
'fin de l'agorithme'
ProgressBar1.Value = 0
For i = 0 To m - 1
For j = 0 To m - 1
tabmat(i, j) = temp(i, j)
Next j
Next i
Cmdresult.Enabled = True
If tabmat(m - 1, m - 1) = 0 Then
MsgBox "Les équations ne sont pas indépendantes !", vbExclamation, "Matrice 1.0.0."
Cmdresult.Enabled = False
End If
break:
MsgBox "La matrice à été simplifiée pour permettre le calcul du résultat. cliquez sur 'resultat final' pour calculer les inconnus !", vbInformation, "Matrice 1.0.0."
End Sub
Private Sub cmdmodif_Click()
Flexmat.Text = InputBox("Rentrez la nouvelle valeur :", "Matrice 1.0.0.", 0, 2000, 200)
End Sub
Private Sub cmdrandom_Click()
Randomize
For i = 0 To m - 1
flex_yini.Row = i
flex_yini.Text = Round(20 * Rnd(20), 0)
For j = 0 To m - 1
Flexmat.Col = j
Flexmat.Row = i
Flexmat.Text = Round(20 * Rnd(20), 0)
Next j
Next i
cmdmodif.Enabled = True
cmdsecond.Enabled = True
cmdgauss.Enabled = True
End Sub
Private Sub cmdremp_Click()
For i = 0 To m - 1
For j = 0 To m - 1
Flexmat.Col = j
Flexmat.Row = i
Flexmat.Text = InputBox("Veuillez rentrer la valeur de a(" & i & "," & j & ") :", "Matrice 1.0.0.", 0, 2000, 200)
Next j
Next i
cmdmodif.Enabled = True
cmdsecond.Enabled = True
End Sub
Private Sub Cmdresult_Click()
Dim res() As Double
ReDim res(m)
Dim somme, val As Double
Dim j, kinv As Integer
'initialisation de res()'
For i = 1 To m - 1
res(i) = 0
Next i
'début de l'algorithme'
For k = 0 To m - 1
kinv = m - 1 - k
'somme des coeff.'
somme = 0
val = 0
j = m - 1
Do While j > kinv
val = tabmat(m - 1 - k, j) * res(j)
somme = somme + val
j = j - 1
Loop
res(kinv) = (y(kinv) - somme) / tabmat(kinv, kinv)
Next k
'écriture des résultats'
For i = 0 To m - 1
flex_y.Row = i
flex_y.Text = Round(res(i), dec)
Next i
MsgBox "c'est fini!", vbInformation, "matrice 1.0.0."
End Sub
Private Sub cmdsecond_Click()
For i = 0 To m - 1
flex_yini.Row = i
flex_yini.Text = InputBox("variable " & i, "Matrice 1.0.0.", 0)
Next i
Cmdresult.Enabled = True
cmdgauss.Enabled = True
End Sub
Private Sub cmdvar_Click()
For i = 0 To m - 1
Flexvarini.Row = i
Flexvarini.Text = InputBox("variable " & i, "Matrice 1.0.0.", "x" & i)
Next i
End Sub
Private Sub Description_Click()
MsgBox "Ce programme permet de résoudre n équations à n inconnues. Il nécessite cependant une bonne connaissance de l'utilisation des matrices. ", vbInformation, "Matrice 1.0.0."
End Sub
Private Sub Form_Load()
Flexmat.FixedCols = 0
Flexmat.FixedRows = 0
Flexresult.FixedRows = 0
Flexresult.FixedCols = 0
m = 3
cmdgauss.Enabled = False
cmdmodif.Enabled = False
Cmdresult.Enabled = False
cmdsecond.Enabled = False
Call Rang_Click
End Sub
Private Sub Newmat_Click()
Flexmat.Clear
Flexresult.Clear
flex_yini.Clear
flex_y.Clear
flexvar.Clear
txtdec.Text = ""
Label1.Caption = ""
Cmdresult.Enabled = False
cmdmodif.Enabled = False
cmdgauss.Enabled = False
cmdsecond.Enabled = False
Call Rang_Click
End Sub
Private Sub Quitter_Click()
End
End Sub
Private Sub Rang_Click()
m = InputBox("Rang de la matrice carrée :", "Matrice 1.0.0. ", 3, 100, 200)
Flexmat.Cols = m
Flexmat.Rows = m
Flexresult.Cols = m
Flexresult.Rows = m
Flexvarini.Rows = m
flex_yini.Rows = m
flexvar.Rows = m
flex_y.Rows = m
For i = 0 To m - 1
Flexvarini.Row = i
Flexvarini.Text = "x" & i
Next i
End Sub
Private Sub Rng_Click()
Call Rang_Click
End Sub
Conclusion
bientôt la version 1.0.1 plus rapide ! e-mail: zegratman@caramail.com
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|