Equazioni differenziali a coefficienti non costanti

di Anonimizzato9724 il
473 risposte

473 Risposte - Pagina 3

  • Sicuramente c'è il modo di simularlo...cerco di farmi venire in mente qualcosa.
  • Ci credo che c'è, è che qua l'hanno fatto con MathCad che è una spece di foglio di calcolo (gli dai le equazioni e lui si fa i conti) e gli sembra che con MatLab è la stessa cosa...
  • Riguardando l'esempio 3 dell'help di ode45...
    Lui usa nell'espressione dei vettori (tramite il linspace definisce l'asse dei tempi e poi interpola - f e g).
    Quindi tu puoi all'interno della funzione ode definire una "curva" per uno delle tue variabili...
  • Ho pensato che c'è un altro problema: le condizioni iniziali devono cambiare all'uscita dal campo altrimenti avrei un plot tipo a gradino, nel senso che la traiettoria coincide con un asse fino all'ingresso nel campo, poi diventa una curva che all'uscita dal campo finisce in un certo punto dicoordinate (X, Y) diverso da (0, 0) e poi ritorna a seguire l'asse di ingresso.
    Questo perchè dove E=0 l'equazione è d^2y/dt^2=0 e la risolve con la condizione iniziale [0 0], che invece deve essere diversa.
    Sono arrivato a questa conclusione perchè avevo pensato di mettere l'eq differenziale nel ciclo che avevo usato per creare il vettore del campo e quindi fargli risolvere tante equazioni quanti sono gli elementi del campo e poi plottare solo solo una coppia di punti per ogni equazione che ha risolto.
  • E nel ciclo non puoi cambiare anche le condizioni iniziali? Magari con un secondo ciclo.
  • Si, è quello che sto provando a fare.
    anzi forse a questo punto non ho nemmeno bisogno del ciclo

    se risolvo l'equazione così:

    rhs=@(z,x)[x(2); (q/m).*(E/v^2)];
    [za, xa] = ode45(rhs, [0 100], [0 0]);

    dove ho il campo, potrei risolverla dopo il campo prendendo come condizione iniziale l'ultimo elemento di xa e la velocità associata che ora vedo come la calcolo.
    quindi all'uscita dal campo sarebbe:
    
    x_iniziale= xa(ultimo elemento della prima colonna che ora vedo come si stampa)
    xprimo_iniziale = tangete alla curva nell'ultimo xa
    IC = [ xiniz  xpinizi]
    
     rhs=@(z,x)[x(2); (q/m).*(E/v^2)];
    [za, xa] = ode45(rhs, [101 200], IC);
    
    concettualmente pensi che funziona?
  • X_iniziale= xa(end, 1)

    dovrebbe essere giusto...
  • Non saprei...
    prova così e poi cerca di capire dai risultati se sono plausibili.
    Probabilmente non è la stessa cosa che risolvere tutto insieme... però può essere un inizio. Il risultato sarà ovviamente corretto "a regime", probabilmente perderai le informazioni sul passaggio tra uno stato e l'altro.
  • Allora scrivendo:
    
    for n= 1:1:200
        
        if n<=100
                E=1;
                rhs=@(z,x)[x(2); (q/m).*(E/v^2)];
                [zaE, xaE] = ode45(rhs, [0 100], [0 0]);
        else
            E=0;
            IC = [xaE(end, 1) 0];
            rhs=@(z,x)[x(2); (q/m).*(E/v^2)];
            [za, xa] = ode45(rhs, [101 200], IC);
        end
    end
    
    %%%Plot
    ZA=[zaE; za];
    XA=[xaE; xa];
    
    figure
    
    plot( ZA, XA(:,1))
    
    ha fatto il plot come lo immaginavo.
    Ora vedo come posso valutare la tangente alla curva nel punto che mi interessa per dare l'altra condizione iniziale giusta.
  • Ormai sono il tuo incubo peggiore...

    se la tangente la calcolo usando:

    h=quiver(zaE(end), xaE(end,1));

    è corretto?
    la funzione quiver dovrebbe restituire la velocità, ma nonho ben capitose faccio la cosa giusta
  • Quiver credo serva solo per fare il grafico, non ti restituisce la velocità.
    cosa sono i due argomenti, due numeri? così fai la tangente di un punto?
  • I due argomenti sono due numeri che dovrebbero essere le coordinate dell'ultimo punto della traiettoria. A me interessa la tangente alla traiettoria in questo punto...
    Ho provato anche conquesto ciclo, ma il risultato mi convince poco:
    
             for i=1:1:length(xaE)-1
                 deriv(i)=(zaE(i+1,1)-zaE(i,1))/(xaE(i+1,1)-xaE(i,1));
             end
             dxaE= deriv(end);
    
    sì, quiver fa il grafico, hai ragione
  • Cos'è deriv? puoi usare diff per fare la derivata.
  • Derv è un nome che ho dato io, con il ciclo che ho fatto dovrebbe calcolare la derivata con la formula del rapporto incrementale.

    l'help dice:
    The quantity diff(y)./diff(x) is an approximate derivative.
    quindi dovrei scrivere una cosa tipo:

    diff(xaE)./diff(zaE)

    e prendere l'ultimo elemento...


    OK
    scrivo: dxaE = diff(xaE(:,1))./diff(zaE);
    e poi prendo l'ultimo elemento e lo passo come condizione iniziale.
    il risultato grafico sembra buono.
  • Bene
Devi accedere o registrarti per scrivere nel forum
473 risposte