IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Difficultés avec fzero


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Par défaut Difficultés avec fzero
    Bonjour,

    J'ai quelques difficultés avec le M-File suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    n=40000;
    D=[];
    d=0.1892719;
    for k=0:20
      format long e
      sol= fzero(@(x) myfun(x,d),0);
      d=sol+d;
      D=[D;d];
    end
    d=2.4;
    for k=20:40
      format long e
      sol= fzero(@(x) myfun(x,d),3);
      d=sol+d;
      D=[D;d];     
    end
    La première boucle for fonctionne. Elle renvoie des valeurs positives.

    Le problème est au niveau de la deuxième boucle for. Elle renvoie des valeurs positives et négatives par alternance. Or je voudrais qu'elle renvoie seulement des valeurs positives correspondant au zéro de la fonction au voisinage de 3.

    Comment se fait-il que fzero renvoie des valeurs négatives alors que je lui précise de renvoyer des valeurs proches de 3 ?

    Je vous remercie par avance pour votre aide.
    Cordialement.

  2. #2
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    Salut

    je te conseille de tracer sur un graphique ta fonction, sur une plage de x englobant les solutions qu'elle te retourne, et 3
    tu devrais voir visuellement d'ou vient ton problème
    (si ce n'est pas le cas, montre nous un de ces graphiques)

    sinon tu peux aussi te retourner sur des fonctions d'optimisation te permettant d'ajouter des contraintes, comme fminbnd

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Par défaut
    Bonjour,

    Merci pour votre réponse. Mettant rendue compte d'une erreur, j'ai modifié le programme. J'ai cependant toujours une erreur avec ce programme qui utilise la fonction fzero.

    Pour voir d'où venait le problème, j'ai écrit deux programmes utilisant une fonction dont le zéro est facile à calculer en faisant un dl en dt=0.

    La fonction est la suivante : f(dt)=dt*103000(exp(3*(t+dt))-1)-30.

    Un programme calcule les valeurs de dt en lui donnant l'expression de dt et l'autre calcule les valeurs de dt en utilisant la fonction fzero.

    Les deux programmes sont :

    Programme calculant dt avec l'expression de dt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dt=0;
    for k=0:10
        a=103000*exp(3*(dt))*3;
    b=103000*(exp(3*(dt))-1);
    c=-30;
    delta=b*b-4*a*c;
    dt=dt+(-b+(delta)^(1/2))/(2*a)
    end
    Programme calculant dt avec la fonction fzero :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    H=[];
    t=0;
    for k=0:10
    format long e
    dt= fzero(@(dt) myfunpa(dt,t),0)+dt;
    t=dt;
    H=[H;dt];
    end
     
    function f = myfunpa(dt,t)
    %UNTITLED2 Summary of this function goes here
    %   Detailed explanation goes here
    f=dt*(103000*(exp(3*(dt+t))-1))-30;
    end
    Je n'ai cependant pas les mêmes résultats dans les deux programmes.

    Quelqu'un pourrait-il me dire d'où vient mon erreur ?

    Je vous remercie par avance,

    Cordialement.

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Par défaut
    Même sans effectuer de boucle comme ci-dessous, les deux programmes ne donnent pas le même résultat.

    Programme calculant dt avec l'expression de dt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a=103000*exp(3*(dt))*3;
    b=103000*(exp(3*(dt))-1);
    c=-30;
    delta=b*b-4*a*c;
    dt=(-b+(delta)^(1/2))/(2*a)

    Programme calculant dt avec la fonction fzero :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    format long e
    dt= fzero(@(dt) myfunpa(dt),0);
     
    La fonction est écrite dans le fichier à part ci-dessous :
    function f = myfunpa(dt,t)
    %UNTITLED2 Summary of this function goes here
    %   Detailed explanation goes here
    f=dt*103000*(3*dt)-30;
    end
    Je ne comprends vraiment pas d'où vient le problème.
    La fonction fzero s'utilise-t-elle que sous certaines conditions ?

    Vous remerciant par avance pour votre réponse.

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    salut

    as tu suivi mon conseil ? a savoir de tracer ta fonction ?
    a mon avis ca t'aiderai à y voir plus clair

    fzero cherche une solution en partant d'un point initial, mais il ne trouvera pas la plus proche du point initiale :
    en effet il la recherche en suivant des gradients, un peu comme si tu mettais une bille sur ta courbe au point x0 et qu'elle suivait la gravité

    de manière générale quand on fait de l'optimisation sur des problèmes simples (cad avec 1 ou 2 variables, donc graphiquement représentables) il est bien de tracer à la fin une courbe de ta fonction avec le point de départ x0 et la solution x (et dans ton cas les solution x)

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Par défaut
    Bonjour,

    J'ai tracé la fonction : f(dt)=dt*103000*(3*dt)-30.

    Autour de 0, il y a deux zéros :

    1) Pour f(0.0098)<0 et pour f(0.0099)>0.

    2) Pour f(-0.0099)>0 et f(-0.0098)<0

    La fonction fzero donne le deuxième zéro. Or je voudrais le premier zéro.

    J'ai essayé la commande "Zero found in the interval: [-2,2]"
    pour spécifier l'intervalle dans lequel la solution doit être trouvée. Cependant avec cette commande l'intervalle doit être symétrique.

    Est-il possible de modifier cette commande pour pouvoir inscrire un intervalle non symétrique ?

    Merci d'avance.

Discussions similaires

  1. [SSIS][2k5]Difficulté avec SSIS
    Par david71 dans le forum SSIS
    Réponses: 9
    Dernier message: 05/01/2006, 19h28
  2. [JS] Difficulté avec le onmouseover...
    Par Pleymo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/11/2005, 12h09
  3. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53
  4. Difficultés avec - onchange - !
    Par zakuli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/07/2005, 12h00
  5. Difficultés avec TMenuItem.OnDrawItem
    Par ybruant dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/01/2005, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo