Approximation d'une courbe "particulière" sous Excel par une droite affine [Résolu]

SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 12 nov. 2011 à 17:13 - Dernière réponse : SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention
- 16 nov. 2011 à 23:58
Bonjour à tous, bonjour le Forum,

Bien bien, me voici une nouvelle fois ici pour un nouveau besoin. Je donnerais un peu plus loin des éléments de contexte ainsi que les besoins qui animent ma venue ici.

Cette fois-ci, je pense que ma demande est un peu plus complexe que d'habitude. Je pense également, qu'elle s'adressera plus particulièrement à des développeurs expérimentés (en tout cas bien plus expérimentés que moi ça c'est sur^^). Je rappel que je suis débutant sous Vba mais ayant acquis de bonnes bases tout de même. Bien évidement tout le monde peut participer et je prends tous les conseils !

Bien maintenant entrons un peu plus dans le sujet... Je vous conseil de télécharger le fichier Excel (2003) que j'ai mis en en téléchargement en bas de page pour que vous compreniez beaucoup mieux au fur et à mesure de la lecture ;)

Je travail sous Excel 2007, et je cherche à développer une Macro. Dans mon fichier Excel et dans la première feuille intitulée "DONNÉES" il y a un graphique. Ce graphique est tracé grâce à deux colonnes. Une première colonne pour les abscisses et une autre pour les ordonnées. En ce qui concerne les valeurs qui se trouvent dans les colonnes, on va dire qu'elles sont acquises de manière expérimentale et donc qu'il n'y a pas de formule pour trouver ces points. Pas de formule...donc pas d'équation de courbe non plus !
De plus comme vous le remarquerez très bien, cette courbe ne respecte pas l'unicité de solution. C'est à dire que pour une valeur d'abscisse X, il n'existe pas une et une seule solution. C'est bien la un des problèmes qui me pousse à développer une macro évoluée.

Maintenant que j'ai dit sa, je vais pouvoir exprimer la problématique. Voici ce que je cherche à faire sur ce graphique.

Dans une tierce colonne, il y a des valeurs qui représentent des abscisses. Et mon but va être d'associer les bonnes ordonnées qui correspondent à la colonne des abscisses par lecture graphique. Ce travail est fastidieux car il peut y avoir une cinquantaine de valeurs à lire. De plus, pour chaque abscisse il peut y avoir de multiples intersections et donc qu'il faut à chaque fois lire plusieurs ordonnées pour une même abscisse. J'ai mis en évidence ce problème sur la feuille numéro deux du fichier Excel intitulée "EXEMPLE". On y voit la multi-intersection d'une courbe par une unique valeur d'abscisse.
J'ajouterais que pour ne rien faciliter, mon graphique se trouve sur une feuille Excel, et ma colonne qui contient les valeurs des abscisses en attente de réception d'ordonnées se trouve sur une autre feuille. Du coup il faut sans arrêt jongler entre les feuilles Excel. Pas cool !

Du coup je me suis dit qu'il serait sans doute jouable via une macro Excel de faire en sorte de venir lire les valeurs sur le graphique à la place de l'utilisateur. Malheureusement, ce sont des données expérimentales et il n'y a pas d'équation de courbe qui tienne pour éventuellement calculer les valeurs d'ordonnées en fonction des abscisses. De plus, apparemment Excel ne gère pas l'intersection de courbes sur un graphique pour remonter à la cordonnée d’intersection. Pour lui, les courbes se superposent mais il ne détecte pas le passage de l'une sur l'autre. Vraiment dommage ! A moins que je me trompe ???

Du coup la seule solution que j'ai trouvé actuellement est de travailler par petits intervalles de valeurs d'abscisses et de faire une approximation linéaire par une droite affine de la forme "Y = a*X + b". Du coup pour une valeur d'abscisse données, on va chercher à encadrer cette abscisse par la première immédiatement plus petite, et la première immédiatement plus grande que la valeur d'abscisse désiré. De cette façon, on encadre l'abscisse voulu par deux autres abscisses dont on connait les ordonnées respectives. Il ne reste plus qu'a faire l’approximation linéaire et à en déduire l'ordonnée qui correspond à la valeur d’abscisse qui était demandée initialement.
Pour que sa soit plus clair pour tous, j'ai mis en feuille trois intitulée "MODÉLISATION DU PROBLÈME" la visualisation de ce que je viens de dire. Vous verrez ce n'est pas compliqué quand on voit l'exemple.

