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

Octave Discussion :

Besoin d'aide pour exercices de Matlab


Sujet :

Octave

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Besoin d'aide pour exercices de Matlab
    Bonjour, je suis étudiant et ai un mini projet à rendre sous Matlab.
    Le thème porte sur les objets fractals (de manière simplifiée), et j'ai de grosses difficultés à visualiser le moyen de répondre aux questions.
    Je pense que ceci ne doit pas être d'un niveau très compliqué mais je suis débutant en Matlab (avec Octave) et j'aurais réellement besoin d'un aiguillage précis concernant le développement de mon code.

    Je vous livre l'énoncé:
    Objectifs: écrire un programme en un minimum de lignes qui trace une figure géométrique paramétrable à l'aide d'une fonction (sous_fct.m) réalisant l'opération de base suivante:

    Etant donnés deux points a=[xa,ya] et b=[xb,yb], on construit:
    -les deux points c et d qui sont aux 1/3 et 2/3 de [AB]
    -le point e tel que c, e et d forment un triangle équilatéral

    Le programme principal (pgm_princ.m) permet à l'aide de boucles, d'appeler la fonction sous_fct.m pour réaliser la figure complète définie par les paramètres initiaux (nombre d'itérations et figure d'initialisation), puis fait tracer la figure.

    Le code complet sera constitué d'une fonction principale: pgm_princ.m et d'une sous-fonction: sous_fct.m

    Détails sur les fonctions:
    Fonction "sous_fct.m":
    Cette fonction prend en paramètres d'entrée le couple de points [a,b] puis rend en sortie la liste de points rangés dans l'ordre suivant: (c,e,d)

    Fonction "pgm_princ":
    Cette fonction principale prend le nombre d'itérations en entrée, une liste de points définissant la figure initiale et rend en sortie la liste des points calculés.
    Le prototype de la fonction sera le suivant: liste=pgm_princ(n,pts).

    NB: Il faut gérer intelligemment la mémoire pour stocker tous les points calculés à l'itération n.
    Pour cela il faut avoir en tête que chaque segment de la figure produit 3 points supplémentaires, combien de points a-t-on au total si l'on a L segments au départ (bornes des segments inclus) ?
    Si on réitère cette opération n fois, combien de segments obtient-on ?
    En gros on démarre avec un segment et on crée trois points de manière à diviser le segment en 3 et construire un triangle équilatéral dont la base est "au milieu" dudit segment, et dont le sommet est sur la médiatrice du segment.

    Pour l'instant mon code est le suivant, pour sous_fct.m:
    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
    function[c,e,d] = sous_fct(a,b)
     
    xa = a(1,1);
    ya = a(1,2);
     
    xb = b(1,1);
    yb = b(1,2);
     
    xc = (1./3)*(xb + xa);
    yc = (1./3)*(yb + ya);
     
    xd = (2./3)*(xb + xa);
    yd = (2./3)*(yb + ya);
     
    xe = cos(120).*(xa - xc) - sin(120).*(ya - yc) + xc;
    ye = sin(120).*(xa - xc) + cos(120).*(ya - yc) + yc;

    En gros pour le moment j'ai défini les points à tracer par la fonction principale, mais le problème qui subsiste c'est le moyen concret qui permet de lier les points en sortie de la première itération à un nouvel ensemble de points pour lesquels à chaque paire de points (chaque segment) il faudra créer trois nouveaux points, etc et ensuite tracer la figure finale...

    J'espère avoir été suffisamment clair, toute aide m'est précieuse !
    Merci de votre attention !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Bonjour,

    Voici ce que tu peux déjà faire.
    Ecrire une fonction principale pour le cas d'un segment [ab] sans chercher à appeler plusieurs fois la fonction secondaire.

    Utilise ensuite cette fonction principale pour introduire une boucle correspondant à 2 ittérations. Cette boucle contiendra donc un appel à la fonction secondaire.

    Au premier passage de la boucle, tu calcules les points c,d et e. Au deuxième passage, tu calcules les autres points qui correspondent à tous tes nouveaux segments.

    Pour avoir tous les couples possibles, utilise les combinatoires. Tu trouveras plus d'information là dessus en tapant :


  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse, je me penche dessus au plus vite !

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je crois comprendre à peu près de quoi il s'agit, nchoosek permet d'obtenir toutes les combinaisons de deux points dans une liste de points, mais je n'arrive pas à saisir la manière de s'en servir pour l'inclure dans mon code.
    En gros, j'effectue une itération qui me donne en sortie trois points, soit 5 avec les deux points de départ, et avec nchoosek j'obtiens une liste de toutes les combinaisons possibles de 2 points parmi ces 5 points, donc la seconde itération fera en sorte de créer "trois points" par couple de points possibles ?
    Mais je ne saisis toujours pas comment faire entrer tout ça dans une boucle et la manière d'additionner tous ces points pour l'itération suivante...
    Et le moyen de tracer une figure uniquement à partir de points ?
    Je sais comment faire à partir d'une fonction mais je ne vois pas à partir de points...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Tu es sur la bonne voie ^_^
    Montre nous ce que tu as programmer concernant la fonction principale.
    Quelques infos supplémentaires. Quand tu as calculer tes premiers points c,d et e, tu calcules toutes les combinaisons de points avec nchoosek. Ensuite, dans une boucle, tu appelles x fois ta fonction secondaire pour traiter l'ensemble des couples de points. Ta (tes) boucle(s) étant fixé(es) par le nombre de couples. Tu sais que pour 2 points initiaux, tu obtiens 3 nouveaux points et 8 nouveaux segments. 2, 3 et 8, ca peut t'aider ^_^.

    Dernier points : pour le graphe, tu peux simplement utiliser la fonction line qui te tracera des lignes entre chaque point.
    Pense également à créer au début de ton programme une variable pré-allouée qui gardera l'ensemble des coordonnées de tes points. Avec une petite récurrence, tu trouveras facilement la taille de cette variable en fonction du nombre de points (ou segment) initiaux.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    En fait j'ai du mal à imaginer comment créer cette variable qui se remplit de couples de points à chaque itération, et comment ensuite utiliser nchoosek pour utiliser une boucle de la sous fonction...
    Première itération: j'avais deux points en entrée qui sont mis dans la variable contenant mes points, la sous fonction renvoie dans ladite variable les 3 points créés à partir des deux points initiaux, et pour la seconde itération nchoosek prend les points situés dans la variable pour en sortir X couples de points qui chacun vont passer dans la boucle faisant appel à la fonction secondaire qui va à nouveau remplir la variable.
    Dans ce cas faut-il créer une variable intermédiaire à la variable totalisant les points, qui servirait à recevoir les points créés lors d'une itération (pour éviter de mélanger les points antérieurs à la nouvelle itération avec les points produits lors de cette itération) ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Je ne suis pas un spécialiste des fractal, mais je pense que tous les points doivent être utilisé à chaque ittération du processus. Qu'ils soient nouveaux ou anciens.

    Au début de ta fonction principale, tu dois créer une variable qui contiendra tous les points à venir. si on part du principe que tu as seulement 2 ittérations et 2 points au départ, tu devras créer une variable de 35 "places". Voici le détail.

    ittération 1 : 2 points de départ. Appel de la fonction secondaire : 3 nouveaux points

    => 5 points au total.
    nchoosek 2 couples de points parmi les 5 => 10 combinaisons possibles.

    appel 10 fois la fonction secondaire correspondant à l'ittération 2 : 3 nouveaux points par appel. 30 nouveaux points au final.

    => 35 points à la fin de la deuxième ittération.

    Tu dois donc créer une variable de 35 "places" au début de ton programme que tu rempliras petit à petit. C'est ce que je ferais si j'étais à ta place.

    Et le processus continue si tu as plus d'ittération. Tu regardes tous les couples possibles de 2 points parmi 35. Ca te fait 595 couples possible. tu relances donc 595 fois ta fonction secondaire pour obtenir 1785 nouveaux points, etc...

    Une fois que tu as ton tableau de point, tu as juste à utiliser un line en fin de programme pour faire un graphe qui relie tous les points.

    N'hésites pas à poster le début d'une réponse ou d'un code de ta fonction principale même si elle ne fonctionne pas du tout. Ca permet de voir ou tu bloques.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    juste pour information, j'ai codé depuis ton précédent message les deux fonctions de ton projet. il y a d'ailleurs un point d'intérrogation et une erreur.

    L'intérrogation concerne la définition du point e. Dans un plan xy, à partir de deux points a et b distincts, tu peux trouver deux points e1 et e2 qui forment un triangle équilatéral avec a et b. Tu choisis lequel ? Tu prends les deux ?

    L'erreur autrement ce situe au niveau du calcul de xe et ye. Si tu prends par exemple A=[0,0] et B=[1,0], tu verras que E est erroné.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Effectivement, le triangle peut être d'un côté ou de l'autre du segment, je pense que tant que ça reste du même côté pour tout le programme ça ne pose pas de problème.

    J'ai fait un dessin, qui est aussi sur l'énoncé du projet:
    http://img213.imageshack.us/img213/5792/matlab.jpg

    Pour la formule, je l'ai trouvée sur internet, en cherchant une formule de rotation dans un plan cartésien, je vais vérifier

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    J'ai vérifié ta formule. Elle est correcte mais il faut simplement faire attention d'utiliser les angles en radian donc multiplier ton angle par pi/180. J'avais pas fait attention...

    Par contre, elle est correcte dans le cas d'un triangle équilatéral abe et non pas cde

Discussions similaires

  1. Besoin d'aide pour exercice SAS
    Par TheGirly dans le forum SAS Base
    Réponses: 8
    Dernier message: 28/05/2011, 12h18
  2. besoin d'aide pour exercice
    Par aurore973 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/05/2007, 08h14
  3. [Débutant] Besoin d'aide pour un exercice
    Par bebetoalvaro dans le forum Pascal
    Réponses: 9
    Dernier message: 05/02/2007, 01h59
  4. Besoin d'aide pour un exercice sur les registres
    Par zakuza dans le forum Assembleur
    Réponses: 5
    Dernier message: 14/04/2006, 14h23

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