Probleme matlab

Résolu/Fermé
jeremy124 - 13 févr. 2008 à 19:51
 adrien - 5 févr. 2013 à 19:43
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.

20 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
14 févr. 2008 à 03:25
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
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
14 févr. 2008 à 16:10
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
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
14 févr. 2008 à 19:17
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
14 févr. 2008 à 21:34
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?
0
Je te remercie, c’est exactement ce que je recherché….
Merci de ta patience et de tes explications qui mon permis de comprendre.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
14 févr. 2008 à 22:15
De rien...
T'es le bienvenu si t'as d'autres soucis.
A plus
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
15 févr. 2008 à 13:42
Salut jeremy124
Je jette un œil ce we ou ce soir à ton message.
A plus tard
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
15 févr. 2008 à 21:27
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
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
15 févr. 2008 à 22:36
De rien!
A plus
0
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 )
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
21 févr. 2008 à 15:52
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
0
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
0
finalement j ai resolu mom probleme
merci de ton aide
mon programme semble fini
bon WK
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
22 févr. 2008 à 13:26
De rien jeremy124
Bon we à toi aussi.
0
bonjour,
comment as tu résolue ton problème de j'ai exactement le même message d'erreur.
merci
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
28 févr. 2008 à 16:13
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...
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
4 mars 2008 à 23:15
Salut
Fais ton propre post et explique mieux.
A plus
0
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
9 mars 2008 à 01:26
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
0
medi2 Messages postés 6 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 13 mai 2008
12 mai 2008 à 17:54
insupportable ce forum ,j'ai envoye un message deux fois ei il a ete effacé !!
je peux comprendre pourquoi.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
12 mai 2008 à 18:37
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
0
medi2 Messages postés 6 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 13 mai 2008 > Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009
13 mai 2008 à 15:44
Effectivement c'est insupportable ,car on supprime des messages sans se donner la peine de motiver ,un minimum de respect !
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834 > medi2 Messages postés 6 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 13 mai 2008
13 mai 2008 à 16:31
Le 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
0
medi2 Messages postés 6 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 13 mai 2008 > Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009
13 mai 2008 à 20:58
Entendu ,et merci
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834 > medi2 Messages postés 6 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 13 mai 2008
13 mai 2008 à 21:45
De rien.
Et puis, t'en fais pas, si t'as jamais posté ici, tu pouvais pas savoir.
A plus
0