Aiuto!!!risoluzione sistema lineare in matlab.
Ciao a tutti.
Per l'esame di Aeroelasticità devo risolvere con Matlab un sistema lineare in forma matriciale.Allora vi posto il mio script di matlab con il quale non riesco a risolvere un bel niente sperando che qualcuno di voi mi aiuti:
Vi spiego il mio procedimento:
devo risolvere il sistema:
$ x(t)=sumC_kx_k $
lo script è il seguente
$ X=[0;0;0.01;0] $
$ V=[V_11,V_21,V_31,V_41,..........V_41,V_42,V_43,V_44] $
V_1=inv(V)
V_2=V_1'
for i=1:4
for j=1:4
C(i,: ) = (V_2(i,j)*X(i,: ) )
end
end
disp('C')
l'errore è il seguente:
??? Error using ==> prova
Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.
dove le x(t) al primo menbro sono i termini noti,$ V $ (4x4)è la matrice quadrata degli autovettori del mio sistema di partenza,da invertire(ci sono dentro numeri complessi coniugati)
Ho fatto eseguire il ciclo in modo da prendere per la componente $ C_1 $ diciamo $ V_11 $,per $ C_2 $ $ V_21 $ e via dicendo
il ragionamento da me seguito è $ 0= C_1*V_11 + C_2*V_21+ C_3*V_31+ C4*V_41 $ e cosi via per tutti gli altri prodotti.(credo cmq che se non sono riuscito a spiegarmi devo trovare i coefficienti c1,c2,c3,c4 che compaiono nella soluzione sopra x(t)=...
Ma impazzisco da 2 giorni per riuscire a vedere qualcosa ma non ci riesco.
dove sbaglio???
Per l'esame di Aeroelasticità devo risolvere con Matlab un sistema lineare in forma matriciale.Allora vi posto il mio script di matlab con il quale non riesco a risolvere un bel niente sperando che qualcuno di voi mi aiuti:
Vi spiego il mio procedimento:
devo risolvere il sistema:
$ x(t)=sumC_kx_k $
lo script è il seguente
$ X=[0;0;0.01;0] $
$ V=[V_11,V_21,V_31,V_41,..........V_41,V_42,V_43,V_44] $
V_1=inv(V)
V_2=V_1'
for i=1:4
for j=1:4
C(i,: ) = (V_2(i,j)*X(i,: ) )
end
end
disp('C')
l'errore è il seguente:
??? Error using ==> prova
Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.
dove le x(t) al primo menbro sono i termini noti,$ V $ (4x4)è la matrice quadrata degli autovettori del mio sistema di partenza,da invertire(ci sono dentro numeri complessi coniugati)
Ho fatto eseguire il ciclo in modo da prendere per la componente $ C_1 $ diciamo $ V_11 $,per $ C_2 $ $ V_21 $ e via dicendo
il ragionamento da me seguito è $ 0= C_1*V_11 + C_2*V_21+ C_3*V_31+ C4*V_41 $ e cosi via per tutti gli altri prodotti.(credo cmq che se non sono riuscito a spiegarmi devo trovare i coefficienti c1,c2,c3,c4 che compaiono nella soluzione sopra x(t)=...
Ma impazzisco da 2 giorni per riuscire a vedere qualcosa ma non ci riesco.
dove sbaglio???
Risposte
Sto impazzendo pure io a leggere il tuo messaggio.
Questo crea una pagina larghissima che devo seguire con lo scroll orizzontale
Per ben iniziare, puoi aggiustare un po'?
Questo crea una pagina larghissima che devo seguire con lo scroll orizzontale
Per ben iniziare, puoi aggiustare un po'?
ok.scusami
dimmi dove non è chiaro,la matrice?
dimmi dove non è chiaro,la matrice?
(Edit: non c'è più bisogno di scroll)
Dunque, pur non conoscendo il linguaggio nel particolare, noto che
- la cosa chiamata "X" ha quattro valori fra parentesi quadre, separati da punto e virgola;
- la cosa chiamata "V" ha cinque valori fra parentesi quadre, separati da punto e virgola;
- il messaggio di errore è "All rows in the bracketed expression must have the same number of columns"
Ne concludo che X e V sono due vettori che hanno differente numero di colonne.
Io partirei da qui, che dici?
Dunque, pur non conoscendo il linguaggio nel particolare, noto che
- la cosa chiamata "X" ha quattro valori fra parentesi quadre, separati da punto e virgola;
- la cosa chiamata "V" ha cinque valori fra parentesi quadre, separati da punto e virgola;
- il messaggio di errore è "All rows in the bracketed expression must have the same number of columns"
Ne concludo che X e V sono due vettori che hanno differente numero di colonne.
Io partirei da qui, che dici?
Grazie della risposta,
avevo postato direttamente lo script...io credo che il problema sia non nel linguaggio sbagliato ma proprio nel concetto.Comumque il vettore X è un vettore colonna,V è una matrice 4x4.Hanno le stesse dimensioni.dichiarando la matrice,ne faccio l'inversa e poi la trasposta in modo da sbagliare il meno possibile.il problema arriva nel ciclo perchè comumque le incognite sono 4 pari alle dimensioni del vettore dei termini noti per cui credo che l'errore sia proprio nel prodotto che a quel punto è un righe per colonna ma ciclato.comumque adesso ricontrollo bene la scrittura della matrice V e vedo se è sbagliata la dimensione.spero che sia tuttoo li altrimenti confido in te...
avevo postato direttamente lo script...io credo che il problema sia non nel linguaggio sbagliato ma proprio nel concetto.Comumque il vettore X è un vettore colonna,V è una matrice 4x4.Hanno le stesse dimensioni.dichiarando la matrice,ne faccio l'inversa e poi la trasposta in modo da sbagliare il meno possibile.il problema arriva nel ciclo perchè comumque le incognite sono 4 pari alle dimensioni del vettore dei termini noti per cui credo che l'errore sia proprio nel prodotto che a quel punto è un righe per colonna ma ciclato.comumque adesso ricontrollo bene la scrittura della matrice V e vedo se è sbagliata la dimensione.spero che sia tuttoo li altrimenti confido in te...
Infatti... "All rows in the bracketed expression must have the same number of columns" potrebbe anche singnificare che tutte le (quattro? cinque? quante devono essere) componenti immesse in V devono avere la stessa cardinalità.
Decisamente, rivediti attentamente l'impostazione di V.
Decisamente, rivediti attentamente l'impostazione di V.
Grande!c'era un ; in più.Ho fatto girare il programma ma il vettore delle incognite non è esatto.il ciclo for è questo:
V_1=inv(V)
V_2=V_1
for i=1:4
for j=1:4
C(i,: ) = X(i ,: )*V_2(i,j)
end
end
cos'è sbagliato???
V_1=inv(V)
V_2=V_1
for i=1:4
for j=1:4
C(i,: ) = X(i ,: )*V_2(i,j)
end
end
cos'è sbagliato???
(A parte il fatto che non conosco un granché matlab) non ci vedo nulla di sbagliato [ma è V_2=V_1 oppure V_2=V_1'? ]
Magari aspettiamo un matlab-expert, io ho esaurito i consigli
Magari aspettiamo un matlab-expert, io ho esaurito i consigli

Ma devi per forza scrivere tu il codice per risolvere questo sistema lineare? Matlab fornisce funzioni e operatori specifici per risolvere sistemi lineari. Se X è la matrice colonna dei termini noti e V è la tua matrice allora è sufficiente scrivere
per risolvere il sistema lineare in matlab.
C = V \ X;
per risolvere il sistema lineare in matlab.
@apatriarca
Mi pareva strano che fosse necessario tutto quel popo' di codice per una cosa del genere, usando matlab
@desah
Come vedi, esiste un modo semplicissimo. Modifica il tuo codice e facci sapere.
Mi pareva strano che fosse necessario tutto quel popo' di codice per una cosa del genere, usando matlab

@desah
Come vedi, esiste un modo semplicissimo. Modifica il tuo codice e facci sapere.
Ragazzi mi dispiace ma non è cosi semplice.il problema è questo:
il vettore soluzione x è un vettore colonna di 4 componenti
le $ c_k $ sono le costanti SCALARI
li $ X_k $ sono gli autovettori colonna di 4 componenti
la soluzione è data da $ x=sum (c_k*X_K $ con K=1,4 ovviamente.Questo significa che si deve avere un vettore soluzione x uguale a un vettore chiamato per semplicità solutore,COLONNA,le cui componenti saranno le somme delle corrispondenti componenti degli autovettori ciascuno moltiplicato per la propria costante.si avra quindi.per brevità scrivo la sola componente 1:
$ x_1= c_1*(V_11)+c_2*(V_21)+c_3*(V_31)+c_4*(V_41) $
.
.
.
e cosi vua per le altre componenti.
io conosco il vettore soluzione dalle condizioni al contorno.
devo calcolare le costanti $ c_1,c_2,C_3,c_4 $
C purtroppo sono scalari.se lo assegno come vettore e costruisco la matrice degli autovettori matlab le cui colonne sono le componenti ottengo:
$ bar C = V^-1*(bar x) $ ottengo 16 componenti di C.il che è sbagliato.
Allora ho fatto costruire il vettore SOLUTORE in cui ci sono anche le incognite del problema a matlab.
a questo punto arrivo all'equazione
$ bar x $= SOLUTORE
dove solutore è funzione di c.Come faccio a far risolvere a matlab ?
Prima di"copiare" da qualche compagno di corso vorrei trovare la soluzione da me perchè mi servirà per esercitazioni future ma il tempo stringe.
p.s.
ho provato banalmente con il derive ma mi dice che l'equazione è falsa(??????)
il vettore soluzione x è un vettore colonna di 4 componenti
le $ c_k $ sono le costanti SCALARI
li $ X_k $ sono gli autovettori colonna di 4 componenti
la soluzione è data da $ x=sum (c_k*X_K $ con K=1,4 ovviamente.Questo significa che si deve avere un vettore soluzione x uguale a un vettore chiamato per semplicità solutore,COLONNA,le cui componenti saranno le somme delle corrispondenti componenti degli autovettori ciascuno moltiplicato per la propria costante.si avra quindi.per brevità scrivo la sola componente 1:
$ x_1= c_1*(V_11)+c_2*(V_21)+c_3*(V_31)+c_4*(V_41) $
.
.
.
e cosi vua per le altre componenti.
io conosco il vettore soluzione dalle condizioni al contorno.
devo calcolare le costanti $ c_1,c_2,C_3,c_4 $
C purtroppo sono scalari.se lo assegno come vettore e costruisco la matrice degli autovettori matlab le cui colonne sono le componenti ottengo:
$ bar C = V^-1*(bar x) $ ottengo 16 componenti di C.il che è sbagliato.
Allora ho fatto costruire il vettore SOLUTORE in cui ci sono anche le incognite del problema a matlab.
a questo punto arrivo all'equazione
$ bar x $= SOLUTORE
dove solutore è funzione di c.Come faccio a far risolvere a matlab ?
Prima di"copiare" da qualche compagno di corso vorrei trovare la soluzione da me perchè mi servirà per esercitazioni future ma il tempo stringe.
p.s.
ho provato banalmente con il derive ma mi dice che l'equazione è falsa(??????)
Sono arrivato ad una conclusione forse...potete supervisionarmi???
allora ho costruito la matrice degli autovettori 4x4
ho fatto la trasposta
ho fatto l'inversa
ho moltiplicato l'inversa per un vettore dei termini noti
ho ottenuto le costanti...
E' una cosa orribile da vedere per un programmatore ma se è giusto...chi se ne frega
allora ho costruito la matrice degli autovettori 4x4
ho fatto la trasposta
ho fatto l'inversa
ho moltiplicato l'inversa per un vettore dei termini noti
ho ottenuto le costanti...
E' una cosa orribile da vedere per un programmatore ma se è giusto...chi se ne frega
A me sembra invece semplice. La tua equazione è equivalente a
$x_i = \sum_{k = 1}^4 v_{i,k} c_k$
dove $v_{i,k}$ è l'elemento nella $i$-esima e $k$-esima colonna della matrice degli autovalori e $c_k$ è il $k$-esimo elemento del vettore colonna delle tue costanti scalari. Si tratta di un semplice sistema lineare la cui corrispondente forma matriciale è
$x = Vc$.
Per trovare $c$ si deve semplicemente fare
come ti avevo già mostrato nel mio scorso post. Equivalentemente potresti anche usare la funzione linsolve se ti piace di più
Questo metodo è anche molto più veloce di quello basato sull'inversa. Trovo strano che tu abbia avuto bisogno di calcolare la trasposta. Mostreresti il codice?
$x_i = \sum_{k = 1}^4 v_{i,k} c_k$
dove $v_{i,k}$ è l'elemento nella $i$-esima e $k$-esima colonna della matrice degli autovalori e $c_k$ è il $k$-esimo elemento del vettore colonna delle tue costanti scalari. Si tratta di un semplice sistema lineare la cui corrispondente forma matriciale è
$x = Vc$.
Per trovare $c$ si deve semplicemente fare
c = V \ x;
come ti avevo già mostrato nel mio scorso post. Equivalentemente potresti anche usare la funzione linsolve se ti piace di più
c = linsolve(V, x);
Questo metodo è anche molto più veloce di quello basato sull'inversa. Trovo strano che tu abbia avuto bisogno di calcolare la trasposta. Mostreresti il codice?
Ti posto il codice:
scusami ma la matrice è dichiarata in Matlab. farà diventare un po grande il post ma dato che sappiamo di che si parla nn dovrebbero esserci problemi...spero...
V_1=[ -0.00849308936462 + 0.38670530699086i, -0.00849308936462 - 0.38670530699086i, 0.00849308936462 + 0.38670530699086i,0.00849308936462 - 0.38670530699086i
0.31620553357121 - 0.46625011993983i ,0.31620553357121 + 0.46625011993983i,-0.31620553357121 - 0.46625011993983i,-0.31620553357121 + 0.46625011993983i
-0.34701570045087 + 0.22437862088108i,-0.34701570045087 - 0.22437862088108i, -0.34701570045087 - 0.22437862088108i,-0.34701570045087 + 0.22437862088108i
0.60186883729372,0.60186883729372,0.60186883729372,0.60186883729372]
V_2=V_1'
V_3=inv(V_2
C=(V_3)*[0;0;0.01;0]
che mi dici???
scusami ma la matrice è dichiarata in Matlab. farà diventare un po grande il post ma dato che sappiamo di che si parla nn dovrebbero esserci problemi...spero...
V_1=[ -0.00849308936462 + 0.38670530699086i, -0.00849308936462 - 0.38670530699086i, 0.00849308936462 + 0.38670530699086i,0.00849308936462 - 0.38670530699086i
0.31620553357121 - 0.46625011993983i ,0.31620553357121 + 0.46625011993983i,-0.31620553357121 - 0.46625011993983i,-0.31620553357121 + 0.46625011993983i
-0.34701570045087 + 0.22437862088108i,-0.34701570045087 - 0.22437862088108i, -0.34701570045087 - 0.22437862088108i,-0.34701570045087 + 0.22437862088108i
0.60186883729372,0.60186883729372,0.60186883729372,0.60186883729372]
V_2=V_1'
V_3=inv(V_2
C=(V_3)*[0;0;0.01;0]
che mi dici???
Scusami ma credo che matematicamente il tuo procedimento non è corretto perchè se hai
$ Ax=B $ e A e B sono matrici
per trovare X non puoi fare B/A ma devi moltiplicare a sinistra per $ A^-1 $.
IO ho fatto la trasposta perchè altrimenti la costante $ C_1 $ avrebbe moltiplicato la prima RIGA ovvero tutte le prime componenti degli autovettori all'interno della matrice anzichè le sole componenti(tutte) del vettore V1 ovvero la prima COLONNA.
Non so se con linsolve MAtlab capisce e inverte...
Avrei voluto fare il codice con un ciclo for per non dover ogni volta ridichiare tutte le matrici e i vettori perchè ho diversi casi da studiare(è un problema di aeroelasticità)volevo fargli leggere e costruire da solo ogni volta dati dei file di read.ma non ci sono riuscito quindi se dovesse andre bene il procedimento sopra mi tengo quello e amen.
$ Ax=B $ e A e B sono matrici
per trovare X non puoi fare B/A ma devi moltiplicare a sinistra per $ A^-1 $.
IO ho fatto la trasposta perchè altrimenti la costante $ C_1 $ avrebbe moltiplicato la prima RIGA ovvero tutte le prime componenti degli autovettori all'interno della matrice anzichè le sole componenti(tutte) del vettore V1 ovvero la prima COLONNA.
Non so se con linsolve MAtlab capisce e inverte...
Avrei voluto fare il codice con un ciclo for per non dover ogni volta ridichiare tutte le matrici e i vettori perchè ho diversi casi da studiare(è un problema di aeroelasticità)volevo fargli leggere e costruire da solo ogni volta dati dei file di read.ma non ci sono riuscito quindi se dovesse andre bene il procedimento sopra mi tengo quello e amen.
Quell'operatore NON è la divisione, che non esiste nell'anello delle matrici, ma un operatore specifico di matlab per risolvere sistemi lineari. In effetti fa uso di algoritmi particolari in base al tipo di matrici e ti posso assicurare che è anche molto più veloce che moltiplicare per l'inversa (operazione comunque sempre possibile). Se C è un vettore COLONNA, il primo componente moltiplica la prima COLONNA. Se invece è un vettore RIGA, è sufficiente trasporre lui. Ovviamente il vettore X e il vettore C devono avere la stessa forma. Sia linsolve che l'operatore \ risolvono il sistema lineare che gli viene passato (linsolve è un po' più flessibile). Ovviamente sta a te passare le matrici corrette, ma una volta fatto è tutto automatico.
Grazie!
Per i prossimi casi cercherò di usare quell'operatore.
ti faccio sapere
Per i prossimi casi cercherò di usare quell'operatore.
ti faccio sapere
Ho provato il tuo metodo.ovviamente funziona e mi da risultati coerenti con gli altri.il mio produce 4 soluzioni delle quali 2 sono uguali agli altri 2 no.non so perchè quindi il tuo metodo è AGGIUDICATO.mi hai svoltato una serie di problemi inimmaginabili!!!!
GRAZIEEEE!!!!
GRAZIEEEE!!!!