Probleme matlab

Résolu
jeremy124 -  
 adrien -
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.
A voir également:

20 réponses

Sacabouffe Messages postés 10427 Statut Membre 1 835
 
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
jeremy124
 
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 10427 Statut Membre 1 835
 
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
jeremy124
 
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 10427 Statut Membre 1 835
 
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
jeremy124
 
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 10427 Statut Membre 1 835
 
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
jeremy124
 
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 10427 Statut Membre 1 835
 
De rien...
T'es le bienvenu si t'as d'autres soucis.
A plus
0
jeremy124
 
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 10427 Statut Membre 1 835
 
Salut jeremy124
Je jette un œil ce we ou ce soir à ton message.
A plus tard
0
Sacabouffe Messages postés 10427 Statut Membre 1 835
 
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
jeremy124
 
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 10427 Statut Membre 1 835
 
De rien!
A plus
0
jeremy124
 
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
jeremy124
 
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 10427 Statut Membre 1 835
 
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
jeremy124
 
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
jeremy124
 
finalement j ai resolu mom probleme
merci de ton aide
mon programme semble fini
bon WK
0
Sacabouffe Messages postés 10427 Statut Membre 1 835
 
De rien jeremy124
Bon we à toi aussi.
0
adrien
 
bonjour,
comment as tu résolue ton problème de j'ai exactement le même message d'erreur.
merci
0
jeremy124
 
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 10427 Statut Membre 1 835
 
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
bibou12
 
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 10427 Statut Membre 1 835
 
Salut
Fais ton propre post et explique mieux.
A plus
0
jeremy124
 
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 10427 Statut Membre 1 835
 
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 Statut Membre
 
insupportable ce forum ,j'ai envoye un message deux fois ei il a ete effacé !!
je peux comprendre pourquoi.
0
Sacabouffe Messages postés 10427 Statut Membre 1 835
 
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 Statut Membre > Sacabouffe Messages postés 10427 Statut Membre
 
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 10427 Statut Membre 1 835 > medi2 Messages postés 6 Statut Membre
 
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 Statut Membre > Sacabouffe Messages postés 10427 Statut Membre
 
Entendu ,et merci
0
Sacabouffe Messages postés 10427 Statut Membre 1 835 > medi2 Messages postés 6 Statut Membre
 
De rien.
Et puis, t'en fais pas, si t'as jamais posté ici, tu pouvais pas savoir.
A plus
0