Probleme matlab

Résolu
Bonjour, je dois créer un programme matlab afin de déterminer la matrice de rigidité d'après la méthode des éléments fini.

Je dois créer une matrice C, composé de la façon suivante:

N est le nombres de barres

u = eye(2*N);
for i = 1:1:N
for j = 1:1:2
u(e(i,j)*2-1,:)
u(e(i,j)*2,:)

end
end

Le problème c'est que je reçois la réponse sous forme de ligne, alors que je souhaiterai pouvoir mettre les réponses sous la forme d'une matrice de la taille:

m(1:4;2*N)

Merci de votre aide.
Configuration: Windows Vista
Firefox 2.0.0.12

20 réponses

Résumé de la discussion

Un utilisateur cherche à construire une matrice de rigidité en MATLAB selon la méthode des éléments finis et souhaite convertir une sortie linéaire en une matrice en 2N par 2N, alignée sur les barres. Plusieurs réponses évoquent l’extraction d’une sous-matrice correspondant aux contraintes non nulles, illustrée par un exemple où une matrice globale 2N×2N et une matrice de conditions BC sont manipulées pour obtenir une matrice 2×2. D’autres échanges signalent des difficultés générales, les messages d’erreur et les ajustements nécessaires, puis des échanges d’encouragements et des remarques sur l’organisation et le flux. Pour obtenir une matrice 2×2 lorsque seules les conditions limites actives demeurent, il faut indexer les degrés de liberté correspondants et extraire la sous-matrice associée.

