[MatLab] - disegnare il grafico di un solido di rotazione
Ciao a tutti. Come da oggetto vorrei disegnare il grafico che si ottiene dalla rotazione di una funzione attorno all'asse x. Di questa curva però non conosco la funzione. Ho solo i valori che questa assume.
Provo a spiegarmi meglio.
Ho un vettore x con le ascisse dei punti.
Ho un vettore y con le ordinate dei punti, cioè con i valore che assume la funzione y=f(x) quando viene valutata nei punti x.
Non ho la funzione f(x).
Riesco a disegnare la funzione facendo plot(x,y).
Quello che vorrei fare è disegnare il grafico 3d che si ottiene dalla rotazione della funzione y=f(x) attorno all'asse x.
Non avendo però la funzione non ho molte idee. Quello a cui avevo pensato era di ricavare un'approssimazione della funzione interpolando i dati x e y però non ottengo il grafico che voglio.
Provo a mettere il mio codice.
Qualcuno di voi ha altre idee, possibilmente senza passare dall'interpolazione. Oppure vede qualcosa di sbagliato?
Provo a spiegarmi meglio.
Ho un vettore x con le ascisse dei punti.
Ho un vettore y con le ordinate dei punti, cioè con i valore che assume la funzione y=f(x) quando viene valutata nei punti x.
Non ho la funzione f(x).
Riesco a disegnare la funzione facendo plot(x,y).
Quello che vorrei fare è disegnare il grafico 3d che si ottiene dalla rotazione della funzione y=f(x) attorno all'asse x.
Non avendo però la funzione non ho molte idee. Quello a cui avevo pensato era di ricavare un'approssimazione della funzione interpolando i dati x e y però non ottengo il grafico che voglio.
Provo a mettere il mio codice.
p=interp1(x,y); %x e y sono noti u=linspace(0,1,100); v=linspace(0,2*pi,100); [U,V]=meshgrid(u,v); X=U; Y=polyval(p,U).*cos(V); Z=polyval(p,U).*sin(V); figure surf(X,Y,Z)
Qualcuno di voi ha altre idee, possibilmente senza passare dall'interpolazione. Oppure vede qualcosa di sbagliato?
Risposte
Ma perché devi fare l'interpolazione? I punti sulla tua superficie di rotazione hanno coordinate (x, y * sin(t), y * cos(t)). Ho forse frainteso cosa stai facendo?
No. Facendo come dici te,usando plot3, sicuramente non fa una superficie. Ho anche provato a veder cosa fa matlab, ma ovviamente disegna una curva nello spazio.
Il fatto che ho provato a usare l'interpolazione era per ottenere in qualche modo la funzione che rappresenta la curva che mi interessa. Infatti, supponiamo di ottenere tale funzione e denotaimola con F allora poi basterà dare a matlab il seguente codice:
Grazie comunque per l'interessamento. Ovviamente quella dell'interpolazione è solo un'idea. Non è detto che sia la strada corretta.
Il fatto che ho provato a usare l'interpolazione era per ottenere in qualche modo la funzione che rappresenta la curva che mi interessa. Infatti, supponiamo di ottenere tale funzione e denotaimola con F allora poi basterà dare a matlab il seguente codice:
u=linspace(0,1,100); v=linspace(0,2*pi,100); [U,V]=meshgrid(u,v); X=U; Y=F(U).*cos(V); Z=F(U).*sin(V); figure surf(X,Y,Z)
Grazie comunque per l'interessamento. Ovviamente quella dell'interpolazione è solo un'idea. Non è detto che sia la strada corretta.
Problema risolto!!!!
Bastava cambiare il tipo di interpolazione. Ho usato polyfit anzichè interp1...
Bastava cambiare il tipo di interpolazione. Ho usato polyfit anzichè interp1...
Non ho mai detto di usare plot3. Pensavo che potessi creare l'elenco dei punti della superficie e poi usare delaunay3 e tetramesh.
Ciao Lory.
Potresti definire esplicitamente F(u) ?
Io ho un problema simile:
Ho una matrice 600x1008 . A questa matrice corrisponde una superficie di lato x composto da 600 punti e profondità 1008
In pratica questa superficie ha 1008 linee formate da 600 punti.
Voglio ruotare questa superficie attorno ad un asse in modo da formare un cilindro,
hai qualche idea?
Potresti definire esplicitamente F(u) ?
Io ho un problema simile:
Ho una matrice 600x1008 . A questa matrice corrisponde una superficie di lato x composto da 600 punti e profondità 1008
In pratica questa superficie ha 1008 linee formate da 600 punti.
Voglio ruotare questa superficie attorno ad un asse in modo da formare un cilindro,
hai qualche idea?
Ciao Lory.
Potresti definire esplicitamente F(u) ?
Io ho un problema simile:
Ho una matrice 600x1008 . A questa matrice corrisponde una superficie di lato x composto da 600 punti e profondità 1008
In pratica questa superficie ha 1008 linee formate da 600 punti.
Voglio ruotare questa superficie attorno ad un asse in modo da formare un cilindro,
hai qualche idea?
Potresti definire esplicitamente F(u) ?
Io ho un problema simile:
Ho una matrice 600x1008 . A questa matrice corrisponde una superficie di lato x composto da 600 punti e profondità 1008
In pratica questa superficie ha 1008 linee formate da 600 punti.
Voglio ruotare questa superficie attorno ad un asse in modo da formare un cilindro,
hai qualche idea?
Hai risollevato un topic un pò vecchiotto
...vediamo se mi ricordo come avevo risolto il problema. Onestamente non ho capito il tuo problema. Ti dico come avevo risolto io il mio e vedi se ti può essere utile, altrimenti ti chiederei di spiegarti più chiaramente. Magari postare il codice può essere utile.
Quello che nel codice avevo postato come F(U) nel codice funzionante che poi usai è stato sostituito da un polinomio p. Il codice funzionante dovrebbe essere questo:

Quello che nel codice avevo postato come F(U) nel codice funzionante che poi usai è stato sostituito da un polinomio p. Il codice funzionante dovrebbe essere questo:
function disegno(h,r,R) n=20; %numero di intervalli x=linspace(0,h,n+1); y=[R y r]; p=polyfit(x,y,15); u=linspace(0,h,100); v=linspace(0,2*pi,100); [U,V]=meshgrid(u,v); X=U; Y=polyval(p,U).*cos(V); Z=polyval(p,U).*sin(V); figure surf(X,Y,Z) colormap(hsv) shading faceted xlabel('x') ylabel('z') zlabel('y') title('Solido di rotazione') end