Problema in Matlab

pigreco1
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?

Risposte
pigreco1
:o :o :o
Sei un grande!!!!!!!!!!!!!!

Marco831
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.

pigreco1
Caro Marco, grazie per l'aiuto.
Che cosa studi?
Ciao

Marco831
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).

pigreco1
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

Marco831
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.

pigreco1
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

Marco831
"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

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.