Equazioni differenziali a coefficienti non costanti

di il
473 risposte

473 Risposte - Pagina 4

  • Re: Equazioni differenziali a coefficienti non costanti

    Ho notato che risolvendo le due equazioni nello stesso script per certi valori di v crea soluzioni che non hanno le stesse dimensioni e si incazza quando fa il plot.
    Sai qual'è il motivo?

    Secondo me sto sbagliando approccio, è meglio fargli risolvere la forza di lorentz, come faceva il tipo del link che mi hai passato ieri. In quel modo risolve tutte le equazioni contemporaneamente.
    Domani provo a scriverle in funzione di z e vedo...

    Qui c'è un gruppo che sta cercando di fare una cosa simile, ma per problemi differenti e hanno detto al mio tutor che non è banale risolvere il problema, dovrei vedere di riuscire a parlare con qualcuno di questi...
  • Re: Equazioni differenziali a coefficienti non costanti

    Se riesci a farti dare qualche dritta almeno sai se sei sulla strada giusta e puoi sbatterci la testa finchè non viene fuori qualcosa. Altrimenti continuare a fare prove con il dubbio che possano portarti da qualche parte... Non è proprio il massimo.
  • Re: Equazioni differenziali a coefficienti non costanti

    Secondo me la strada è sbagliata. Fargli rrisolvere le equazioni separatamente non è corretto. Anche se sono indipendenti devono comunque essere risolte insieme... poi non lo so...
  • Re: Equazioni differenziali a coefficienti non costanti

    Ma perchè i vettori che io ho chiamato [za xa]=eq differenziale non hanno dimensioni standard se risolvo l'eq in un intervallo [0 zf] uguale per le due equazioni ma cambio v? (la domanda di prima...)
  • Re: Equazioni differenziali a coefficienti non costanti

    Fammi un esempio, per quali valori di v dà risultati diversi?
  • Re: Equazioni differenziali a coefficienti non costanti

    Ho provato con v=0.1, v=2, v=20, e poi sono andato ad aggiungere zeri.
    ho provato anche con v=0.02, 0.002 .....
    v=50
    il codice è:
    
    clear all
    close all
    
    q=2*10^-19;
    
    v=1;
    
    
    m=2*10^-31;
    
    %%Risolvo prima dei campi
            rhsE=@(z,x)[x(2); 0];
            [za0, xa0] = ode45(rhsE, [-50 -1], [0 0]);
            
            rhsB = @(z,y) [y(2); 0];
            [zb0, yb0] = ode45(rhsB, [-50 -1], [0 0]);
    
    
    
    
    %% Risolvo le equazioni dentro i campi che hanno la stessa lunghezza
     E=1;
                rhsE =@(z,x)[x(2); (q/m)*(E/v^2)];
                [zaE, xaE] = ode45(rhsE, [0 100], [0 0]);
                
     B=1;
                rhsB = @(z,y) [y(2); (q*B)/(m*v)];
                [zbB, ybB] = ode45(rhsB, [0 100], [0 0]);
                
    %% Esco fuori
           % nuove condizioni iniziali per E
            dxaE = diff(xaE(:,1))./diff(zaE); % calcolo la tengente alla traiettoria e prendo il valore nell'ultimo punto
            ICE = [xaE(end, 1) dxaE(end)]; % ICE = [ultimo punto traiettoria, tangente in quel punto]
           
           % nuove condizioni iniziali per B
            dybB = diff(ybB(:,1))./diff(zbB);
            ICB = [ybB(end, 1) dybB(end)];
            
        % Risolvo per E                 
            rhsE=@(z,x)[x(2); 0];
            [za, xa] = ode45(rhsE, [101 200], ICE);
            
        % Risolvo per B
            rhsB = @(z,y) [y(2); 0];
            [zb, yb] = ode45(rhsB, [101 200], ICB);
            
    %% Plot
    
    % ZA=[za0; zaE; za];
    % XA=[xa0; xaE; xa];
    % YB=[yb0; ybB; yb];
    
    ZA=[zaE;za];
    XA=[xaE;xa];
    YB=[ybB;yb];
    
        plot3(ZA, XA(:,1), YB(:,1))
    
        grid on
         
    xlabel('direzione fascio')
    ylabel('defl. magnetica')
    zlabel('defl. elettrica')
    
    l'errore che dà:
    _______________
    ??? Error using ==> plot3
    Vectors must be the same lengths.

    Error in ==> ODE_CEM_StessaLunghezza at 57
    plot3(ZA, XA(:,1), YB(:,1))
    _______________
  • Re: Equazioni differenziali a coefficienti non costanti

    Sembra come se la lunghezza dei vettori di uscita dipendesse dalle dimensioni dell'equazione.
    Infatti per v=1, le due equazioni danno lo stesso risultato e i due vettori sono della stessa lunghezza
    Se aumenti v la lunghezza di ybB>xaE
    se diminuisci v la lunghezza di ybB<xaE
  • Re: Equazioni differenziali a coefficienti non costanti

    Infatti sta cosa non va bene secondo me. Gli devo fare risolvere un'equazione diversa:

    F(z)= (q/m) [(E *cross (1/v)) *cross (1/v) + B *cross (1/v)]

    che è una cosa simile a quella fatta qua: http://www.mathworks.se/matlabcentral/answers/9120-simulation-of-charged-particle-in-matlab
    ma in funzione di z anzicchè del tempo.
  • Re: Equazioni differenziali a coefficienti non costanti

    Madonna mia che palle sta roba.

    Ho scritto:
    
    v0 = [0 0 1]';  %initial velocity
    B = [-1 0 0]';  %magnitude of B
    E = [1 0 0]';  %magnitude of E
    m = 1; % mass
    q = 1;  %charge on particle
    r0 = [0 0 0]'; %initial position of particle 
    zspan = [0 100];
    
    y0 = [r0; v0];          
    f = @(z,y) [y(4:6); (q/m)* cross( cross( E, 1/y(4:6) ), 1/y(4:6)  )+ (q/m)*cross( B, 1/y(4:6)  )  ]; 
    [z,y] = ode23t(f,zspan,y0);
    
    ma si incazza dicendo:
    __________________________________________
    ??? Error using ==> vertcat
    CAT arguments dimensions are not consistent.

    Error in ==>
    @(z,y)[y(4:6);((q/m)*cross(cross(E,1/y(4:6)),1/y(4:6))+(q/m)*cross(B,1/y(4:6)))]


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

    Error in ==> ode23t at 221
    [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

    Error in ==> Lorentz_di_z at 31
    [z,y] = ode23t(f,zspan,y0); %The only ODE-solver that conserves that is ode23t, the
    others don't, some increase v^2 some decrease.
    ____________________________________________

    Ma non capisco dove sia l'errore, anche perchè tutte le variabili hanno le stesse dimensioni di quelle dell'esempio...
  • Re: Equazioni differenziali a coefficienti non costanti

    Mi sa che non va bene la divisione 1/y(4:6), devi mettere il puntino davanti ./
  • Re: Equazioni differenziali a coefficienti non costanti

    Avevi ragione.
    Solo che ora non fa iterazioni perchè ha zeri a dividere... BASTA, che bordello.
  • Re: Equazioni differenziali a coefficienti non costanti

    Cambio ancora una volta approccio e la faccio il più semplice possibile.
    Risolvo l'equazione normale come nel famoso esempio che funziona e non lo fa incazzare (già provato)
    Poi calcolo la tangente come ho fatto prima e gli faccio fare un pezzo di deriva che mi sbrigo.
    Poi la prossima settimana se ne parla se ci sono cose più raffinate che si possono fare me lo dicono quelli dell'altro gruppo e me lo faccio spiegare.

    Buon fine settimana giug, e grazie sempre della disponibilità e del tempo che mi hai dedicato.
    Sarei ancora in mezzo ad una strada senza il tuo prezziosissimo aiuto.
  • Re: Equazioni differenziali a coefficienti non costanti

    Coraggio, vedrai che prima o poi la soluzione arriverà... magari qualche illuminazione durante il week end.
    Buon fine settimana anche a te.
  • Re: Equazioni differenziali a coefficienti non costanti

    Per la cronaca: ho scritto il codice per risolvere l'equazione:

    f = @(z,y) [y(4:6); (q/m)* cross( cross( E, 1/y(4:6) ), 1/y(4:6) )+ (q/m)*cross( B, 1/y(4:6) ) ];
    [z,y] = ode23t(f,zspan,y0);

    fa cinque minuti di conti e poi fa una minchiata, quindi penso sia sbagliata l'equazione...
    Poi ho provato così:
    
    eV=1.6021765e-19; %[J], fattore di conversione eV-->J
    c= 2.99792458e8;  %[m/s], velocità della luce
    %KB=(8.617332*10^(-5))*eV; %[eV/K], costante di Boltzmann
    uma1=931.494028; %[MeV/c^2], fattore di conversione uma-->MeV/c^2 (massa)
    KB=8.617e-5; %[eV*K^-1], costante di Boltzmann
    KBT=1076*KB;
    E=0.03; %Eneriga 30KeV
    K_ion=E;
             Etot=K_ion+((m_H*uma1)/uma);  % ho tutto in MeV
             betasquare_H=1-(((m_H*uma1)/(uma*Etot))^2);
             v_H=sqrt(betasquare_H*c^2);
    
    v0 = [0 0 v_H]';  %initial velocity column vector
    r0 = [0 0 0]'; %initial position of particle column vector 
    y0 = [r0; v0]; %Concatena i due vettori colonna r0 e v0 e crea il vettore colonna delle condizioni iniziali
    
    %  m = 2; % mass
    %  q = 1;  %charge on particle
    q_over_m=q/m_H;
    
    
    dt= 0.01; %intervallo di tempo
    tspan = [0 dt];
    
    
    %%
    %Distanze in metri
    Deriva1= 0.05;
    LB=0.15;
    inizioE=0.13;
    fineB= 0.20;
    LE=0.07;
    fineE=0.21;
    Dist_Spettr_riv=0.40;
    
    z=0; %posizione iniziale
    traiettoria= zeros(11,6);
    
    while z<Deriva1
       
        B=[0 0 0]';
        E=[0 0 0]';
        
        f = @(t,y) [y(4:6); (q_over_m).*cross(y(4:6),B)+(q_over_m).*E]; % the expression [y(4:6); (q/m)*cross(y(4:6),B)]
                                                 % combines two vectors of length 3 to make a vector of 
                                                 % length 6(as long as y is a column vector).
        
        [t,y] = ode23t(f,tspan,y0);
       
        traiettoria= [traiettoria;y];
        tspan = dt+tspan;
        y0=y(end,:);
        z=y(end,3);
    
    end
        
        figure
        plot3(traiettoria(:,3),traiettoria(:,2),traiettoria(:,1))
        grid on
        
        xlabel ('direzione del fascio');
        zlabel ('deflessione elettrica');
        ylabel ('deflessione magnetica');
    
    %% 
    while (z>=Deriva1 || z<inizioE)
        
        B=[1 0 0]';
        E=[0 0 0]';
        
        f = @(t,y) [y(4:6); (q_over_m).*cross(y(4:6),B)+(q_over_m).*E]; % the expression [y(4:6); (q/m)*cross(y(4:6),B)]
                                                 % combines two vectors of length 3 to make a vector of 
                                                 % length 6(as long as y is a column vector).
        
        [t,y] = ode23t(f,tspan,y0);
        
        traiettoria= [traiettoria;y];
        tspan = dt+tspan;
        y0=y(end,:);
        z=y(end,3);
    end
    
    
    
    figure
    plot3 ( traiettoria(:,3), traiettoria(:,2), traiettoria(:,1))
    grid on
    
    xlabel ('direzione del fascio');
    zlabel ('deflessione elettrica');
    ylabel ('deflessione magnetica');
    
    La mia idea era quella di fargli risolvere l'equazione in funzione del tempo ma con valori di B ed E differenti a seconda della zona in cui si trova la particella.
    Per fare questo volevo fargli risolvere l'equazione per in un ciclo while (con un if-else si pianta) in cui verifica che la coordinata z = y(end,3) sia più grande o più piccola di un certo valore.
    Nella mia testa fino a che è verificata la condizione del while dovrebbe rientrare nel ciclo, risolvere l'equazione incrementare il tempo aggiornare le condizioni iniziali e la z e verificare la condizione. Se è vera ripete se è falsa passa all'altro while in cui dovrebbe rifare le stesse cose ma con un B diverso... poi ci andrebbe un altro while che fa la stessa cosa dove B ed E sono diversi da zero e così via.
    Il punto è che il primo ciclo sembra lo faccia correttamente ma se entra nel secondo while mi sa che non riesce più ad uscirne perchè ho aspettato un'ora e passa ma mi continua a comparire la scritta "busy" vicino allo "start"....
  • Re: Equazioni differenziali a coefficienti non costanti

    Dà errore? che dice?
Devi accedere o registrarti per scrivere nel forum
473 risposte