Évidement, comme pour une abscisse il peut y avoir plusieurs intersections possible, il ne faut pas oublier de boucler sur toutes les valeurs du graphique pour mettre en évidence toutes les possibilités possibles. Ce sont des choses très simples que je demande mais qui mis bout à bout deviennent vites complexes (pour moi en tout cas !)

Enfin, il y aura également une partie "visuelle" à traiter. En effet, comme il y a plusieurs solutions pour une abscisse l'idée serait de faire afficher dans une fenêtre toutes les solutions trouvées et de demander à l'utilisateur laquelle il désire garder. Que la solution choisie soit ensuite copiée dans la cellule en face de l’abscisse initiale. Et puis que le programme recommence avec une autre abscisse qui se trouve dans la cellule des abscisses suivantes...
Pour info, les valeurs d'abscisses seront étudiées dans l'intervalle [0;1] UNIQUEMENT et les valeurs d'ordonnées seront étudiées dans l'intervalle [0;500E-9] UNIQUEMENT. Les autres valeurs ne m'intéressement pas.

C'est pourquoi je viens faire appel à votre aide. Cette demande n'est pour moi pas vraiment prioritaire car ce n'est pas indispensable pour la suite de mes idées. Néanmoins, maintenant que j'ai eu l'idée d'aller plus loin et de proposer une solution envisageable ; et bien je suis vraiment curieux de voir ce que sa peut donner une fois codé. Je vais tout faire pour tenter l'expérience mais je n'ai pas le temps à me casser la tête sur ce code. C'est dommage mais c'est comme sa. Voila pourquoi je vous demande un petit coup de main pour essayer d'avancer plus vite.

Je reste disponible pour toutes vos questions que vous pourriez avoir, et évidement je reste dans le coin du mieux que je peux pour aider moi aussi.

Voila c'est finit pour le moment. J'avais averti, c'est un peu plus costaud cette fois-ci^^

Cordialement,

André


Ps : Pour accéder au fichier cliquez sur le lien ci-dessous et entrez les identifiants.
Fichier : http://www.partage-fichiers.com/upload/w4u8d42a
Utilisateur : vyq4a4ut
Mot de passe : c7e1sika
Ce fichier est disponible durant 15 jours.
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 16 nov. 2011 à 23:58
3
Merci
Bien me revoici avec des news plus que fraîches.
Avec l'aide d'un développeur nous avons réussi à réponde à ma demande initiale.

Je post donc ci-après la version la plus à jour de ce fameux code. Merci pour l'aide apportée.

André


Dans un module :

Option Explicit
Option Base 1
Option Private Module

Public fini As Boolean
Public ligListeAbs As Long
Public tabl As Variant
Public shDest As Worksheet, shDatas As Worksheet, shCourbe As Worksheet
Public datasX As Range, datasY As Range
Public modeValLibre As Boolean
Public memoOK As Boolean
Public Const offsetLigData As Long =   3

Sub multiAbscisses()
    Dim ctrl As Control
    ReDim tabl(10)
    Set shDest = Worksheets("Liste Abscisses")
    Set shDatas = Worksheets("DONNÉES")
    Set shCourbe = Worksheets("EXEMPLE")

    Set datasX = shDatas.[B1].Offset(offsetLigData, 0).Resize(shDatas.[B65536].End(xlUp).Row - offsetLigData, 1)
    Set datasY = shDatas.[C1].Offset(offsetLigData, 0).Resize(shDatas.[B65536].End(xlUp).Row - offsetLigData, 1)
    ligListeAbs = Application.Max(ligListeAbs, 2)
    ' déselection OptionButton
    For Each ctrl In UserForm1.Controls
        'Vérifie si OptionButton
        If TypeOf ctrl Is MSForms.OptionButton Then
            'si OptionButton sélectionné
            ctrl.Value = False
        End If
    Next

    UserForm1.SpinBtnLigAbs.Min = 2
    UserForm1.SpinBtnLigAbs.Max = shDest.[A65536].End(xlUp).Row
    UserForm1.SpinBtnLigAbs.Value = Application.Max(UserForm1.SpinBtnLigAbs.Value, 2)
    initAffOptionBtn
    UserForm1.Show False
