Creare matrici automaticamente

di il
5 risposte

Creare matrici automaticamente

Salve a tutti è la prima volta che scrivo su un forum ma non so proprio come fare.
sto creando un modello per un edificio a tre piani con 4 pilastri (modello semplificato). ho creato 6 casi di carico con i quali andare a creare la matrice delle masse dell'edificio, l'obiettivo è quello di far girare automaticamente questi casi creando n combinazioni (n potrebbe variare da 100 a 1000) e quindi creare n matrici delle masse che poi si combineranno con la matrice delle rigidezze per individuare dei valori come la frequenza che poi dovranno essere immagazzinati e elaborati successivamente.
al momento riesco a creare in modo manuale una sola matrice per volta con lo stesso caso di carico che si ripete per tutti i piani in questo modo:
esempio caso 6

M=zeros(9,9);
mm=m(6)
II=I0(6)
for i=1:3:9
M(i,i)=mm;
M(i+1,i+1)=mm;
M(i+2,i+2)=II;
end

disp(M);
[autovettori,autovalori]= eig(K,M);
omq=diag(autovalori);
psi=autovettori
om=omq.^0.5
f=om./(2*pi)
T=f.^(-1)

% controllo che utovettori siano normalizzati rispetto alla patrice delle masse: i seguenti prodotti devono venire = 1
psi(:,1)'*M*psi(:,1)
psi(:,2)'*M*psi(:,2)
psi(:,3)'*M*psi(:,3)
psi'*M*psi
savefile = '6.mat'; % salva le elaborazioni
save(savefile,'om','f','T','psi')% salva output nel file denominato "savefile"


spero di essermi spiegato...grazie in anticipo

