Programme de calcul d'incertitudes iut mesures physiques

Description

JE PRECISE QUE LE PROGRAMME N'EST PAS TOUT A FAIT AU POINT !
Toute manipulation en Physique (Mécanique, Optique, Chimie, Electronique, Electricité,...), se basant sur des expérimentations, engendre des imprécisions sur la mesure effectuée. En conséquence, il est nécessaire de calculer cette incertitude de mesure due à la précision des appareils, de la manipulation… Pour se faire, nous nous basons sur une formule générale de calcul d’incertitude. Sur une formule du type :

On applique la formule suivante afin de déterminer l’incertitude sur la valeur souhaitée :

Ainsi le programme que nous allons effectuer sera censé effectuer ce calcul automatiquement. Il suffira d’entrer les valeurs de chaque terme ainsi que les incertitudes sur chacun de ces termes pour que le logiciel calcule l’incertitude composée et l’incertitude élargie (incertitude composée multipliée par 2) selon la loi rectangulaire (chaque précision doit être divisée par racine de 3). Ainsi on a 95 % de chance que la valeur théorique se situe dans l’incertitude calculée.
Nous restreindrons les possibilités de calcul du programme à un quotient simple où toutes les variables seront successivement dérivées. Ainsi après la saisie du nombre de termes du numérateur et du dénominateur, il ne restera plus qu’à saisir les valeurs numériques de chaque grandeur suivie des incertitudes absolues.
Ce programme aura une utilité toute particulière dans les dosages pHmétriques où l’on utilise souvent une formule se présentant sous la forme d’un quotient.
Appliquée à un quotient, la formule générale se simplifie quelque peu, elle devient :

Le programme se compose de :
- 9 textbox dont 6 pour l’entrée des données et un pour l’affichage
- 10 labels pour la plupart statiques mais dont 2 servent à afficher le numéro du terme
- 3 commandeboutons : Recommencer, Calculer, Quitter

Le plus important dans la réalisation de ce programme est la création d’un tableau qui nous permettra de stocker toutes les données rentrées par l’utilisateur. Pour cela nous commencerons par créer un tableau à 18 lignes et 2 colonnes qui va limiter le nombre de numérateurs à 9 et le nombre de dénominateurs à 9. En effet, nous stockons les grandeurs en première colonne et les incertitudes sur ces grandeurs en deuxième colonne en face de leur grandeur respective. Cependant, si l’utilisateur entre 9 termes au numérateur et 9 au dénominateur, les 9 termes du numérateurs seront stockés dans les 9 premières lignes du tableaux tandis que les 9 termes du dénominateur seront stockés de la ligne 10 à la ligne 18. Ainsi quoiqu’il en soit, il nous reste la colonne 0 et la ligne 0 intégralement vides. Puis en manipulant les données dans le tableau (colonne 0) à l’aide d’une procédure Calcul qui effectuera le calcul précédent, nous obtiendrons le résultat dans une fenêtre de texte.
Des tests seront effectués tout au long de l’entrée des données afin de s’assurer de l’absence d'erreur susceptible de planter le programme. Seul le bouton Recommencer ne fonctionne pas correctement, je suppose que le tableau ne se met pas véritablement à 0, les résultats étant sans cesse différents lorsque l’on utilise le bouton Recommencer.

Source / Exemple :


Option Explicit
    'Création d'un tableau afin d'y placer les valeurs
    'des grandeurs et des incertitudes'
    'Ouverture de toutes les variables necessaire au stockage et au calcul'
    Dim singleatab(18, 2)
    Dim ligne, colonne, NBNU, NBDE, CUMUL, I, W As Integer
    Dim TOT, RESULT As Single

'Bouton Quitter'
Private Sub cmdQuitter_Click()
End
End Sub
'Bouton Recommencer : Remise à 0 de toutes les fenêtres.
'En cas d'erreur dans l'entrée des données, les fenêtres
'doivent redevenir blanches'
'Remise à 0 du tableau : retour à la ligne 0 du tableau'
'Placement du curseur dans la case nombre de termes au numérateur'
Private Sub cmdRecommencer_click()
txtNbtermesNu = ""
txtNbtermesDe = ""
txtResultat = ""
txtGrandeurNu = ""
txtGrandeurDe = ""
txtIncertitudeNu = ""
txtIncertitudeDe = ""
lblTermesNu = ""
lblTermesDe = ""
txtNbtermesNu.BackColor = &H80000005
txtNbtermesDe.BackColor = &H80000005
txtGrandeurNu.BackColor = &H80000005
txtGrandeurDe.BackColor = &H80000005
txtIncertitudeNu.BackColor = &H80000005
txtIncertitudeDe.BackColor = &H80000005
ligne = 0
txtNbtermesNu.SetFocus

End Sub

'Case Nombre de termes au numérateur :'
Private Sub txtnbtermesNu_keypress(keyascii As Integer)
       Select Case keyascii
            Case 13
'Réalisation d'un test de remplissage de la case afin d'éviter tout bug'
'Si le test est négatif (case vide), la case devient grise et la case
'réservée au résultat affiche "Entrer Chiffre"
'le programme attend l'entrée d'un terme pour continuer'
                If txtNbtermesNu.Text = "" Then
                    txtNbtermesNu.SetFocus
                    txtNbtermesNu.BackColor = &H80000000
                    txtResultat.Text = "ENTRER CHIFFRE !"
'Si test positif (entrée d'un terme) et que la touche entrée est pressée,
'le curseur passe a la case Nombre de termes au dénominateur'
                Else
            NBNU = Val(txtNbtermesNu.Text)
            txtNbtermesDe.SetFocus
            txtNbtermesNu.BackColor = &H80000005
            txtResultat.Text = ""
                End If
'Les caractères autorisés dans cette case sont la touche d'effacement,
'les chiffres et la virgule'
        Case 8, 49 To 57
        Case Else
            Beep
            keyascii = 0
        End Select
    End Sub
'Case Nombre de termes au dénominateur :'
Private Sub txtnbtermesDe_keypress(keyascii As Integer)
    Select Case keyascii
        Case 13
'meme test que précédement'
        If txtNbtermesDe.Text = "" Then
        txtNbtermesDe.SetFocus
        txtNbtermesDe.BackColor = &H80000000
        txtResultat.Text = "ENTRER CHIFFRE !"
'Si test positif, une case affiche "terme1" en face des cases
'Grandeur et Incertitude pour le numérateur, indiquant ainsi
'qu'il faut entrer les grandeurs et incertitudes du terme 1'
        Else
            NBDE = Val(txtNbtermesDe.Text)
            CUMUL = NBNU + NBDE
            txtGrandeurNu.SetFocus
            txtNbtermesDe.BackColor = &H80000005
            lblTermesNu.Caption = "Terme 1"
            txtResultat.Text = ""
            End If
            Case 8, 49 To 57
        Case Else
            Beep
            keyascii = 0
        End Select
    
End Sub
'Case Grandeur du numérateur'
Public Sub txtGrandeurNu_keypress(keyascii As Integer)
    Select Case keyascii
        Case 13
'même test que précédement'
            If txtGrandeurNu.Text = "" Then
        txtGrandeurNu.SetFocus
        txtGrandeurNu.BackColor = &H80000000
        txtResultat.Text = "ENTRER CHIFFRE !"
'Envoie du curseur à la case Incertitudes du numérateur'
            Else
            txtIncertitudeNu.SetFocus
            txtGrandeurNu.BackColor = &H80000005
            txtResultat.Text = ""
            End If
        Case 8, 46, 48 To 57
        Case Else
            Beep
            keyascii = 0
        End Select
End Sub
'Case incertitudes du numérateur'
Public Sub txtIncertitudeNu_keypress(keyascii As Integer)
    Select Case keyascii
        Case 13
'même test que précédement'
            If txtIncertitudeNu.Text = "" Then
        txtIncertitudeNu.SetFocus
        txtIncertitudeNu.BackColor = &H80000000
        txtResultat.Text = "ENTRER CHIFFRE !"
'si test positif, appel de la procédure stocke1 qui a pour but de
'savoir si l'on doit continuer à rentrer des termes au numérateur
'ou si l'on doit passer à la saisie des termes du dénominateur'
            Else
            Stocke1
            txtIncertitudeNu.BackColor = &H80000005
            txtResultat.Text = ""
            End If
        Case 8, 46, 48 To 57
        Case Else
            Beep
            keyascii = 0
        End Select
End Sub

'Case Grandeur du dénominateur'
Private Sub txtGrandeurDe_keypress(keyascii As Integer)
    Select Case keyascii
        Case 13
'même test que précédement'
            If txtGrandeurDe.Text = "" Then
        txtGrandeurDe.SetFocus
        txtGrandeurDe.BackColor = &H80000000
        txtResultat.Text = "ENTRER CHIFFRE !"
            Else
            txtIncertitudeDe.SetFocus
            txtGrandeurDe.BackColor = &H80000005
            txtResultat.Text = ""
            End If
        Case 8, 46, 48 To 57
        Case Else
            Beep
            keyascii = 0
        End Select
End Sub
'Case Incertitude du dénominateur'
Private Sub txtIncertitudeDe_keypress(keyascii As Integer)
    Select Case keyascii
        Case 13
