PICCOLO AIUTINO

di il
85 risposte

PICCOLO AIUTINO

Salve a tutta comunity, sono nuovo in questo forum . Mi sto avvicinado all'uso di questo valido programma che sembra avere molte funzioni. Bene, mi chiedevo se qualche anima pia potesse darmi suggerimenti su come iniziare visto che devo scrivere un piccolo progammino che legge un file di testo or excel per la generazione di una matrice per poi risolvere un problema agli autovettori. Mi spiego meglio , devo risolvere questa soluzione |K-omega^2*M|=0 . Adesso mediante un programma di calcolo (sono un ingegnere civile ) mi ricavo sia K( matrice di rigidezza ) che M(matrice di massa), ma in forma di testo del tipo :
riga colonna elemento
1 1 753362,3173
2 1 27394,91824
3 1 -12498,27972
7 1 0,00E+00
8 1 0,00E+00
9 1 0,00E+00
10 1 -4166,09324
11 1 0,00E+00
12 1 -12498,27972
13 1 -13697,45912
14 1 27394,91824
15 1 0,00E+00
2 2 99935,4343
3 2 0,00E+00
7 2 0,00E+00
8 2 10698,68258
9 2 -32096,04773
10 2 0,00E+00
11 2 -4427,719538
12 2 0,00E+00
13 2 -27394,91824
14 2 35636,22281
15 2 0,00E+00
3 3 78469,75885
7 3 -10698,68258
8 3 0,00E+00
9 3 -21397,36516
10 3 12498,27972
11 3 0,00E+00
12 3 24725,76338
13 3 0,00E+00
14 3 0,00E+00
15 3 -6641,579307
4 4 753362,3173
5 4 -27394,91824
6 4 12498,27972
7 4 0,00E+00
8 4 0,00E+00
9 4 0,00E+00
10 4 -13697,45912
11 4 -27394,91824
12 4 0,00E+00
13 4 -4166,09324
14 4 0,00E+00
15 4 12498,27972
5 5 99935,4343
6 5 0,00E+00
7 5 0,00E+00
8 5 10698,68258
9 5 32096,04773
10 5 27394,91824
11 5 35636,22281
12 5 0,00E+00
13 5 0,00E+00
14 5 -4427,719538
15 5 0,00E+00
6 6 78469,75885
7 6 -10698,68258
8 6 0,00E+00
9 6 21397,36516
10 6 0,00E+00
11 6 0,00E+00
12 6 -6641,579307
13 6 -12498,27972
14 6 0,00E+00
15 6 24725,76338
7 7 28529,82021
8 7 0,00E+00
9 7 0,00E+00
10 7 0,00E+00
11 7 0,00E+00
12 7 -10698,68258
13 7 0,00E+00
14 7 0,00E+00
15 7 -10698,68258
8 8 28529,82021
9 8 0,00E+00
10 8 0,00E+00
11 8 10698,68258
12 8 0,00E+00
13 8 0,00E+00
14 8 10698,68258
15 8 0,00E+00
9 9 385229,8886
10 9 0,00E+00
11 9 32096,04773
12 9 -21397,36516
13 9 0,00E+00
14 9 -32096,04773
15 9 21397,36516
10 10 753362,3173
11 10 27394,91824
12 10 12498,27972
11 11 99935,4343
12 11 0,00E+00
12 12 78469,75885
13 13 753362,3173
14 13 -27394,91824
15 13 -12498,27972
14 14 99935,4343
15 14 0,00E+00
15 15 78469,75885
Pertanto il mio problema è quello di creare la matrice quadrata, avete qualche suggerimento su come procedere ? grazie a chiuque voglia dare il suo contributo