5 Risposte

  • Re: Creare matrici automaticamente

    Non è chiaro quale sia la difficoltà che stai incontrando e perchè tu riesca a creare in modo "manuale" solo un caso.

    Si direbbe che vuoi "automatizzare" la parte nella quale assegni i valori a "mm" e "II", ma non si capisce quale sia logica da usare per automatizzare il procecsso.
    mm=m(6)
    II=I0(6)
    In che modo varia l'indice per accedere ai valori di "m" e "I0" (adesso uguale a 6)?

    Perchè non puoi inserire il tutto in un ciclo for con indice, ad esempio "idx"?
    mm=m(idx)
    II=I0(idx)
    Per creare a matrice diagonale "M" non c'è bisogno di un ciclo for; basta definire il vettore che contiene i valori della diagonale ed usare la funzione "diag" per creare la matrice diagonale corrispondente.
    In base al tuo codice attuale:
    M1=diag(repmat([mm mm II],1,3))
  • Re: Creare matrici automaticamente

    Ciao grazie per avermi risposto
    comunque l'indice di m e I0 variano da 1 a 6 in base al caso di carico analizzato (adesso per ogni piano ho sempre lo stesso caso). per automatizzare il processo diciamo che si dovrebbero creare delle combinazioni di questi sei casi del tipo (piano 1 caso 2, piano 2 caso 4, piano 3 caso 1) diciamo un po random , il mio obiettivo è quello di creare un centinaio di combinazioni e di conseguenza lo stesso numero di matrici per vedere come variano i valori che sto cercando.

    ps ho provato a scriverti un messaggio privato ma non so se sono riuscito ad inviarlo
  • Re: Creare matrici automaticamente

    Se "m" e "I0" vanno entrambi da 1 a 6 puoi ottenere al massimo 36 combinazioni, non "un centinaio", a meno che, nella creazione della matrice diagonale il primo ed il secondo elemento della diagonale possano essere diversi (ne codice che ha pubblicato il primi due elementi sono uguali: M(i,i)=mm e M(i+1,i+1)=mm).

    Detto questo e, se devono essere uguali, basta generare le 36 possibili combinazioni
    
    % Dewfinizione del numero di casi
    n_casi=6
    % Crezione di un set di inourt di esempio
    m=randi([1 100],1,n_casi)
    I0=randi([1 100],1,n_casi)
    % Creazione della base per la definizione delle combinazioni
    base=1:n_casi
    % Creazione della prima colonna degli indici delle combinazioni
    col_1=reshape(bsxfun(@plus,zeros(1,n_casi),[1:n_casi]')',n_casi*n_casi,1)
    % Creazione della seconda colonna degli indici delle combinazioni
    col_2=repmat(base,1,n_casi)'
    % Creazione della matrice degli indici delle combinazioni
    m_I0_idx=[col_1 col_2]
    % Loop attraverso le possibili combinazioni
    for i=1:size(m_I0_idx,1)
        M=diag(repmat([m(m_I0_idx(i,1)) m(m_I0_idx(i,1)) I0(m_I0_idx(i,2))],1,3))
        % Aggiugere qui il resto del tuo codice
    end
    
  • Re: Creare matrici automaticamente

    ask_raf ha scritto:


    Se "m" e "I0" vanno entrambi da 1 a 6 puoi ottenere al massimo 36 combinazioni, non "un centinaio", a meno che, nella creazione della matrice diagonale il primo ed il secondo elemento della diagonale possano essere diversi (ne codice che ha pubblicato il primi due elementi sono uguali: M(i,i)=mm e M(i+1,i+1)=mm).

    Detto questo e, se devono essere uguali, basta generare le 36 possibili combinazioni
    
    % Dewfinizione del numero di casi
    n_casi=6
    % Crezione di un set di inourt di esempio
    m=randi([1 100],1,n_casi)
    I0=randi([1 100],1,n_casi)
    % Creazione della base per la definizione delle combinazioni
    base=1:n_casi
    % Creazione della prima colonna degli indici delle combinazioni
    col_1=reshape(bsxfun(@plus,zeros(1,n_casi),[1:n_casi]')',n_casi*n_casi,1)
    % Creazione della seconda colonna degli indici delle combinazioni
    col_2=repmat(base,1,n_casi)'
    % Creazione della matrice degli indici delle combinazioni
    m_I0_idx=[col_1 col_2]
    % Loop attraverso le possibili combinazioni
    for i=1:size(m_I0_idx,1)
        M=diag(repmat([m(m_I0_idx(i,1)) m(m_I0_idx(i,1)) I0(m_I0_idx(i,2))],1,3))
        % Aggiugere qui il resto del tuo codice
    end
    
    ciao e grazie ancora
    ho provato a inserire il tuo codice però forse non mi sono riuscito a spiegare
    le combinazioni sono più di 36 perché sono formate da tre elementi (111 112 113.....664 665 666)
    per questo dicevo che ne avrei prese un centinaio perchè poi le devo analizzare e lo dovrei fare su un caso più complicato

    comunque mi ripeto grazie ancora per la mano che mi stai dando
  • Re: Creare matrici automaticamente

    OK.
    Se ho capito, la cosa più semplice che puoi fare è:
    [*] creare una matrice con tutte le combinazioni con tre cicli for annidati (dal momento che hai a che fare un numeri di combinazioni non eccessivamente grandi non ci dovrebbero essere problemi di "prestazioni"
    [*] usare la funzione "randperm" per "mischiare" le combinazioni
    [*] selezionare il numero di casi che vuoi analizzare estraendo, dalla matrice il corrispondente numero di righe
    [*] stando al codice che hai pubblicato, puoi usare gli indici estratti come indici per accedere ai vettori "m" e I0" per creare la matrice "M".

    Volendo creare un codice più completo, potresti creare la matrice con gli indici la prima volta che esegui il codice e salvarla in un file ".mat"
    Ogni volta che utilizzi il codice, puoi caricare la matrice, estrarre gli indici che ti servono, cancellare le righe corrispondenti e salvare la matrice.
    In questo modo, con lanci successivi del codice puoi analizzare tutti i casi.

    Di seguito, una possibile implementazione (senza la parte di salvataggio e caricamento della matrice - non ho molto tempo in questo momento, mi dispiace).
    % Define the cases
    n_cases=6
    cases=1:n_cases;
    % Select the numner of cases to be analysed
    sel_cases=13
    % Initialize the matrix with the index combinations
    idx_matrix=[]
    % Create the matrix with the index combinations
    for i=1:n_cases
       for j=1:n_cases
          for k=1:n_cases
             idx_matrix=[idx_matrix;i j k];
          end
       end
    end
    % Shuffle the indices
    idx_matrix=idx_matrix(randperm(size(idx_matrix,1)),:)
    % Extract the set of cases to be analyzed
    cases_idx=idx_matrix(1:sel_cases,:)
    
    for i=1:sel_cases
        
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % INSERISCI QUI IL TUO CODICE PER L'ANALISI
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    end
    
    
    
    return
    
Devi accedere o registrarti per scrivere nel forum
5 risposte