Aide_urgent

celiocelio Messages postés 3 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 30 mai 2006 - 30 mai 2006 à 13:59
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 30 mai 2006 à 17:30
je cherche à résoudre cette équationsous vb6:

exp(-a*x)-exp(-b*x)=k avec a,b,x et k postifs et a<b dans tous les cas

a,b et k sont connus mais changent au cours de mon programme ils dérivent en fait d'autres calculs propres à moi

je cherche à trouver ce x à chaque fois que j'ais de nouvelles valeurs
de a,b et de k qui vérifieront toujours ces deux propriétés:

1-a,b et k positifs

2-a<b

4 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 mai 2006 à 14:05
ça y est cette fois c'est le bon forum et le bon thème

encore que le titre est peu parlant et urgent ne plait pas trop.


 


soit a,b en Integer, Single, Double comme tu voudra


avec b > a


et la Fonction:


   k = Exp(-a * X) - Exp(-b * X)


qui passe par un maximum pour une certaine valeur de x:


   kM = Exp(-a * Max) - Exp(-b * Max)


il faut trouver Max


toutes les autres variables sont en Double (sauf n en Integer)


le principe c'est de découper par tranche de 10 pour augmenter la
vitesse, et de trouver la tranche qui contient le maximum, ensuite de
recommencer en augmentant la précision à chaque boucle.


c'est assez rapide avec une bonne précision à 9 décimales ça devrait être suffisant


si quelqu'un a mieux ???

Recherche du Maximum:    pas 1: G 0

    For n = 1 To 9

        pas pas / 10: P 0

        For M = G To 1 Step pas

            R = Exp(-a * M) - Exp(-b * M)

            If R < P Then Exit For

            P = R

            Next

        G = M - pas - pas

        Next

    Max = M - pas
    MsgBox "le Maximum est " & M

    on peut déjà régler le problème, si k est trop
grand il n'y a pas de solution, ou si k = kM, il y a une racine
double: 


 
    pas = pas / 100

    kM = Exp(-a * M) - Exp(-b * M)

    If k - kM > pas Then

       MsgBox "pas de solution": Exit Sub

       End If

    If Abs(k - kM) < pas Then

       MsgBox "le Maximum est la solution": Exit Sub

       End If



sinon, il y a 2 racines à trouver:


la première de 0 à Max             (Fonction continue croissante)


la deuxième de Max à l'infini ... (Fonction continue décroissante)


par une recherche dichotomique classique c'est possible


si tu n'y arrive pas, je t'aiderais.

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 mai 2006 à 14:28
ça y est ta testé ?


exemple pour a=1, b=2

on trouve un MAx de 0,693147 avec k=0.25


pour k > 0.25 il n'y a pas de soluion

pour k 0.25 il y a une solution double qui est x 0.693147

pour k < 0.25 il y a 2 racines

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 mai 2006 à 15:12
bien sûr on doit pouvoir trouver le maximum avec une méthode plus mathématique

mais j'ai pas cherché dans cette direction.

à partir de là on a Max, kM et aussi le pas, j'ai divisé par 100 pour une meilleure présion (11 décimales)

recherche 1ére racine de 0 à Max
Recherche1:

    P 0: G Max: n = 0

    While G - P > pas

          M = (P + G) / 2

          R = Exp(-a * M) - Exp(-b * M)

          If R < k Then P M + pas Else G M
'le contrôle ici n'est pas forcément nécessaire

'mais m'a évité les boucles infinies
          n = n + 1

          If n > 999 Then GoTo Suite1

          Wend

Suite1:

'   MsgBox "nbre boucle=" & n

'   MsgBox "résultat k =" & R

    MsgBox "x1=" & Round(M, 10)

recherche 2éme racine de Max à 100
Recherche2:

    P Max: G 100: n = 0

    While G - P > pas

          M = (P + G) / 2

          R = Exp(-a * M) - Exp(-b * M)

          If R > k Then P M + pas Else G M

          n = n + 1

          If n > 999 Then GoTo Suite2

          Wend

Suite2:

'   MsgBox "nbre boucle=" & n

'   MsgBox "résultat k =" & R

    MsgBox "x2=" & Round(M, 10)

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 mai 2006 à 17:30
je remet le code complet.

suite en discussions en privé avec celio.

recherche du maximum plus directe

prise des paramètres dans des textBox comme demandé.


Private Sub Command1_Click()

    Dim a   As Single

    Dim b   As Single

    Dim k   As Double

   

    Dim P   As Double

    Dim G   As Double

    Dim M   As Double

    Dim R   As Double

    Dim kM  As Double

    Dim Max As Double

    Dim pas As Double


    a=Val(text1.text)

    b=Val(text2.text)

    k=Val(text3.text)

Maximum:

    Max = Log(b / a) / (b - a)

    kM = Exp(-a * Max) - Exp(-b * Max)

    MsgBox "Maximum=" & kM


    pas = 0.00000000001

    If k - kM > pas Then

       MsgBox "pas de solution": Exit Sub

       End If

    If Abs(k - kM) < pas Then

       MsgBox "le Maximum est la solution": Exit Sub

       End If

Recherche1:

    P 0: G Max

    While G - P > pas

          M = (P + G) / 2

          R = Exp(-a * M) - Exp(-b * M)

          If R < k Then P M + pas Else G M

          Wend

Suite1:

    MsgBox "x1=" & Round(M, 10)


Recherche2:

    P Max: G 100

    While G - P > pas

          M = (P + G) / 2

          R = Exp(-a * M) - Exp(-b * M)

          If R > k Then P M + pas Else G M

          Wend

Suite2:

    MsgBox "x2=" & Round(M, 10)

Daniel
0
Rejoignez-nous