85 Risposte

  • Re: PICCOLO AIUTINO

    E' abbastanza semplice, servono solo due righe di codice, la prima per leggere la colonna dei dati e la seconda per riordinarli.
    Per leggere il file excel puoi usare la funzione xlsread, da cui fai estrarre direttamente la terza colonna, senza considerare le altre due. Dovrebbe andare bene qualcosa del genere
    A= xlsread('nomeFile.xls', 1, 'C1:C225');
    Qui trovi la documentazione della funzione xlsread:
    Il secondo argomento della funzione corrisponde al foglio del file excel dove sono contenuti i dati.
    Poi usi la funzione reshape per trasformare il vettore in matrice.
    B = reshape(A,15,15);
    Qui trovi la documentazione per la funzione reshape:
  • Re: PICCOLO AIUTINO

    Grazie intanto per la pronta risposta
    Ok , sulla prima parte , ossia ricavare il vettore colonnna A=(15x1) , ma ho il problema nel comando B=reshape (A,15,15) , in quanto mi da il seguente errore:
    Error using reshape
    To RESHAPE the number of elements must not change.
  • Re: PICCOLO AIUTINO

    Perché A è 15x1? e non 225x1?
    Poi, non so se nei numeri che hai messo nel primo post hai cancellato qualche riga, ma mi sembra che siano meno di 225. Le altre righe? Forse vuoi dargli un valore di default?
    Tra l'altro sto notando che non sono in ordine, nelle ultime righe si alternano la riga 14 con la 15.
    Se le righe non sono ordinate non puoi fare il reshape ma devi assegnare ciascun numero della terza colonna al "posto" che viene assegnato dalle prime due.
    Controlla anche che abbia letto bene i numeri (che abbia interpretato la virgola come un punto e non come un separatore).
  • Re: PICCOLO AIUTINO

    La matrice di partenza è una 15*15, ma come hai osservato tu giustamente non sono ordianati , cosa che dovrei fare io , in effetti penso che la funzione reshape non sia appropriata in questa fase, poichè come vedi dal file il valore ( 753362,3173) è l'emento della prima riga/prima colonna, mentre il numero (27394,91824) si trova nella seconda riga/1colonna -12498,27972 terza riga/ prima colonna e cosi via, pertanto dovrei trovare la sintassi per ordinare correttamente la matrice.
  • Re: PICCOLO AIUTINO

    In effetti nel controllare meglio la matrice mi accordo che è stata riportata solo la meta, in quanto è simmetrica , ma rimane sempre una 15*15
  • Re: PICCOLO AIUTINO

    Ok, allora dovrai estrarre anche le prime due colonne. puoi farlo modificando l'istruzione che legge il file excel per ritrovarti la matrice A con tre colonne. A questo punto, A(:,1) rappresenta gli indici di riga, A(:,2) gli indici di colonna, A(:,3) i valori da assegnare.
    Ti conviene inizializzare prima la matrice, dato che ne conosci già le dimensioni.
    B=zeros(15);
    Ti crea una matrice di zeri 15x15.
    E poi, ti faccio l'esempio per un valore:
    B(A(1,1),A(1,2))=A(1,3);
    Fai un ciclo che faccia questo per tutta la matrice A e dovresti avere in B tutti i valori presenti nella matrice di partenza.
  • Re: PICCOLO AIUTINO

    Ho estratto le singole colonne, creato la matrice 15*15 di zeri adesso non capisco questa sintassi:
    B(A(1,1),A(1,2))=A(1,3);
    Non vorrei approfittare della tua disponibilità , ma potresti impostarmi il ciclo ? sono veramente alle prime armi ?
    Grazie mille
  • Re: PICCOLO AIUTINO

    Ok , mi estrae il primo rigo della prima colonna, creando cosi una 1*1, ma come imposto il ciclo per avere tutta la matrice?
  • Re: PICCOLO AIUTINO

    Allora, faccio un esempio. Inizializzo la matrice di partenza con tutti zeri.
    B=zeros(3);
    
    Se io voglio assegnare il numero 23 al primo elemento della matrice, scrivo:
    B(1,1)=23;
    Se voglio assegnare il numero 45 all'elemento nella seconda riga e terza colonna, scrivo:
    B(2,3)=45;
    A questo punto dovrebbe essere chiara la sintassi di prima:
    B(A(1,1),A(1,2))=A(1,3);
    Cioè, l'indice delle righe è memorizzato nella prima colonna della matrice A, l'indice delle colonne è memorizzato nella seconda colonna della matrice A, il numero da assegnare è nella terza colonna.
    Quindi se la prima riga della matrice A fosse fatta così:
    [1 1 23]
    si tornerebbe al primo esempio.
    Se poi la sesta riga della matrice A fosse così:
    [2 3 45]
    dovrei scrivere:
    B(A(6,1),A(6,2))=A(6,3);
    Quindi cambiano i primi indici di A, mentre i secondi indici rimangono sempre 1 2 e 3.

    Ora ti faccio un esempio di ciclo for, così puoi mettere insieme tutte le informazioni:
    for i = 1:10
    n(i)=i;
    end
    Questo ciclo crea un vettore di numeri da 1 a 10.
  • Re: PICCOLO AIUTINO

    Sto ancora cercando di creare il ciclo for ? l'indice i dovrebbe creare la seguente matrice vero ?
    B(A(15,1),A(15,2))=A(15,3) pertanto il ciclo dovrebbe stare dopo la precedente sintassi vero ?
  • Re: PICCOLO AIUTINO

    No...
    B(A(15,1),A(15,2))=A(15,3)
    Questo assegna all'elemento della matrice B, che è identificato dalle coordinate contenute nella quindicesima riga di A (nella prima e seconda colonna), il numero contenuto nella quindicesima riga di A, terza colonna.
    Se la quindicesima colonna di A fosse:
    [3 5 9]
    il codice di sopra equivarrebbe a scrivere
    B(3,5)=9;
    che equivarrebbe a dire: "assegna il numero nove all'elemento che si trova nella terza riga, quinta colonna di B.

    Ti consiglio, prima di passare a creare il ciclo, di capire la sintassi. Il ciclo poi verrà "in automatico" una volta che avrai capito.

    Prova a scrivere la stessa riga di codice per le prime tre righe della matrice A.
  • Re: PICCOLO AIUTINO

    Ciao
    Potresti controllare cortesemente se ho capito bene ?
    A =

    1 2 3
    3 4 5
    6 7 8

    >> B=zeros(3)

    B =

    0 0 0
    0 0 0
    0 0 0

    >> A(:,1)

    ans =

    1
    3
    6

    >> A(:,2)

    ans =

    2
    4
    7

    >> A(:,3)

    ans =

    3
    5
    8

    >> B(A(1,1),A(1,2))=A(3,3)

    B =

    0 8 0
    0 0 0
    0 0 0
    Mi aspetterei di in numero 8 nella prima riga, prima colonna, ma purtroppo non è cosi.
  • Re: PICCOLO AIUTINO

    No! Perché?!?!
    tu sai che sulla prima riga di A ci sono tutte le informazioni che riguardano un punto specifico.
    Quindi
    B(A(1,1),A(1,2))=A(1,3)
    La posizione dell'elemento è giusta, prima riga, seconda colonna. Ma il numero corrisponde al contenuto di A nella prima riga, terza colonna, quindi 3.
  • Re: PICCOLO AIUTINO

    Purtroppo ancora niente c'è qualcosa che sbaglio......aihmè , ma non mollo
Devi accedere o registrarti per scrivere nel forum
85 risposte