End Sub

Sub initAffOptionBtn()
    Dim ctrl As Control, i As Long, msg As String
    ligListeAbs = UserForm1.SpinBtnLigAbs.Value
    msg = " Abscisse en cours : " & Format(shDest.Cells(ligListeAbs, 1), "0.000") & " (ligne " & ligListeAbs & ")"
    UserForm1.Label1.Caption = msg
    tabl = interpolation(datasX, datasY, shDest.Cells(ligListeAbs, 1))    ' pour initialisation 1er affichage userform
    For i = 1 To 10
        For Each ctrl In UserForm1.Controls
            If ctrl.Name = "OptionButton" & i Then
                If tabl(i) > 0 Then
                    ctrl.Caption = FormatEng(tabl(i))
                    ctrl.Visible = True
                    If CDbl(ctrl.Caption) = shDest.Cells(ligListeAbs, 2) Then
                        ctrl.Value = True
                    Else
                        ctrl.Value = False
                    End If
                    ctrl.Enabled = True
                Else
                    ctrl.Caption = ""
                    ctrl.Visible = False
                    ctrl.Value = False
                End If
                Exit For
            End If
        Next ctrl
    Next i
    ' maj ligne verticale dans la courbe
    shCourbe.[E31] = shDest.Cells(ligListeAbs, 1)
End Sub

Sub affModeValLibre()
    Dim ctrl As Control, i As Long, nbval As Long
    '
    tabl = interpolation(datasX, datasY, UserForm1.TbxValeurLibre)
    For i = 1 To 10
        For Each ctrl In UserForm1.Controls
            If ctrl.Name = "OptionButton" & i Then
                If tabl(i) > 0 Then
                    ctrl.Caption = FormatEng(tabl(i))
                    ctrl.Visible = True
                    ctrl.Value = False
                    ctrl.Enabled = False
                Else
                    ctrl.Caption = ""
                    ctrl.Visible = False
                    ctrl.Value = False
                End If
                Exit For
            End If
        Next ctrl
    Next i
    ' maj ligne verticale dans la courbe
    shCourbe.[E31] = CDbl(UserForm1.TbxValeurLibre)
End Sub
Function interpolation(datasX As Range, datasY As Range, valeur As Double, Optional enColonne As Boolean = False) As Variant
    Dim lig As Long, pente As Double, ordonnéeOri As Double, ordonnéePt As Double, tablOrd As Variant, ptr As Long
    ' tableau de stockage des ordonnées des intersections
    ReDim tablOrd(10)
    ' pointeur d'intersections
    ptr = 1
    ' pour chaque ligne de données
    For lig = 1 To datasX.Rows.Count - 1
        ' si l'abcisse et la suivante encadre la valeur recherchée
        If (datasX(lig, 1) >= valeur And datasX(lig + 1, 1) <= valeur) Or (datasX(lig, 1) <= valeur And datasX(lig + 1, 1) >= valeur) Then
            ' calcul de la droite de régression linéaire
            pente = Application.WorksheetFunction.Slope(datasY(lig, 1).Resize(2, 1).Value, datasX(lig, 1).Resize(2, 1).Value)
            ordonnéeOri = WorksheetFunction.Intercept(datasY(lig, 1).Resize(2, 1).Value, datasX(lig, 1).Resize(2, 1).Value)
            ' évaluation de l'ordonnée
            ordonnéePt = pente * valeur + ordonnéeOri
            ' si l'ordonnée calculée est dans les critères
            If ordonnéePt <= 0.0000005 And ordonnéePt >= 0 Then
                ' stocker l'ordonnée
                tablOrd(ptr) = ordonnéePt
                ' ordonnée suivante
                ptr = ptr + 1
                ' si maxi intersection atteint, on sort
                If ptr > UBound(tablOrd) Then Exit For
            End If
        End If
    Next lig
    ' retourner la matrice de résultats
    If enColonne Then
        interpolation = Application.Transpose(tablOrd)
    Else
        interpolation = tablOrd
    End If
