Equazioni differenziali

di il
29 risposte

Equazioni differenziali

Buon giorno a tutti!

Per lavoro ho dovuto iniziare a usare matlab e sto facendo tutto da autodidatta ma c'è qualcosa che proprio mi blocca!

Allora la funzione da risolvere è
D2y=-3*w*sim*y;
D2y è la derivata seconda di y,
we sim sono noti
l'unica incognita è la y ovviamente.
questa è la funzione che ho scritto nel m-file:

function [ z ] = prime( t,y )
z=[y(2); -3*w^2*y(1).*sim];



%UNTITLED Summary of this function goes here
% Detailed explanation goes here


end
questo è quello che scrivo in matlab

>> tstan=[0 3000];
>> y0=[0 0];
>> [t,y]= ode45('prime', tstan, y0);
Undefined function or variable 'w'.

Error in prime (line 2)
z=[y(2); -3*w^2*y(1).*sim];

Error in odearguments (line 88)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 114)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...



ma dove sbaglio???

29 Risposte

  • Re: Equazioni differenziali

    Ti sta dicendo che non conosce w, lo devi passare come ingresso alla funzione prime, o inserirlo all'interno se non ti serve altrove.
  • Re: Equazioni differenziali

    W io lo definisco in matlab e non nell' m-file. sbaglio?
  • Re: Equazioni differenziali

    Con "in matlab" immagino che tu intenda nella command window.
    Intanto ti consiglio comunque di scrivere il codice in un file, lo chiami main.m o come vuoi, ma almeno ti ritrovi il flusso di codice senza doverlo scrivere tutte le volte.
    Poi se lo vuoi lanciare, evidenzi le parti che vuoi (riga per riga o blocchi di codice) e premi F9 per farlo calcolare.
    Se w non ti serve o non devi cambiarlo per altre simulazione puoi definirlo direttamente all'interno della funzione, altrimenti lo definisci all'interno del file principale, o come stai facendo adesso, ma lo passi anche come ingresso alla funzione (dato che viene usato all'interno della funzione stessa), altrimenti la funzione non lo "vede".

    Per passare gli ingressi alla funzione, la function devi scriverla così:
    function [ t,y ] = prime(t,y,w,sim)
    Mentre nel file principale scrivi:
    w=...
    sim=...
    tstan=[0 3000];
    y0=[0 0];
    [t,y]= ode45(@(z,y)prime(z,y,w,sim), tstan, y0);
    Comunque se cerchi sull'help ode45, ci sono diversi esempi, nel secondo passa anche le variabili alla funzione.

    Ricordati comunque, nel caso non lo stessi prendendo in considerazione, che se usi nomi di funzioni che possono essere associati ad una parola inglese, di controllare (nell'help) che non esistano funzioni proprie di matlab con lo stesso nome, altrimenti matlab potrebbe darti risultati assurdi o dare errore perchè utilizzerebbe la sua funzione al posto della tua.
    Nel tuo caso non esiste una funzione "prime" quindi non c'è problema.
  • Re: Equazioni differenziali

    Grazie mille provo e speriamo funzioni!
  • Re: Equazioni differenziali

    Ciao io ho provato e ha funzionato, cioè non mi ha dato errori e mi ha risolto l'equazione. Però mi è sorto un dubbio nel m-files io non ho definito la funzione z o [t,y] come l'ha chiamata tu, cioè da nessuna parte ho scritto la mia equazione differenziale quindi come faccio a sapere che mi ha risolto proprio quella?
    Grazie ancora!
  • Re: Equazioni differenziali

    L'equazione differenziale è quella che hai scritto nella funzione prime.
  • Re: Equazioni differenziali

    Eccomi! alla fine ieri sera ci ho provato e ci sono riuscita! grazie mille!

    ora devo cimentarmi con i SISTEMI di equazioni differenziali... suggerimenti???
  • Re: Equazioni differenziali

    Ah ah... buona fortuna!
    No, scherzo, non dovrebbe essere molto diverso dal fare una sola equazione...
    Guarda sempre sull'help di matlab, mi sembra che ci siano degli esempi abbastanza chiari anche sui sistemi di equazioni.
  • Re: Equazioni differenziali

    Mi sono preoccupata per un po!

    mi dimentico sempre l'help di matlab!!
  • Re: Equazioni differenziali

    Diciamo che più tempo passi sull'help, meno tempo passi a scrivere codice...
  • Re: Equazioni differenziali

    ..ormai le equazioni differenziali le risolvo ma ho questo sistema

    y''=a*y+b*x'
    x''=c*x+d*y

    da dove cavolo inizio??
    Le teorie che ho avuto si sono rivelate insensate!
  • Re: Equazioni differenziali

    Prova a vedere se da qui si capisce qualcosa. http://www.mit.edu/people/abbe/matlab/ode.htm
    Fanno un esempio con un sistema di equazioni con derivate seconde e due variabili.
  • Re: Equazioni differenziali

    giug ha scritto:


    Prova a vedere se da qui si capisce qualcosa. http://www.mit.edu/people/abbe/matlab/ode.htm
    Fanno un esempio con un sistema di equazioni con derivate seconde e due variabili.
    giug, è una cosa simile a quella che ho fatto io.
    Deve risolvere, secondo me, una sola equazione in modo che l'amico matlab la veda come un sistema di 4 equazioni del primo ordine:

    dx/dt=v_x
    dy/dt=v_y
    dv_x/dt=ay+bv_x
    dv_y/dt=cx+dy

    Se scrive questa in forma vettoriale se ne esce prima.
    Le mie equazioni erano disaccoppiate e non riuscivo a risolvere fino a che non ho preso questa strada, queste sono accoppiate invece.
    Poi non so, magari ci sono strade diverse...

    Prova con:
    
    y0=[xiniziale yiniziale ziniziale v_xiniziale v_yiniziale v_ziniziale];
    f = @(t,y) [y(3:4); c*x+(a+d)y+b*v_x]; 
        [t,y] = ode45(f,tspan,y0)
    
  • Re: Equazioni differenziali

    Rieccomi!

    ho seguito quello scritto del link (proprio quasi lettera per lettera)

    function dxy= sisedo(t,xy)
    x=xy(1);
    xdot=xy(2);
    y=xy(3);

    xdot=xdot;
    ydot=3*x+2*y+5;
    xdoubledot=3-ydot+2*xdot;

    dxy=[xdot; xdoubledot ;ydot]

    ed ecco cosa esce:

    [T,XY]=ode45('sisedo',[tstart,tend],[0 1 0]);
    Undefined function or variable 'xdoubledot'.

    Error in sisedo (line 10)
    dxy=[xdot; xdoubledot ;ydot]

    Error in odearguments (line 88)
    f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

    Error in ode45 (line 114)
    [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

    Non capisco!

    keenan quindi la mia function
    la scrivo

    function z=sisedo (t,xy)
    dx/dt=v_x
    dy/dt=v_y
    dv_x/dt=ay+bv_x
    dv_y/dt=cx+dy

    z=[x; v_x; y; v_y]??

    thanks
Devi accedere o registrarti per scrivere nel forum
29 risposte