Problema in Matlab
Buongiorno a tutti,
avrei bisogno di un piccolo aiuto.
Il problema è il seguente:
Codice in Matlab 7
------------------------
function [f] = derivata(t,y)
f = 10*y
return;
--------------------------
Il problema è che y ci vado a mettere, se io ho la mia equazione differenziale f?
avrei bisogno di un piccolo aiuto.
Il problema è il seguente:
Codice in Matlab 7
------------------------
function [f] = derivata(t,y)
f = 10*y
return;
--------------------------
Il problema è che y ci vado a mettere, se io ho la mia equazione differenziale f?
Risposte



Sei un grande!!!!!!!!!!!!!!
Ho finoto la triennale al Poli in ingegneria meccanica nel 2005 e adesso sono un research assistant e studente di master alla University of Minnesota.
Caro Marco, grazie per l'aiuto.
Che cosa studi?
Ciao
Che cosa studi?
Ciao
Allora, innanzi tutto devi decidere con che schema approssimare la derivata seconda; usiamo ad esempio il classico metodo centrale:
Usando la tua notazione
teta^(2)=(teta(t+dt)-2*teta(t)+teta(t+dt))/dt^2
se theta è un vettore scandito dall'indice i contenente i valori di teta ad ogni passo temporale, settando t0=0 otterremo
(theta(i-1)-2*theta(i)+theta(i+1))/dt^2=-g/l*sin(theta(i))
I dati che vedi dare in ingresso alla funzione sono:
g=forza di gravità
l=lunghezza del pendolo
Tsim= tempo totale di simulazione
dt= step temporale (visto che lo schema di discretizzazione che ho usato è condizionatamente stabile, la scelta di dt è importante al fine della stabilità della soluzione numerica)
theta0=posizione iniziale
dtheta0=velocità angolare iniziale
Il programma che ti suggerisco è il seguente (l'ho chiamato pendolo, ma puoi chiamarlo come ti pare)
function [theta,t]=pendolo(g,l,Tsim,dt,theta0,dtheta0)
nstep=round(Tsim/dt);
theta=zeros(nstep,1);
theta(1)=theta0;
theta(2)=theta0+dt*dtheta0+0.5*dt^2*(-g/l*sin(theta(1)));
t=[0:nstep]'*dt;
for i=2:nstep
theta(i+1)=(-g/l*sin(theta(i)))*dt^2+2*theta(i)-theta(i-1);
end
Come esempi iniziali puoi considerare un pendolo che parte a 45° da fermo. In questo caso puoi usare il seguente comando:
[Theta,t]=pendolo(9.81,1,1,0.0001,pi/4,0);
Otterrai due vettori colonna, Theta e t. Se esegui il comando plot(Theta,t) otterrai l'andamento dell'angolo theta in funzione del tempo.
Come secondo esempio ti consiglio di provare a partire con una velocità iniziale, ad esempio dtheta0=-0.001
[Theta,t]=pendolo(9.81,1,1,0.0001,pi/4,-0.001);
Otterrai un andamento simile al precedente, ma con caratteristiche un po diverse (lascio a te commentarle. Se vuoi poi le discutiamo insieme).
Usando la tua notazione
teta^(2)=(teta(t+dt)-2*teta(t)+teta(t+dt))/dt^2
se theta è un vettore scandito dall'indice i contenente i valori di teta ad ogni passo temporale, settando t0=0 otterremo
(theta(i-1)-2*theta(i)+theta(i+1))/dt^2=-g/l*sin(theta(i))
I dati che vedi dare in ingresso alla funzione sono:
g=forza di gravità
l=lunghezza del pendolo
Tsim= tempo totale di simulazione
dt= step temporale (visto che lo schema di discretizzazione che ho usato è condizionatamente stabile, la scelta di dt è importante al fine della stabilità della soluzione numerica)
theta0=posizione iniziale
dtheta0=velocità angolare iniziale
Il programma che ti suggerisco è il seguente (l'ho chiamato pendolo, ma puoi chiamarlo come ti pare)
function [theta,t]=pendolo(g,l,Tsim,dt,theta0,dtheta0)
nstep=round(Tsim/dt);
theta=zeros(nstep,1);
theta(1)=theta0;
theta(2)=theta0+dt*dtheta0+0.5*dt^2*(-g/l*sin(theta(1)));
t=[0:nstep]'*dt;
for i=2:nstep
theta(i+1)=(-g/l*sin(theta(i)))*dt^2+2*theta(i)-theta(i-1);
end
Come esempi iniziali puoi considerare un pendolo che parte a 45° da fermo. In questo caso puoi usare il seguente comando:
[Theta,t]=pendolo(9.81,1,1,0.0001,pi/4,0);
Otterrai due vettori colonna, Theta e t. Se esegui il comando plot(Theta,t) otterrai l'andamento dell'angolo theta in funzione del tempo.
Come secondo esempio ti consiglio di provare a partire con una velocità iniziale, ad esempio dtheta0=-0.001
[Theta,t]=pendolo(9.81,1,1,0.0001,pi/4,-0.001);
Otterrai un andamento simile al precedente, ma con caratteristiche un po diverse (lascio a te commentarle. Se vuoi poi le discutiamo insieme).
Prendo le equazioni del pendolo
teta -> angolo tra la normale alla superficie dove è attaccato il pendolo e il filo(inestensibile)
g -> accelerazione gravitazionale
l -> lunghezza del filo
teta^(2) = -(g/l) * sin(teta)
Dove teta^(2) indica la derivata seconda dell'angolo in funzione del tempo.
N.B : teta è funzione del tempo.
Questa è l'equazione da dare in impasto alla funzione derivata che ho creato.
Le mie scuse se non ti risponderò subito, ma sto studiando altri esami.
Ciao
teta -> angolo tra la normale alla superficie dove è attaccato il pendolo e il filo(inestensibile)
g -> accelerazione gravitazionale
l -> lunghezza del filo
teta^(2) = -(g/l) * sin(teta)
Dove teta^(2) indica la derivata seconda dell'angolo in funzione del tempo.
N.B : teta è funzione del tempo.
Questa è l'equazione da dare in impasto alla funzione derivata che ho creato.
Le mie scuse se non ti risponderò subito, ma sto studiando altri esami.
Ciao
beh, ha ragione.
y è un simbolo, matlab funziona con i numeri.
Devi passargli un comando del tipo:
[quellochemipare]=derivata(t*,y*)
dove t* e y* hanno un valore numerico.
A parte tutto, quella che hai scritto non è un'equazione differenziale.
Posta il problema che hai (quello con le due equazioni differenziali) e vediamo di lavorarci sopra.
y è un simbolo, matlab funziona con i numeri.
Devi passargli un comando del tipo:
[quellochemipare]=derivata(t*,y*)
dove t* e y* hanno un valore numerico.
A parte tutto, quella che hai scritto non è un'equazione differenziale.
Posta il problema che hai (quello con le due equazioni differenziali) e vediamo di lavorarci sopra.
Praticamente definisco la funzione
function [f] = derivata(t,y) , dove f è la mia equazione differenziale, t è il tempo
e y è la funzione.
dopo definisco la mia equazione differenziale
f=10*y (è solo un esempio, in realtà ho un sistema di 2 eq. diff.)
e poi faccio il return.
Praticamente nel mio programma quando chiamo derivata dovrebbe richiamare f, ma mi da un errore, perchè mi dice
che devo definire y.
Ciao
function [f] = derivata(t,y) , dove f è la mia equazione differenziale, t è il tempo
e y è la funzione.
dopo definisco la mia equazione differenziale
f=10*y (è solo un esempio, in realtà ho un sistema di 2 eq. diff.)
e poi faccio il return.
Praticamente nel mio programma quando chiamo derivata dovrebbe richiamare f, ma mi da un errore, perchè mi dice
che devo definire y.
Ciao
"pigreco":
Buongiorno a tutti,
avrei bisogno di un piccolo aiuto.
Il problema è il seguente:
Codice in Matlab 7
------------------------
function [f] = derivata(t,y)
f = 10*y
return;
--------------------------
Il problema è che y ci vado a mettere, se io ho la mia equazione differenziale f?
Un po meno criptico???
Spiegami il problema un po meglio e vedrò se riesco ad aiutarti