End Function

Function FormatEng(Nombre As Variant, Optional nbDecimales As Long = 2) As String
    'source : http://www.generation-nt.com/reponses/nombre-format-ingenieur-entraide-3222151.html#17586851
    Dim Exposant As Long
    Dim Parts() As String
    Parts = Split(Format(Nombre, "0.0#############E+0"), "E")
    Exposant = 3 * Int(Parts(1) / 3)
    FormatEng =  Format(Parts(0) * 10 ^ (Parts(1) - Exposant), "0." & String(nbDecimales, "0")) & "E" & Format(Exposant, "+0;-0")
End Function


Puis dans une feuille (Un formulaire quoi^^) :

Option Explicit

Private Sub Label2_Click()

End Sub

Private Sub TbxValeurLibre_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii <> 44 And KeyAscii <> 48 And KeyAscii <> 49 And KeyAscii <> 50 And KeyAscii <> 51 And KeyAscii <> 52 And KeyAscii <> 53 And KeyAscii <> 54 And KeyAscii <> 55 And KeyAscii <> 56 And KeyAscii <> 57 Then 'Filtre les valeurs
KeyAscii    = 127
End If

End Sub

Private Sub BtnDernierVal_Click()
    If modeValLibre Then TbxValeurLibre = ""
    If BtnDernierVal.Tag <> "" Then UserForm1.SpinBtnLigAbs.Value = BtnDernierVal.Tag
End Sub

Private Sub BtnQuitter_Click()
    If modeValLibre Then TbxValeurLibre = ""
    fini = True
    Me.Hide
    ' suppression ligne en cours dans shDest en vert
    shDest.[A2].Resize(shDest.[A65536].End(xlUp).Row - 1, 2).Interior.ColorIndex = xlNone
End Sub

Private Sub BtnValider_Click()
    Dim ctrl As Control, ok As Boolean, i As Long
    ligListeAbs = Me.SpinBtnLigAbs.Value
    '
    ' recherche optionbutton validé
    For Each ctrl In UserForm1.Controls
        'Vérifie si OptionButton
        If TypeOf ctrl Is MSForms.OptionButton Then
            'si OptionButton sélectionné
            If ctrl.Value Then
                ok = True
                Exit For
            End If
        End If
    Next
    If ok Then
        shDest.Cells(ligListeAbs, 2) = CDbl(ctrl.Caption)
        UserForm1.BtnDernierVal.Tag = ligListeAbs
    Else
        MsgBox ("Pas de valeur sélectionnée")
    End If
End Sub

Private Sub TbxValeurLibre_Change()
    Dim c As Range
    If IsNumeric(TbxValeurLibre) Then
        modeValLibre = True
        UserForm1.BtnValider.Enabled = False
        'TbxValeurLibre = Application.Max(Application.Min(TbxValeurLibre, 1), 0)
        If Not memoOK Then
            TbxValeurLibre.Tag = shCourbe.[E31]
            memoOK = True
        End If
        affModeValLibre
    Else
    'ElseIf TbxValeurLibre <> "." Then
        modeValLibre = False
        shCourbe.[E31] = TbxValeurLibre.Tag
        memoOK = False
        initAffOptionBtn
    End If
End Sub

Private Sub SpinBtnLigAbs_Change()
    If modeValLibre Then TbxValeurLibre = ""
    initAffOptionBtn
End Sub

Private Sub SpinButton1_Change()
    ' scrolling Hz
    Select Case SpinButton1
    Case 0
        ActiveWindow.SmallScroll Toleft:=1
    Case 2
        ActiveWindow.SmallScroll Toright:=1
    End Select
    SpinButton1.Value = 1
End Sub

Private Sub ScrollBar1_Change()
    ' scrolling Vt
    Select Case ScrollBar1
    Case 0
        ActiveWindow.SmallScroll up:=3
    Case 2
        ActiveWindow.SmallScroll down:=3
    End Select
    ScrollBar1.Value = 1
End Sub

