Partage
  • Partager sur Facebook
  • Partager sur Twitter

optimiser une courbe exponentielle sur Matlab

Je galère !!

    15 septembre 2021 à 17:03:25

    Bonjour :

    Sur Matlab, j'ai tracé ma courbe à l'aide de points de mesures. C'est une courbe d'étalonnage.

    Elle a l'allure d'une courbe exponentielle de la forme : a*e^(-bx)+c.

    Je dois ainsi trouver les coefficiients a et b qui me permettront d'avoir une fonction exponentielle qui se rapproche au maximum de ma courbe d'origine.

    Mon professeur m'a demandé d'utiliser uniquement :

    - fminsearch

    • polyval
    • polyfit 
    • L'un deux ou deux d'entre eux. Voici les lignes de code que j'ai commencé à rédiger :
     x=[1:10:70] y=[0:10:70] x=[12.5,11.8,10.8,10.9,6.5,6.2,6.1,5.423,4.625] y=[0,0.61,1.3,1.4,14.9,18.5,20.1,29.7,58.2] xlabel('Conductivité') ylabel('Inductance')
    J'ai regardé multiples examples, mais aucun ne semble s'approcher totalement du mien... Bref, c'est la galère ! 3 jours que j'y suis bloquée 
    • Partager sur Facebook
    • Partager sur Twitter
      15 septembre 2021 à 17:25:40

      Salut,

      la fin de ton message (celle avec le code) est illisible. Est-ce que tu pourrais la réécrire ? Sinon, l'utilisation de fminsearch est assez simple. D'abord, tu dois créer une fonction dont tu vas chercher un minimum. Je te propose la fonction suivante :

      \(f([a,b,c]) = \sum_{i=1}^n{(y_i - ae^{-b x_i}+c)^2}\)

      Ensuite, tu essaies d'intuiter des valeurs initiales pour a,b et c. Ensuite, il suffit d'appeler fminsearch avec en premier argument ta fonction et en second argument ton vecteur de valeurs initiales.

      • Partager sur Facebook
      • Partager sur Twitter

      Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

        16 septembre 2021 à 8:25:26

        Salut,

        x=[1:10:70]

        y=[0:10:70]

        x=[12.5,11.8,10.8,10.9,6.5,6.2,6.1,5.423,4.625]

        y=[0,0.61,1.3,1.4,14.9,18.5,20.1,29.7,58.2]

        Merci pour la fonction ! Mais comment l'insérer ? Aussi, je dois trouver les valeurs de a;b,c c'est pour ca que je ne comprends pas comment je peux leur inutiter des valeurs...

        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2021 à 10:05:39

          Je parlais plutôt de ton code; qu'est-ce que tu as testé pour l'instant ?
          • Partager sur Facebook
          • Partager sur Twitter

          Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

            16 septembre 2021 à 10:22:30

            j'ai teste le code avec polyval et polyfit avec un polynome à la puissance negative... Une calamité. Je suis nulle en programmation, je commence vraiment à péter les plombs en vrai, ca fait 4 jours aujourd'hui que je suis bloquée sur une optimisation de courbe. Ca me bloque grave dans mon projet que je dois bientot rendre. Bref, s'il te plait aide moi :(
            • Partager sur Facebook
            • Partager sur Twitter
              16 septembre 2021 à 11:26:36

              Déjà, il faudrait commencer par trier tes données. Je vois que les \(x\) sont donnés en ordre décroissant. Ce n'est pas vraiment un problème, sauf qu'en affichant tes données, on voit qu'il y a un espèce de coin sur ta courbe au passage des x = 11.8 -> 10.8 -> 10.9. Ce genre de chose peut faire échouer un fit polynomial. Est-ce qu'il ne faudrait pas inverser le 10.8 et le 10.9 ?

              Edit: je t'ai aussi demandé de me donner le code que tu as utilisé pour calculer tes fits.

              -
              Edité par Nozio 16 septembre 2021 à 11:34:23

              • Partager sur Facebook
              • Partager sur Twitter

              Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

                20 septembre 2021 à 14:39:45

                x=[0:10:70]
                y=[0:10:70]
                x=[12.5,11.8,10.9,10.8,6.5,6.2,6.1,5.423,4.625]
                y=[0,0.61,1.3,1.4,14.9,18.5,20.1,29.7,58.2]
                xlabel('Conductivité')
                ylabel('Inductance')
                fun = @(ABC) sum( (y - (ABC(1)*exp(-ABC(2)*x) + ABC(3))).^2 ); % déclaration de la fonction à minimiser
                ABC0 = [1,1,1]; % valeurs initiales pour a, b et c, à modifier éventuellement
                ABCopt = fminsearch(fun,ABC0);
                a = ABCopt(1);
                b = ABCopt(2);
                c = ABCopt(3);
                Voici le code, mais la courbe tracée n'est pas la bonne
                • Partager sur Facebook
                • Partager sur Twitter
                  20 septembre 2021 à 17:24:23

                  tes 2 premières lignes ne servent à rien dans tous les cas, puisque tu redéfinis juste après x et y

                  x=[12.5,11.8,10.9,10.8,6.5,6.2,6.1,5.423,4.625];
                  y=[0,0.61,1.3,1.4,14.9,18.5,20.1,29.7,58.2];
                  xlabel('Conductivité');
                  ylabel('Inductance');
                  p=polyfit(x,y,3) % fit ordre 3
                  x2=linspace(4,14,100)
                  y2=polyval(p,x2) % calcul avec le polynome p sur un échantillonnage plus grand de x (de 4 à 14 en 100 valeurs)
                  plot(x,y) % données d'origine
                  hold on % on garde l'affichage
                  plot(x2,y2) % données avec le polynome calculé
                  hold off % on "relache" le graphique
                  

                  ça donne un résultat pas trop mal (on a un creux normal entre 6 et 10, vu que l'on a peut de données, mais en passant en ordre 4 ou 5, on colle mieux)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  optimiser une courbe exponentielle sur Matlab

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown