Implementazione di un ciclo For , combinazione vettori

di il
6 risposte

Implementazione di un ciclo For , combinazione vettori

Salve, sono nuovo del forum e ho la necessità di un confronto.
Spiegherò nel breve (per quanto riesca) la mia problematica: sto realizzando un programma abbastanza massiccio per la mia tesi di Laurea ma non ho una dimestichezza assoluta con Matlab e sto riscontrando delle problematiche di tanto in tanto; molte risolte anche grazie al forum e altre che spero di risolvere grazie a voi.

Esplicherò un esempio in modo da non utilizzare le notazioni che sono relative alla fluidodinamica e non facilmente spiegabili nel breve ma che possano dare un'aiuto alla comprensione della problematica.

Nel concreto parto dall'avare diverse variabili e funzioni definite precedentemente (il tutto funziona)
La problematica parte nel seguito:
Devo definire due vettori riga di valori a noti a priori, che ho fatto in questo modo
a = [ 0.2 : 0.05 : 0.6]
b = k [1 : 0.025 : 1.2]

dove k rappresenta una costante/variabile (di valore già valore noto).
Quello che devo fare è creare tutte le combinazioni possibili tra i vettori a e b che rappresentano due variabili nelle funzioni che esplicherò nel seguito. Ogni vettore ,se non erro, è costituito da 9 valori per cui dovrei ottenere 81 combinazioni. Io le ho ottenute in questo modo (correggetemi se sbaglio):

A = ones(length(b),1) * a;
B = (ones(length(a), 1) * b)';
C= [a(:) b(:)]

Quello che ho creato è una matrice C con nella prima colonna tutti i valori di a e seconda colonna i valori di b(moltiplicati per la costante k) in tutte le combinazioni.

Ora definisco delle funzioni (le chiamerò con lettere dell'alfabeto per semplicità e metterò operazioni basilari):

c = 0.5 * 2/(1-a)
d = 3/(pi* b^2)
e = 6+2a^3
m= 3-1(a+b)

In realtà i numeri che ho messo sono delle variabili calcolate prima ma non cambia la questione. Quello che devo fare è ottenere come risultato una "lista" (che vorrei salvare in un file .txt per poi creare un grafico) con i valori di (c , d, e, m) ordinati per colonne, al variare di tutte le combinazioni che ho trovato in C.

Io ho provato con due cicli for:

[i,j]=size(C)
for a=1:1:i
for b=1:1:j

c = 0.5 * 2/(1-a)
d = 3/(pi* b^2)
e = 6+2a^3
m= 3-1(a+b)

end
end

Ma i risultati che ottengo non sono corretti.

Ringrazio in anticipo per le risposte. M

6 Risposte

  • Re: Implementazione di un ciclo For , combinazione vettori

    Non si e' capito nulla.

    Ti sembrera' strano, ma un laureato in Informatica ne sa abbastanza di algebra lineare, algebra astratta (gruppi, anelli,campi), spazi vettoriali, funzioni . Qualcuno anche di equazioni differenziali.

    Al contrario, pur essendo alla scrittura della tesi, stai usando la terminologia ""matematica"" (per non parlare dell' ""informatichese"") abbastanza a ""sproposito"".
    Quello che devo fare è creare tutte le combinazioni possibili tra i vettori a e b che rappresentano due variabili nelle funzioni che esplicherò nel seguito
    Si chama prodotto esterno tra vettori, operazione, in qualche modo, complementare al prodotto scalare tra vettori e che ha qualche relazione con il prodotto vettoriale
    A = ones(length(b),1) * a;
    B = (ones(length(a), 1) * b)';
    C= [a(:) b(:)]
    Che te ne fai di A e B se poi non li usi? Inoltre, NON SERVONO ASSOLUTAMENTE A NULLA perche' hai semplicemente scritto che A e' uguale ad 'a' MOLTIPLICATO PER UNO.
    Ora definisco delle funzioni
    Non sono funzioni, sono semplici valori numerici
    Io ho provato con due cicli for:
    I valori di 'a' e 'b' sono [1,2,3...i] e [1,2,3,...j] NON 'C[a,b]': UNA COSA e' l'indice in una matrice, ed UNA COSA e' il contenuto nella cella alle coordinate [a,b] della matrice. Questi CONCETTI sono NORMALI concetti in matematica e che hanno una corrspondenza 1:1 con i corrispondenti oggetti in Matlab.

    Quindi, per PRIMA COSA devi aver CHIARO come affrontare il problema in termini ""matematici"" (vettori, matrici, tensori, funzioni, ecc) e SOLO DOPO puoi mappare la soluzione matematica usando gli strumenti di Matlab
  • Re: Implementazione di un ciclo For , combinazione vettori

    Ho visto solo ora la risposta, scusami per il ritardo.
    Evidentemente mi sono spiegato male.
    Il mio non è un problema numerico ma lo affronto in maniera numerica come di consueto per sviluppare problemi del mio tipo.
    Quello che ho cercato di scrivere sopra è un esempio di base da cui partire per farmi un'idea ma non ha niente a che fare con ciò che sto facendo.
    Io NON SO di preciso chi risponde al forum e le sue competenze per cui ho utilizzato un linguaggio di base, comprensibile a tutti, senza avere nozioni di matematica di base o avanzata (errore mio, ma è la prima volta che scrivo qui e ho visto diversi post scritti in questo modo). Per quanto riguarda l'utilizzo di Matlab sono un neofita per cui sto solo cercando di capire.

    Lo scrivo in maniera diversa, spero comprensibile questa volta:
    Devo determinare (A) e (B), due coefficienti adimensionali. Quando ho osservato che i parametri che influenzano i valori da ricavare (e la non linearità delle equazioni) ho ritenuto conveniente considerare una matrice di valori relativi ad un rapporto, a, e ad un altro coefficiente b rappresentato da un'altro parametro adimensionale.

    a=[0.2 : 0.05 : 0.6]
    b=k[1 : 0.025 : 1.2]

    Per ogni coppia di (a,b) individuabile in questa matrice devo risolvere circa 20 funzioni (sono in questo caso formule di natura semiempirica) direttamente dipendenti dai valori di a e b, che mi permetta di creare grazie ai valori che ricaverò all'interno del ciclo for, un grafico con in ascisse i valori di a e in ordinate b e all'interno delle linee di livello e una curva al fine di ricavare un punto di mio interesse. La mia difficoltà è insita nel creare un ciclo for che mi permetta, ad ogni ciclo, di determinare i valori puntuali delle funzioni al variare dei parametri a e b. Per come utilizzo io Matlab al fine di creare dei grafici, in via generale, preferisco salvare i dati in file dati.tex da richiamare poi all'evenienza. Spero di essere stato più chiaro.
  • Re: Implementazione di un ciclo For , combinazione vettori

    Ancora lontani dalla comprensione.

    TENTO di riformulare usando una terminologia piu' ""consona"":

    1) hai 20 funzioni da R^2 in R (R: numeri reali), cioe' a DUE parametri., Il dominio di queste funzioni e' il rettangolo [0.2,0.6]x[1,1.2] <= R^2
    2) hai DISCRETIZZATO i punti del rettangolo in 9 valori per ogni coordinata, generando una matrice 9x9=81 punti (ma 9 e' solo una possibile scelta, potrebbero essere 3 o anche 99)
    3) per OGN'uno dei sudetti punti hai modo di calcolare il valore delle sudette 20 funzioni
    4) a questo punto, vuoi poter calcolare il valore di ogni funzione su un QUALUNQUE PUNTO del rettangolo [0.2,0.6]x[1,1.2].

    SE E' QUESTO l'obiettivo, DEVI CERCARE la documentazione su come si valuta una funzione CONTINUA, mediante INTERPOLAZIONE, avendo a disposizione un numero DISCRETO di punti in cui la funzione e' stata valutata ed il corrispondente valore.

    Praticamente NON TI SERVIRA' NESSUN CICLO FOR.
  • Re: Implementazione di un ciclo For , combinazione vettori

    Ti ringrazio nell'impegno che riponi nel rispondermi e noto che sei molto puntuale ma non siamo sulla stessa lunghezza d'onda. Non riesco a spiegarmi come vorrei ma semplificare l'argomento che sto trattando diventa difficile.
    Ci riprovo un'ultima volta altrimenti cercherò una soluzione alternativa e la posterò.

    Io ho:
    a = [0.2 : 0.05 : 0.6];
    b = k*[1 : 0.025 :1.2];
    
    %trovo con il codice scritto nella domanda iniziale questo
    
    v=
        0.2000    0.2499
        0.2000    0.2562
        0.2000    0.2624
        0.2000    0.2687
        0.2000    0.2749
        0.2000    0.2812
        0.2000    0.2874
        0.2000    0.2937
        0.2000    0.2999
        0.2500    0.2499
        0.2500    0.2562
        0.2500    0.2624
        0.2500    0.2687
        0.2500    0.2749
        0.2500    0.2812
        0.2500    0.2874
        0.2500    0.2937
        0.2500    0.2999
        0.3000    0.2499
        0.3000    0.2562
        0.3000    0.2624
        0.3000    0.2687
        0.3000    0.2749
        0.3000    0.2812
        0.3000    0.2874
        0.3000    0.2937
        0.3000    0.2999
        0.3500    0.2499
        0.3500    0.2562
        0.3500    0.2624
        0.3500    0.2687
        0.3500    0.2749
        0.3500    0.2812
        0.3500    0.2874
        0.3500    0.2937
        0.3500    0.2999
        0.4000    0.2499
        0.4000    0.2562
        0.4000    0.2624
        0.4000    0.2687
        0.4000    0.2749
        0.4000    0.2812
        0.4000    0.2874
        0.4000    0.2937
        0.4000    0.2999
        0.4500    0.2499
        0.4500    0.2562
        0.4500    0.2624
        0.4500    0.2687
        0.4500    0.2749
        0.4500    0.2812
        0.4500    0.2874
        0.4500    0.2937
        0.4500    0.2999
        0.5000    0.2499
        0.5000    0.2562
        0.5000    0.2624
        0.5000    0.2687
        0.5000    0.2749
        0.5000    0.2812
        0.5000    0.2874
        0.5000    0.2937
        0.5000    0.2999
        0.5500    0.2499
        0.5500    0.2562
        0.5500    0.2624
        0.5500    0.2687
        0.5500    0.2749
        0.5500    0.2812
        0.5500    0.2874
        0.5500    0.2937
        0.5500    0.2999
        0.6000    0.2499
        0.6000    0.2562
        0.6000    0.2624
        0.6000    0.2687
        0.6000    0.2749
        0.6000    0.2812
        0.6000    0.2874
        0.6000    0.2937
        0.6000    0.2999
    Ora la matrice (v) rappresenta una matrice di due colonne e diverse righe. Ogni colonna rappresenta rispettivamente a sinistra i valori di (a) e a destra quelli di (b) per cui ogni riga rappresenta una possibile combinazione. Il mio dubbio è il seguente. Come posso fare per assegnare (e penso che sia una delle possibile soluzioni) implementare un ciclo for affinché ad ogni ciclo dalla matrice v, i valori di (a) e (b) assumano rispettivamente i valori di ogni riga ad ogni ciclo? (Ricordando ovviamente che all'interno del ciclo i valori di a e b sono inseriti all'interno di formulazioni semiempiriche (ma puoi considerarli anche come valori dimensionali). Il mio intento ultimo è salvare i valori di due "funzioni dipendenti da a e b" all'interno del ciclo in un set di dati da esportare in .txt. Devo creare una sorta di procedura iterativa che ad ogni ciclo mi salvi però i valori, non devo andare a convergenza da nessuna parte in quanto non è quello l'intento.
    Spero di essere stato più chiaro altrimenti ti ringrazio comunque per l'impegno e la dedizione
  • Re: Implementazione di un ciclo For , combinazione vettori

    Forse è più semplice di quello che sembra.
    Se hai
    [*] la matrice "v" con le coppie di valori (prima colonna con i valori di "a", seconda colonna con i valori di "b")
    [*] i set di equazioni

    c = 0.5 * 2/(1-a)
    d = 3/(pi* b^2)
    e = 6+2a^3
    m= 3-1(a+b)

    [*] se vuoi calcolare i valori di c, d e ed m per ognuna delle 81 coppie di valori di "a" e "b" (nota che se, anche se le equazioni sono "semplificate" e non corrispondono a quelle "vere", nell'esempio, solo l'ultima contiene entrambe le variabili "a" e "b", nelle altre equazioni otterrai solo 9 valori distinti)

    puoi impostare un ciclo for oppure sfruttare la proprietà di indexing di MatLab.

    Nel caso del ciclo for, in quello che hai impostato

    [code+
    [i,j]=size(C)
    for a=1:1:i
    for b=1:1:j
    c = 0.5 * 2/(1-a)
    d = 3/(pi* b^2)
    e = 6+2a^3
    m= 3-1(a+b)
    end
    end
    [/code]
    ci sono diversi errori.

    Assumendo che la matrice "C" sia, in realtà la matrice "v" che hai pubblicato nell'ultima domanda:
    [*] un ciclo è sufficiente, se la prima colonna contiene i valori di "a" e la seconda colonna i valori di "b"
    [*] usi l'indice del ciclo direttamente nel calcolo mentre dovresti usarlo per accedere ai valori della matrice "v" (o C)
    [*] le variabili di output (c, d, e, m) vengono sovrascritte ad ogni iterazione per cui, al termine del ciclo for, conterranno solo l'ultimo valore calcolato
    [*] manca l'operatore "*" (moltiplicazione) in alcuni casi (es. 2a)

    Una possibile implementazione del ciclo for potrebbe essere:
    
    [n_row,n_col]=size(v)
    % Iizializzazione vettori di output
    c=nan(n_row,1);
    d=c;
    e=c;
    m=c;
    % Loop sui valori delle coppie "a" w "b"
    for i=1:n_row
          c(i) = 0.5 .* 2./(1-v(i,1));
          d(i) = 3./(pi.* v(i,2)^2);
          e(i) = 6+2.*v(i,1)^3;
          m(i)= 3-1.*(v(i,1)+v(i,2));
    end
    
  • Re: Implementazione di un ciclo For , combinazione vettori

    Ti ringrazio per la risposta, molto chiara anche nel farmi comprendere i vari errori di implementazione che è ciò che preferisco quando scrivo in un forum.
    Capire ciò che si fa è il primo passo.
    Detto questo, dopo svariati tentativi sono riuscito a implementare qualcosa di simile a quello che mi hai proposto (un codice molto rudimentale nonché anche scomodo per poi utilizzare i valori successivamente) ma che mi ha aiutato (più o meno) allo scopo.
    Appena mi è possibile proverò ad utilizzare la metodologia da te proposta che almeno a primo vista è molto più compatta della mia (cosa molto comoda quando hai un programma abbastanza lungo) e vedrò il risultato che sicuramente sarà migliore del mio.
    Grazie ancora
Devi accedere o registrarti per scrivere nel forum
6 risposte