'même test que précédemment
            If txtIncertitudeDe.Text = "" Then
                txtIncertitudeDe.SetFocus
                txtIncertitudeDe.BackColor = &H80000000
                txtResultat.Text = "ENTRER CHIFFRE !"
'Si test positif, appel de la procédure stocke2 qui a les mêmes
'fonctions que stocke1 mais pour le dénominateur'
            Else
            Stocke2
            txtIncertitudeDe.BackColor = &H80000005
            End If
            Case 8, 46, 48 To 57
        Case Else
            Beep
            keyascii = 0
        End Select
End Sub

'Procédure stocke1 : numérateur'
'stockage des valeurs des grandeurs dans la colonne 1 du tableau
'avec passage à la ligne suivante pour chaque grandeur'
'En colonne 2 du tableau on place les incertitudes correspondants
'aux grandeurs à la même ligne que celles-ci'
Public Sub Stocke1()
    ligne = ligne + 1
    singleatab(ligne, 1) = Val(txtGrandeurNu.Text)
    singleatab(ligne, 2) = Val(txtIncertitudeNu.Text)
'Test : Si toutes les données du numérateur sont entrées,
'on passe au dénominateur( procédure stocke2)'
        If ligne = NBNU Then
            lblTermesDe.Caption = "Terme 1"
            txtGrandeurDe.SetFocus
       End If
'Sinon, Entrée de toutes les valeurs et de leurs incertitudes
'correspondant au numérateur'
    If ligne < NBNU Then
            txtGrandeurNu.Text = ""
            txtIncertitudeNu.Text = ""
            txtGrandeurNu.SetFocus
            lblTermesNu.Caption = "Terme " & ligne + 1
            End If
End Sub

'Procédure stocke2 : dénominateur'
'stockage des grandeurs en colonne1 mais à la suite de stocke1 c'est à dire
'à la suite des valeurs du numérateur'
'De meme nous stockons les incertitudes correspondantes en colonne2'
Public Sub Stocke2()
    ligne = ligne + 1
    singleatab(ligne, 1) = Val(txtGrandeurDe.Text)
    singleatab(ligne, 2) = Val(txtIncertitudeDe.Text)
'Test : Lancement de la procédure de Calcul si toutes les données du dénominateur
'sont entrées dans le tableau'
        If ligne = CUMUL Then
            Calcul
        End If
'Sinon, entrée de toutes les valeurs et de leurs incertitudes
'correspondant au dénominateur'
        If ligne < CUMUL Then
            txtGrandeurDe.Text = ""
            txtIncertitudeDe.Text = ""
            lblTermesDe.Caption = "Terme " & ligne - NBNU + 1
            txtGrandeurDe.SetFocus
        End If
End Sub
'TOUTES LES DONNES SONT STOCKEES DANS LE TABLEAU : IL NE RESTE PLUS QU'A
'LES MANIPULER POUR OBTENIR L'INCERTITUDE COMPOSEE SYSTEMATIQUE'
'Procédure de Calcul (voir détail sur la présentation jointe)'
Public Sub Calcul()
    TOT = 1
    'numérateur : dérivés partielles avec ligne = variable'
    For I = 1 To NBNU
    TOT = TOT * singleatab(I, 1)
    Next
    'dénominateur : dérivés partielles avec ligne = variable'
    W = NBNU + 1
    For I = W To CUMUL
    TOT = TOT / singleatab(I, 1)
    Next
    TOT = (TOT ^ 2) / 3
    'Calcul finale : prise en compte des incertitudes absolues sur chaque terme'
    For I = 1 To CUMUL
    singleatab(I, 0) = TOT * (singleatab(I, 2) ^ 2) / (singleatab(I, 1) ^ 2)
    RESULT = RESULT + singleatab(I, 0)
    Next
    'Affichage du résultat dans la case txtresultat + présentattion'
    RESULT = Sqr(RESULT)
    txtResultat.Text = "INCERTITUDE" & vbCrLf & "Composée : " & vbCrLf & "uc = " _
    & RESULT & vbCrLf & " soit uc = " & Format(RESULT, "0.00") & vbCrLf & "Elargie :" _
    & vbCrLf & "Uc = " & RESULT * 2 & vbCrLf & " soit Uc = " & Format(RESULT * 2, "0.00")
End Sub

'Bouton de commande Calculer : même fonction que la touche Entrée en fin de saisie'
Private Sub cmdCalculer_Click()
txtResultat.Text = RESULT
End Sub

Conclusion :


Ci-joint le fichier-source du programme (fichier visual basic). Ecrivez-moi en cas de problème !

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.