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 :

Matlab point fixe


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Matlab point fixe
    Bonjour,
    Je suis nouveau sur le forum et j'ai une question concernant la méthode du point fixe.
    Je sais que d'autres postes existent concernant cette méthode mais je n'arrive pas à faire ce que je voudrais alors je crée mon propre poste.

    Je connais la fonction f(x)=x - y tan a - C/(2*(x²+y²)^0.5)
    Je connais : C=0.003
    y=0 au début puis augmente avec un pas de 0.5
    Je dois tester tester ma fonction avec un a en radian avec les valeurs 0, 2, 4, 6, 8 et -2 degrés
    Je dois effectuer 21 itérations et avoir le résultat avec une tolérance de 0.005

    Je dois afficher mon résultat sous forme de graphique avec une courbe pour chaque angle.

    Je ne sais absolument pas coder (d'ailleurs j'ai peut-être oublié des informations importantes désolé) est ce que quelqu'un pourrait me montrer comment adapter ma fonction à cette méthode et faire un plot ?
    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour,

    As-tu commencé le programme.
    Fais nous voir.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'ai ça mais ça ne marche pas vraiment... J'ai essayé de récupérer des morceaux de code sur internet

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    n=1;
    AOA=0;
    mu=0;
    Ct=0.0030;
     
    x0=0.5;
    phi=fun;
    eps=0.0005;
    nmax=21;
     
    function[p,res,iter]=ptfixe(x0,phi,eps,nmax)
    while n<=21
    alpha = AOA * 2*pi / 360; % Degrees to Radians
    fun=@(lambda)lambda - mu * tan(alpha) - Ct/(2*(mu^2 + lambda^2)^(1/2));
    lambda0 = [-100 100]; % Initial Values
    lambda(n,1) = fzero(fun, lambda0); 
    mu = mu + 0.5;
    n = n + 1; 
    end
    x=x0;
    phix=phi(x);
    iter=0;
    err=abs(phix-x);
    while(err>eps)&(iter<=nmax)
     iter=iter+1;
      x=phix;
     phix=phi(x);
    end
    p=x;
    res=phix-x;
    end
     
    plot(Interval,lambda,'k')
     
    Interval=0:0.5:10;
    axis ([0 3 -0.2 0.6])
    grid on
    xlabel('Forward speed ratio, \mu/\lambda_{h}')
    ylabel('Inflow ratio, \lambda/\lambda_{h}')
    title('Results')

    Entre temps j'ai changé le nom de mes variables
    x=lambda
    y=mu
    a=alpha
    C=Ct
    AOA correspond à la valeur de mes différents angles 0, 2, 4, 6, 8 et -2

    Merci pour votre retour

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Citation Envoyé par wanowan Voir le message
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    n=1;
    AOA=0;
    mu=0;
    Ct=0.0030;
     
    x0=0.5;
    phi=fun;
    eps=0.0005;
    nmax=21;
     
    function[p,res,iter]=ptfixe(x0,phi,eps,nmax)
    while n<=21
    alpha = AOA * 2*pi / 360; % Degrees to Radians
    fun=@(lambda)lambda - mu * tan(alpha) - Ct/(2*(mu^2 + lambda^2)^(1/2));
    lambda0 = [-100 100]; % Initial Values
    lambda(n,1) = fzero(fun, lambda0); 
    mu = mu + 0.5;
    n = n + 1; 
    end
    x=x0;
    phix=phi(x);
    iter=0;
    err=abs(phix-x);
    while(err>eps)&(iter<=nmax)
     iter=iter+1;
      x=phix;
     phix=phi(x);
    end
    p=x;
    res=phix-x;
    end
     
    plot(Interval,lambda,'k')
     
    Interval=0:0.5:10;
    axis ([0 3 -0.2 0.6])
    grid on
    xlabel('Forward speed ratio, \mu/\lambda_{h}')
    ylabel('Inflow ratio, \lambda/\lambda_{h}')
    title('Results')
    bon quelques soucis dans ton code- :
    - là tu utilise un script
    - dans lequel tu déclares une fonction (ca ne se fait pas)
    - fonction que tu n'appelles jamais
    - et dont tu essayes de tracer les variables internes (c'est pas impossible, mais c'est du matlab poussé et je doute que ce soit ce à quoi tu avais pensé)

    bref, il faut réorganiser tout ca !
    essayes de le faire sans copier coller des blocs ni utiliser des concepts de matlab très avancés que tu ne maitrises pas (opérateur @ par exemple)

    en gros tu dois commencer par écrire une fonction ta fonction f (dans un autre fichier qui s'appelles f.m) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function z = f(x,y,C)
    z = x - y tan a - C/(2*(x²+y²)^0.5)
    end
    puis dans ton script tu peux juste balayer tes données avec des boucles for et while

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Alors voila j'ai ça et je n'ai pas d'erreur lors de l'exécution, est ce bien ?

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    clc, close all, clear all
     
    function y = fo(lambda,mu,alpha)
    y = lambda - mu * tan (alpha) - 0.0030 / (2 * (lambda^2+mu^2)^0.5)
    end
     
    function[p,res,iter]=ptfixe(x0,y,eps,nmax)
    for AOA=0,2,4,6,8,-2
    while n<=21
    alpha = AOA * pi / 180
    lambda0 = [-100 100]; % Initial Values
    lambda(n,1) = fzero(y, lambda0); 
    mu = mu + 0.5;
    n = n + 1; 
    end
     
    x0=0.5;
    eps=0.0005;
    nmax=21;
     
    x=x0;
    y=y(x);
    iter=0;
    err=abs(y-x);
    while(err>eps)&(iter<=nmax)
    iter=iter+1;
    x=y;
    y=y(x);
    end
    p=x;
    res=y-x;
    end
    end
    Je ne vois pas trop quelle variable utiliser pour les plots

    Merci pour votre aide

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Citation Envoyé par wanowan Voir le message
    je n'ai pas d'erreur lors de l'exécution
    certe, mais se passe t'il quelque chose ?
    récupères tu des variables dans le workspace ?

    parce que là, on dirait que tu as défini deux fonctions, mais que tu ne les appelles jamais

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    oui je n'ai rien dans le workspace...
    je ne sais pas trop comment appeler la fonction que je crée pour avoir des varaibles

    comment dois-je faire ?

    je n'ai jamais vraiment fait de matlab et je me retrouve dans un cours ou je dois faire ce projet

    merci pour votre aide

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    clc, close all, clear all
     
    function y = fo(lambda,mu,alpha)
    y = lambda - mu * tan (alpha) - 0.0030 / (2 * (lambda^2+mu^2)^0.5)
    while n<=21
    AOA=0    
    alpha = AOA * pi / 180
    lambda0 = [-100 100];
    lambda(n,1) = fzero(y, lambda0); 
    mu = mu + 0.5;
    n = n + 1; 
    end
    end
    J'ai fais cela mais je n'ai toujours rien dans le workspace.... je ne comprends pas

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    alors
    1/ tu crées un fichier fo.m dans lequel tu n'écris QUE le code de la fonction fo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function y = fo(lambda,mu,alpha)
    y = lambda - mu * tan (alpha) - 0.0030 / (2 * (lambda^2+mu^2)^0.5)
    while n<=21
    AOA=0    
    alpha = AOA * pi / 180
    lambda0 = [-100 100];
    lambda(n,1) = fzero(y, lambda0); 
    mu = mu + 0.5;
    n = n + 1; 
    end
    end
    2/ à coté, tu crées un script main.m dans lequel tu crées tes variables et appeles ta fonction

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    clc, close all, clear all
    lambda = 42;
    mu = 42;
    alpha = 42;
     
    y = fo(lambda,mu,alpha);
    et là tu verras dans ton workspace les variables que tu as créé (ambda,mu,alpha), ainsi que le résultat y de l'appel à fo

    remarque : les variables internes à la fonction fo ne seront JAMAIS dans le workspace !
    si tu les veux, il faut les sortir de la fonction
    exemple en ressortant lambda puisque tu la modifies dans le code de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [y, lambda] = fo(lambda,mu,alpha)

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour l'explication.
    Lorsque j'exécute le code j'obtiens cela je ne comprend pas pourquoi

    Unrecognized function or variable 'n'.
    
    Error in fo (line 3)
    while n<=21
    
    Error in main (line 6)
    y = fo(lambda,mu,alpha);
    et lorsque je dis n=1 avant la boucle while j'ai ce message :

    Error using fzero (line 184)
    FUN must be a function, a valid character vector expression, or an inline function object.
    
    Error in fo (line 8)
    lambda(n,1) = fzero(y, lambda0);
    
    Error in main (line 6)
    y = fo(lambda,mu,alpha);
    je ne comprend pas pourquoi il y a toujours quelque chose qui ne va pas et j'avoue que je n'ai pas trop le niveau

    merci pour l'aide en tous cas

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    alors il faut en effet déclarer n avant de l'utiliser (le while)

    la fonction fzero attend en effet un handle de fonction
    par exemple fun = @sin pour la fonction sinus

    dans ton cas, ca serais quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fun = @(lambda) lambda - mu * tan (alpha) - 0.0030 / (2 * (lambda^2+mu^2)^0.5)
    la ligne ci dessus créer un handle de focntion (nommé fun) qui prend comme variable lambda

    tu peux calculer une valeur de y en faisant y = fun(lambda)
    et chercher les racines de fun en faisant fsolve(fun, lambda0)

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/05/2009, 17h57
  2. Réponses: 3
    Dernier message: 29/01/2009, 23h00
  3. Rotation caméra autour d'un point fixe
    Par jbeaussier dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/01/2008, 00h16
  4. Calculs de points fixes
    Par iamsebfont dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/10/2007, 15h45

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