Private Sub TbxLigne_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If modeValLibre Then TbxValeurLibre = ""
    If IsNumeric(TbxLigne) Then
        TbxLigne = Application.Max(Application.Min(CLng(TbxLigne), SpinBtnLigAbs.Max), SpinBtnLigAbs.Min)
        UserForm1.SpinBtnLigAbs.Value = TbxLigne
    End If
End Sub

Private Sub OptionButton1_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton2_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton3_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton4_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton5_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton6_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton7_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton8_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton9_Click()
    Me.BtnValider.Enabled = True
End Sub

Private Sub OptionButton10_Click()
    Me.BtnValider.Enabled = True
End Sub



Pour plus de détails, référez vous au fichier Excel (Qui ne restera pas indéfiniment stocké en ligne)

A bientôt,

André

Ps : Le lien de téléchargement.
http://www.packupload.com/0SBJGGNTAQJ

Merci SERIEUXETCOOL 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de SERIEUXETCOOL
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 12 nov. 2011 à 19:56
0
Merci
Ah ! .... Ah ah ah ...!
Je viens de tout lire et de tout regarder ...
Voilà qui m'intéresse, en effet.
Je sors toutefois d'un bon repas (déjà, oui) )précédé d'un bon apéro (pisco sour maison, pour les initiés), et sais qu'il va m'être pour l'instant difficile de te parler (tu te rappelles la pêche à la daurade ?) de choses bizarres, telle la peinture et la palette du peintre (hé oui !).
Je le ferai demain, quand mon esprit sera plus "libre", mais tu vas voir : nous allons passer à la peinture (bel exemple), à moins que tu ne préfères parler artisanat (et alors : véritable horizontabilité ou horizontabilité visuelle et harmonieuse ?) pour imager dans l'esprit (le verbe n'est pas choisi au hasard) la philosophie de ce problème. Ce sera à la fois éloigné et très proche de ce que tu cherches (hé oui )
A demain, donc.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 12 nov. 2011 à 20:04
0
Merci
Mais dis-moi quand même (si possible car cela peut aider) : tu préfères quelle analogie, entre la peinture et l'artisanat ?. Et je choisirais en fonction de cette très importante réponse.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 12 nov. 2011 à 21:22
0
Merci
Re bonsoir le Forum, Ucfoutu

Je suis content que mon problème te plaise Ucfoutu ! (Ouf, ça commence bien au moins^^). Oui le problème que je soulève est à la fois original, curieux et pas si simple que sa en même temps. Mais sa donne envie de relever le défi.

Pour le pisco sour maison je ne connais pas. Un jours surement^^ J'attends avec impatience l'histoire que tu as à me raconter sur la peinture ou sur l'artisanat. Je suis curieux d'en savoir plus et d'établir le lien.
Malheureusement je n'ai pas de préférence pour l'une ou l'autre car je n'ai rien compris pour être franc. L'artisanat ou la peinture me dit tu ??? J'ai beau chercher, je ne trouve aucun éléments de réponse lol.

Je te laisse faire le choix qui t'inspirera le plus. En tout cas, l'exemple des daurades était superbe la dernière fois !

On se retrouve demain pour poser deux ou trois bases de départ "comme d'habitude" j'ai presque envie de dire^^

Merci d'avance et surtout repose toi bien du coup

André

A tous les autres, vos idées restent les bienvenues de manière évidente.
Commenter la réponse de SERIEUXETCOOL
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 nov. 2011 à 20:54
0
Merci
Ouais... tu hésites entre peinture et artisanat, hein ?
Et tu dois me trouver bien silencieux ... (mais tu ne perds rien pour attendre)
1) je serais assez tenté de te parler à la fois des deux : ====>>>
Je choisirais bien l'exemple de fabrication de la garance (teinte) à partir de la racine de garance (végétal)
J'ai un ami (mon jumeau, peut-être) qui est à la fois peintre et artisan. Ce fou-là fait lui-même sa propre garance (la teinte). Il utilise bien sûr des racines de garance et de l'acide (il a, en ce qui le concerne, choisi l'acide chlorhydrique - HCl).
Et il s'est aperçu de ce que la température de "chauffe" dépendait directement de la solution d'acide (plus la solution était concentrée, moins la température devait être nécessairement élevée)?.
Bien ! mais voilà le(s) hic(s) ===>>
a) - pas de proportionnalité "linéaire"
b) - pas de proportionnalité "exponentielle" apparente non plus
=>>
Juste des constatations totalement empiriques

et il ne pouvait quand-même pas (trop de temps nécessaire) faire un million d'expériences avec des combinaisons multiples de concentration et de température
==>> mais il a résolu, lui, le problème, en recherchant, à partir de données d' "expérience" une moyenne des moyennes. La chose était possible, dès lors qu'en dépit des progressions (inverses) linéaires ou exponentielles, la courbe de tendance allait toujours "dans le même sens"

2) N'empêche ! il s'est toujours demandé ce qu'il aurait bien pu faire si ses expérimentations l'avaient conduit à la constatation d'un phénomène de type Hysteresis, mais encore plus complexe du fait d'inversions de sens ne répondant elles-même pas à une logique établie (contrairement aux phénomènes de type Hystéresis)
=>> quelle moyenne des moyennes "tirer" alors de manière raisonnable ? encore quelque peu possible lorsque les points d' "inversion" sont au moins "prédictibles". totalement impossible dans les cas contraires, puisque l'on ne sait pas trop quand les choses, changeant de sens, vont rendre très approximatif, voire totalement erroné, un calcul des "moyennes de moyennes"

Voilà, ami : je voulais te parler de tout cela avant de continuer. Ta/tes réaction(s) à l'exposé de mes présents états d'âme sont susceptibles de me permettre de décider de la méthode la moins "risquée"
Je t'écoute, maintenant.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 nov. 2011 à 21:10
0
Merci
Ah !
Je me relis et me demande si je suis assez clair !
Peut-être ainsi, alors :
prenons l'exemple d'un couple thermoélectrique (deux métaux différents - deux soudures, dont une "froide" et une "chaude")===>> constatation d'une amplitude différente selon (oublions les métaux eux-mêmes, qu'on ne fera pas varier) en fonction de la différence de température entre la "soudure froide" et la "soudure chaude". Mais voilà, au-delà d'une "amplitude de différences", la courbe s'inverse. Mais là ==>> encore heureux ===>> elle s'inverse à la même "cadence" que lors de la progression.
Problème : quid si, contrairement à cet exemple, l'inversion de la courbe ne se faisait pas à la même "cadence" ?
Pire : quid si, au delà d'une certaine différence (et alors qu'elle était en "régression") la courbe s'inversait à nouveau, mais sans que cette nouvelle "inversion" ne corresponde ni à la première progression, ni à l'inversion suivante ?
Ce n'est heureusement pas le cas en ce qui concerne les couples thermoélectriques, mais cela ressemble assez à ton cas à traiter


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 nov. 2011 à 21:31
0
Merci
En fait (et pour parler de choses plus concrètes) : le problème serait assez facile à résoudre avec VB6 et une picturebox.
Il l'est moins avec VBA/Excel !
Je me demande en réalité comment utiliser la collection TrendLines avec un graphique, lorsqu'existe plus d'une intersection.
J'en suis à bûcher cette voie.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 nov. 2011 à 07:00
0
Merci
Ouais..
Dis-moi : ta courbe a-t-elle toujours à peu près le même aspect (faussement sinusoïdal )?
Si oui : peux-tu envisager l'inversion des abscisses et des ordonnées (donner sur l'axe des ordonnées des valeurs de la colonne abscisses et sur l'axe des abcisses celles de la colonne ordonnées ? (car là est peut-être la solution, avec l'ajout une trendline (courbe de tendance) de type "movingaverage" (constante VBA/Excel xlMovingAvg).
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 nov. 2011 à 07:53
0
Merci
Ah !
Ouvre CE LIEN, télécharge le fichier et regarde.
Ce sera plus facile dans ton cas du fait que la ligne B est, elle, droite et non brisée.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 14 nov. 2011 à 12:40
0
Merci
Bonjour tout le monde,

Whaou Ucfoutu je me suis pris une petite claque en te lisant^^. Je vois que tu te triture bien plus le cerveau que moi sur ce coup.

Je me demande en réalité comment utiliser la collection TrendLines avec un graphique, lorsqu'existe plus d'une intersection.


-Pourquoi passer par la collection Trendlines et ne pas calculer toi même cette droite affine en prenant 2 points ? Il y a une fonction qui te calcule le coefficient directeur et l'ordonnée à l'origine si tu lui entre deux points (Au pire on peut le calculer nous même). L'utilisation de la trendline me semble plus complexe.


Dis-moi : ta courbe a-t-elle toujours à peu près le même aspect (faussement sinusoïdal )?


-Oui mes courbes seront toujours du même aspect. Toutes seront différentes, mais avec très peu de changements.

Si oui : peux-tu envisager l'inversion des abscisses et des ordonnées (donner sur l'axe des ordonnées des valeurs de la colonne abscisses et sur l'axe des abscisses celles de la colonne ordonnées ? (car là est peut-être la solution, avec l'ajout une trendline (courbe de tendance) de type "movingaverage" (constante VBA/Excel xlMovingAvg).


-Oui c'est envisageable. Même si j'ai une petite préférence qu'elle soit dans ce sens la (pour la lecture graphique). Sinon ça revient au même. Donc c'est possible.


En ce qui concerne le lien que tu donnes, j'étais déjà tombé dessus par le passé quand je m'étais cassé la tête sur ce problème^^. Malheureusement si je n'ai pas continué avec ce fichier, c'est que je n'ai pas su quoi en faire. En tout cas je me souvient qu'il était très intéressant. Je vais l'analyser de nouveau...

Mais je vais quand même donner ma voie d'investigation personnelle : Je voyais plutôt la chose comme suit.
On parcours la colonne des abcisses de 2 en 2. Pour chaque couple d'abscisses, je vérifie que l'abscisse dont je cherche justement l'ordonnée est comprises entre ces abscisses. Si ce n'est pas le cas, alors je passe à un intervalle suivant. Par contre si mon abscisse se trouve encadrée alors il y a intersection avec la courbe.
donc avec les deux bornes qui encadrent mon abscisse, je fais une régression linéaire qui me sors le coefficient directeur et l'ordonnée à l'origine. Une fois ces deux valeurs calculées, il suffit d'extrapoler avec la formule suivante : Ordonnée cherchée = Coef directeur * Abscisse pour laquelle on cherche l'ordonnée + Ordonnée à l'origine

Et voila le tour est joué. On obtient de manière simplisme l'ordonnée d'intersection avec la courbe pour une abscisse choisie. La suite est simple, on parcours toute la colonnes des abscisses en cherchant tout les encadrements de ma valeurs d'abscisse. A la fin on trouve toutes les intersections.

Il faudrait tester un truc comme ça je pense. Ça ne doit pas prendre bien longtemps à programmer mais je ne sais pas faire. Et j'ai le sentiment que les résultats d'une extrème précisions car si tu remarque bien la courbe que je donne dans le fichier Excel, Si tu prends des points deux à deux et bien dans 98% ces deux points sont reliés par une droite. Donc l'approximation que je demande semble idéale pour ce type de courbes.

Ça vaut le coup de tenter cette voie selon moi. Une fois que cela aura été fait, testé, et validé; il ne restera plus qu'a faire un formulaire qui demande une valeur d'abscisse en entrée et qui donne en sortie toutes les intersections trouvées avec des optionButton pour que l'utilisateur n'aie plus qu'a choisir la seule bonne valeur.

Je pourrais encore donner des voies de développement pour ce code, mais je vais en rester la pour le moment et en garder un peu sous le pied. Sinon on vas s'y perdre. Ça fait déjà pas mal de boulot à abattre et personnellement je ne parviens pas à passer la première étape. Donc je vais me calmer sur la suite^^. Doucement mais surement.

Ucfoutu que pense tu de mon idée ? C'est en tout cas le message que je voulais passer dans le fichier Excel que je donnais en téléchargement initialement...

Je serais plutôt partant pour un développement qui se rapproche de mes idées. Je comprends mieux le code ainsi. Enfin si c'est possible bien sur.

J'attends tes remarques ou un premier fichier pour tester qui sais...


Bien cordialement,

André
Commenter la réponse de SERIEUXETCOOL

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.