Bobot (l’IA à votre service)
  1. Salut
    Ton ptit bout de code veut rien dire du tout... Du moins tel quel sans les détails, ça veut rien dire, donc si tu pouvais détailler un peu on pourrait peut-être t'aider.
    A plus
    1. bonjour, je copie donc mon code/

      clear all
      clc
      [n, e,A,Emod,BC] = bar_input; %le fichier [n, e,A,Emod,BC] comprend des données sous formes de matrices
      [N,M] = size(n);

      %lenght
      for i = 1:1:N
      l(i) = sqrt((n(e(i,2),1)-n(e(i,1),1))^2+(n(e(i,2),2)-n(e(i,1),2))^2)
      end

      %angle
      for i = 1:1:N
      if ((n(e(i,2),1)-n(e(i,1),1))==0)&&((n(e(i,2),2)-n(e(i,1),2))>0)
      alp(i)=pi()/2;
      elseif ((n(e(i,2),1)-n(e(i,1),1))==0)&&((n(e(i,2),2)-n(e(i,1),2))<0)
      alp(i)=3*pi()/2;
      elseif ((n(e(i,2),1)-n(e(i,1),1))>0)&&((n(e(i,2),2)-n(e(i,1),2))==0)
      alp(i)=0;
      elseif ((n(e(i,2),1)-n(e(i,1),1))<0)&&((n(e(i,2),2)-n(e(i,1),2))==0)
      alp(i)=pi();
      elseif ((n(e(i,2),1)-n(e(i,1),1))>0)&&((n(e(i,2),2)-n(e(i,1),2))>0)
      alp(i)=atan((n(e(i,2),2)-n(e(i,1),2))/((n(e(i,2),1)-n(e(i,1),1))));
      elseif ((n(e(i,2),1)-n(e(i,1),1))>0)&&((n(e(i,2),2)-n(e(i,1),2))<0)
      alp(i)=pi()+atan((n(e(i,2),2)-n(e(i,1),2))/((n(e(i,2),1)-n(e(i,1),1))));
      end
      end

      %matrice k
      for i = 1:1:N

      K(1:4,1:4,i)=(Emod(i)*A(i)/l(i))*[cos(alp(i))*cos(alp(i)) cos(alp(i))*sin(alp(i)) -cos(alp(i))*cos(alp(i)) -cos(alp(i))*sin(alp(i)); cos(alp(i))*sin(alp(i)) sin(alp(i))*sin(alp(i)) -cos(alp(i))*sin(alp(i)) -sin(alp(i))*sin(alp(i)); -cos(alp(i))*cos(alp(i)) -cos(alp(i))*sin(alp(i)) cos(alp(i))*cos(alp(i)) cos(alp(i))*sin(alp(i)); -cos(alp(i))*sin(alp(i)) -sin(alp(i))*sin(alp(i)) cos(alp(i))*sin(alp(i)) sin(alp(i))*sin(alp(i))];

      end

      %matrice C
      u = eye(2*N); % we create the identity matrix
      for i = 1:1:N
      for j = 1:1:2
      u(e(i,j)*2-1,:)
      u(e(i,j)*2,:)

      end
      end

      la reponse de la matrice C est de la forme /

      ans =

      1 0 0 0 0 0

      ans =

      0 1 0 0 0 0

      ans =

      0 0 1 0 0 0

      ans =

      0 0 0 1 0 0
      /merci de votre aide/
      bonne journée
      1. Salut
        C'était juste ça?
        Donc si j'ai bien compris, effectivement tout le code servait pas à grand chose pour te répondre... désolé... :-D
        Tu veux juste mettre les lignes des ans dans la matrice C?
        Par contre il y a un truc que je comprends pas, t'as pas écrit toutes les lignes de la sortie écran dans ton message? Parce qu'apparemment ton N=3, donc il devrait y avoir 12 lignes à la sortie, non? Et dans ce cas pourquoi le m(1:4;2*N) de ton premier message?

        Donc... si effectivement je suis pas à côté de la plaque, personnellement j'écrirais ça :
        % matrice C
        C = [];
        u = eye(2*N); % we create the identity matrix
        for i = 1:1:N
        for j = 1:1:2
        C=[C;u(e(i,j)*2-1,:);u(e(i,j)*2,:)]
        end
        end 

        Ou sous forme matricielle
        % matrice C
        u = eye(2*N); % we create the identity matrix
        C=u(reshape([reshape((e.^2).'-1,1,numel(e));reshape((e.^2).',1,numel(e))],2*numel(e),1),:);

        Dis moi si je suis carrément à côté parce qu'en fait je vois pas pourquoi il y a que 4 lignes à ta sortie écran...
        A plus
        1. Bonjour,
          Je te remercie de ta patience, comme tu l as remarqué je n'ai pas copié toutes lignes de sortie d'écran,
          j ai bien 12 lignes, le problème c'est que je souhaite avoir en sortie des matrices de la forme m(1:4;2*N),
          Soit 3 matrices pour ce cas là, de la taille m(4,6)
          En gros une matrice par barres c'est à dire par éléments étudiés.

          Merci de ton aide
          1. Ah OK... Ben tu reprends ce que j'ai écrit avec C et tu définis C1, C2, C3 comme ça :
            C1=C(1:4,:);
            C2=C(5:8,:);
            C3=C(9:12,:);

            Ou sinon tu peux arranger un peu ce que j'ai écrit pour avoir directement C1, C2, C3, c'est toi qui vois...
            Ça répond à peu près à tout?
        2. le problème c'est que cela doit être general, est s appliquer pour tout les cas possibles, par exepemple si j'ai 100 éléments, je doi avoir 100 matrice différentes et c'est cela qui me pose problème, je n'arrive pas à créer une fonction pour avoir N matrice.
          1. Ben pour ça je pense pas qu'il existe de solution simple.
            En fait c'est un ensemble de matrices paramétrées par un entier p Є [1,N] que tu veux donc ce que tu peux faire c'est définir un tableau à 3 dimensions par exemple ou utiliser des cellules.
            En partant de la matrice C (de taille 4*N x 2*N) du message 3 ça peut donner un truc du genre :

            -Avec un tableau à 3 dimensions :
            C=permute(reshape(C.',2*N,4,N),[2 1 3]);
            Pour tout p Є [1,N], C(:,:,p) sera la p-ième matrice.

            -Avec des cellules :
            C=mat2cell(C,4*ones(1,N),2*N);
            Pour tout p Є [1,N], C{p} sera la p-ième matrice.

            Ça te convient ce petit bidouillage?
            1. Je te remercie, c’est exactement ce que je recherché….
              Merci de ta patience et de tes explications qui mon permis de comprendre.
              1. De rien...
                T'es le bienvenu si t'as d'autres soucis.
                A plus
            2. bonjour, je reviens toujours a la recherche d aide.
              j ai un probleme pour reduire une matrice.
              j ai une matrice de taille k= [2*N,2*N]
              une autre,ma matrice de condition aux limites de la forme BC=[2,N],elle est reöpli de 1 et de 0

              exemple

              % Boundary Conditions
              % X1 Y1 X2 Y2 X3 Y3
              BC = [0 0 ; 0 0; 1 1 ]

              %matrice k
              k =

              1.0e+007 *

              0.7425 -0.7425 -0.0000 -0.0000 -0.7425 0.7425
              -0.7425 2.8425 -0.0000 -2.1000 0.7425 -0.7425
              -0.0000 -0.0000 2.1000 0.0000 -2.1000 0
              -0.0000 -2.1000 0.0000 2.1000 0 0
              -0.7425 0.7425 -2.1000 0 2.8425 -0.7425
              0.7425 -0.7425 0 0 -0.7425 0.7425

              je souhaiterai pouvoir reduire la matrice de sorte qu il ne me reste que les valeurs ou les conditions limites ns sont pas nul, donc ds cette exemple avoir seulement une matrice 2*2 de cette forme

              2.8425 -0.7425
              -0.7425 0.7425

              merci de votre aide
              1. Salut jeremy124
                Je jette un œil ce we ou ce soir à ton message.
                A plus tard
                1. Re salut jeremy124
                  Pas facile de te suivre des fois :-D
                  Faudrait que tu détailles un peu plus (et telle qu'elle est écrite, ta matrice BC a plutôt une taille Nx2)
                  Mais bon... Si j'ai bien compris, ce que tu demandes est un truc dans ce genre :
                  k=k(find(reshape(BC.',1,numel(BC))),find(reshape(BC.',1,numel(BC))));

                  Si c'est pas ça c'est que j'ai pas compris. Dans ce cas détaille un peu plus... Comment tu veux sélectionner les éléments de k en fonction de BC?
                  Tiens moi au courant...
                  A plus
                  1. Merci beaucoup, c’est exactement ce que je souhaitai.
                    Je te remercie encore une fois pour ton aide précieuse.
                    Surement à bientôt pour d’autres questions ….
                    A plus
                    1. De rien!
                      A plus
                  2. bonjour

                    J´ai de nouveau un probleme, je copie mon code pr plus de precision:

                    f = [f1x f1y; f2x f2y; f3x f3y];

                    z=reshape((flipud(rot90(f))),1,2*N); % passage en vecteur de la matrice des forces
                    inconnues=z(find(reshape(BC.',1,numel(BC)))) %prend les valeurs ds C suivant les "1" ds BC

                    f=inv(kfinal)*inconnues'

                    j aimerai pouvoir former un nouveau vecteur avec les valeurs de f et des zero pour le reste (cad la ou BC = 0 )
                    1. je donne un exemple si BC = [0 0 ; 1 0; 1 1 ] alors f= -0.0524
                      -0.0524
                      -0.2529

                      et je souhaiterai avoir un vecteur de la forme vecteur=[ o,o,-0.0524,o,-0.0524, -0.2529]

                      merci d avance
                      1. Salut l'ami
                        Je pense qu'un truc du genre devrait faire l'affaire :
                        fext=zeros(1,numel(BC));
                        fext(logical(reshape(BC.',1,numel(BC))))=f;
                        

                        Dis-moi si c'est ça.
                        A plus
                        1. salut

                          merci encore pour ton aide, j ai de nouveau un probleme, ca n arrete jamais.....

                          for i = 1:1:N
                          kt(:,:,i)=(Emod(i)*A(i)/l(i))*[C(:,:,i)'*K(1:4,1:4,i)*C(:,:,i)];
                          end

                          ktotal=sum(kt,N); % we create summary matrix kt

                          kfinal=ktotal(find(reshape(BC.',1,numel(BC))),find(reshape(BC.',1,numel(BC)))); %matrice k en fonction des BC

                          z=reshape((flipud(rot90(f))),1,2*N); % passage en vecteur de la matrice des forces

                          inconnues=z(find(reshape(BC.',1,2*N))) %prend les valeurs ds C suivant les "1" ds BC

                          force=inv(kfinal)*inconnues'

                          et pour les condition suivante

                          A =400; % mm^2
                          E =210000; % MPa
                          %
                          f1x = 0;
                          f1y = 0;
                          f2x = 90;
                          f2y = 100;
                          f3x = 10;
                          f3y = 110;

                          % Nodes
                          n =[2 6; 2 2; 6 2];

                          % Elements
                          e =[1 2; 2 3; 1 3];

                          % Areas
                          A =[A; A; A];

                          % Modulus of Elasticity
                          Emod =[E; E; E];

                          % Forces
                          f = [f1x f1y; f2x f2y; f3x f3y];

                          % Boundary Conditions
                          BC =[0 0 ; 1 1; 1 1];

                          ca me donne cela

                          inconnues =

                          90 100 10 110

                          Warning: Matrix is singular to working precision.
                          > In solveode at 63

                          force =

                          Inf
                          Inf
                          Inf
                          Inf

                          displacement =

                          0
                          0
                          Inf
                          Inf
                          Inf
                          Inf

                          je ne comprend pas mon erreur, donc voila mon probleme.....
                          merci de ton aide
                          1. finalement j ai resolu mom probleme
                            merci de ton aide
                            mon programme semble fini
                            bon WK
                            1. De rien jeremy124
                              Bon we à toi aussi.
                            2. bonjour,
                              comment as tu résolue ton problème de j'ai exactement le même message d'erreur.
                              merci
                          2. j ai de nouveau un probleme, j'ai un message d erreur qui s'affiche

                            ??? Error using ==> reshape
                            To RESHAPE the number of elements must not change.

                            Error in ==> solveode at 33
                            C=permute(reshape(C.',2*N1,4,N1),[2 1 3]); % we create the different matrix c

                            mon code est ceci:

                            C = [];
                            u = eye(2*N); % we create the identity matrix

                            for i = 1:1:N1
                            for j = 1:1:2
                            C=[C;u(e(i,j)*2-1,:);u(e(i,j)*2,:)];
                            end
                            end
                            C=permute(reshape(C.',2*N1,4,N1),[2 1 N1]);

                            la taille de la matrice e change suivant les problemes d'elements finis a resoudre.
                            merci de votre aide
                            1. Salut jeremy124
                              A ce que je vois dans ton code t'as utilisé un N1...
                              Je sais pas à quoi il est égal mais la matrice C obtenu après ça:
                              C = [];
                              u = eye(2*N); % we create the identity matrix
                              
                              for i = 1:1:N1
                              for j = 1:1:2
                              C=[C;u(e(i,j)*2-1,:);u(e(i,j)*2,:)];
                              end
                              end
                              

                              a pour taille 4N1 x 2N donc si tu veux avoir un reshape correct avec ça tu peux écrire:
                              C=permute(reshape(C.',2*N,4,N1),[2 1 3]);

                              Mais bon... après je suis pas sûr que ce soit ce que tu voulais faire au départ...
                          3. salut
                            je suis débutante en matlab et je doit faire une connection avec une base de donnée
                            si vous pouvez m'aider pour la syntaxe
                            merci d'avance
                            1. Salut
                              Fais ton propre post et explique mieux.
                              A plus
                          4. hej
                            alors j'ai de nouveau un probleme, je souhaiterai pouvoir afficher une matrice dans une fonctions sprintf, cela est il possible?
                            merci d avance
                            jeremy
                            1. Salut jeremy124
                              On va dire que ta matrice M a n colonnes.
                              Un truc comme ça devrait faire l'affaire:
                              chaine=repmat('%f ',1,n);
                              chaine=chaine(1:end-1)
                              stringM=sprintf([chaine,'\n'],M)
                              

                              A plus
                          5. insupportable ce forum ,j'ai envoye un message deux fois ei il a ete effacé !!
                            je peux comprendre pourquoi.
                            1. Salut
                              Ton message a été effacé parce qu'il était hors sujet local et en double.
                              Tu as posté ton message dans le topic de quelqu'un d'autre, traitant de problèmes avec Matlab et résolu depuis plus de 2 mois. De plus, tu l'as posté aussi ici:
                              http://www.commentcamarche.net/forum/affich 6355443 programme c matrice rigidite
                              Alors ce forum est peut-être insupportable mais je crois que t'es pas mal dans le genre non plus. Nous ne sommes pas à ton service, il est inutile de poster un peu partout dans l'espoir d'avoir une réponse plus vite.
                              A plus
                            2. @SacabouffeEffectivement c'est insupportable ,car on supprime des messages sans se donner la peine de motiver ,un minimum de respect !
                            3. @medi2Le respect commence par ne pas poster son problème dans le sujet de quelqu'un d'autre et à ne poster son message qu'une seule fois.

                              Charte d'utilisation de CommentCaMarche.net - Respect d'autrui

                              ...pour le confort de tous, c’est à dire d’une part des utilisateurs à la recherche d’une réponse sur un forum et d’autre part des contributeurs présents qui s’efforcent d’apporter des solutions aux problèmes que vous rencontrez, il est recommandé de :

                              * Ne pas poster votre message plusieurs fois sur le forum. Les contributeurs présents font de leur mieux pour répondre à vos messages dans un délai respectable. Cependant, si vous n’avez pas de réponse dans les 24h, vous avez la possibilité de faire remonter votre message initial en tête des messages du forum en répondant simplement à votre propre message.

                              * Ne pas poster un message sur une discussion en cours qui n’est pas la vôtre...


                              Cordialement
                            4. @medi2De rien.
                              Et puis, t'en fais pas, si t'as jamais posté ici, tu pouvais pas savoir.
                              A plus