Problemi semilogx dentro un ciclo for

di il
3 risposte

Problemi semilogx dentro un ciclo for

Ciao a tutti.
Come scritto nel titolo, ho questo errore con semilogx quando lo uso dentro un ciclo for:
devo graficare in scala logaritmica sull'asse delle ascisse 15 funzioni e volevo farlo utilizzando un ciclo for, quindi ho pensato ad una struttura del tipo:

hold on
for i=1:15
semilogx(x,f(i))
end

il problema è che il grafico che mi viene fuori non è "semilogx" ma "plot".
Qualcuno sa il perché?
Grazie a tutti per la risposta

3 Risposte

  • Re: Problemi semilogx dentro un ciclo for

    Per risolvere il problema è sufficiente spostare l'istruzione hold on all'interno del ciclo for, eventualmente inserendola in un blocco "if" in modo che venga eseguita una volta sola.

    Il motivo di tale "strano" comportamento è spiegato nell'help di Matlab:
    If you attempt to add a loglog, semilogx, or semilogy plot to a linear axis mode graph with hold on, the axis mode remains as it is and the new data plots as linear.
    Inserendo l'istruzione "hold on" prima dell'invocazione della funzione "semilogx" l'"axis mode" rimane settato come "linear".

    L'aggiunta della classica griglia dei grafici "logaritmici" è un po' più complicata, ma si può fare riferimento a quanto riportato in:
    http://www.mathworks.com/matlabcentral/answers/143234-incomplete-minor-gridlines-in-semilogx-plot

    Nello script in calce il grafico viene generato nelle due modalità ("hold on" prima del loop ed all'interno del loop).
    
    % 
    % Creazione dei valori delle ascisse
    % 
    x = 0:0.1:10;
    % 
    % Definizione dei colori da assegnare alle curve
    % 
    l_col='rgbkc'
    % 
    % Apertura della "finestra" per i grafici: la finestra conterrà due grafici
    % 
    figure
    % 
    % Grafico #1: l'istruzione "hold on" è inserita prima del loop che invoca
    % la funzione "semilogx"
    % 
    subplot(2,1,1)
    hold on
    for i=1:5
       semilogx(10.^x,x*i,'color',l_col(i),'linewidth',2)
       leg_1{i}=['i=' num2str(i)];
    end
    title('Hold on prima di "semilogx"')
    legend(leg_1,'location','EastOutside');
    grid on
    % 
    % Grafico #2: l'istruzione "hold on" è inserita all'interno del loop che
    % invoca la funzione "semilogx". Il flag "once" viene utilizzato per
    % attivare l'istruzione "hold on" una volta sola
    % 
    subplot(2,1,2)
    once=1;
    for i=1:5
       semilogx(10.^x,x*i,'color',l_col(i),'linewidth',2)
       if(once)
          hold on
          once=0;
       end
    end
    title('Hold on nel Loop')
    legend(leg_1,'location','EastOutside');
    grid on
    
    
    Hope this helps.
    Allegati:
    16082_622eb60b0ca46a57d1ae1d0bd32b2ff3.jpg
    16082_622eb60b0ca46a57d1ae1d0bd32b2ff3.jpg
  • Re: Problemi semilogx dentro un ciclo for

    Grazie infinite per tutte le dritte e per la chiarezza con cui le hai esposte!
    Ora testerò tutto.
  • Re: Problemi semilogx dentro un ciclo for

    Non c'è di che, è stato un piacere.
    Spero che il problema sia risolto.

    P. S.: quanto alle ... sono sopravvissuto a 2 Oktoberfest
Devi accedere o registrarti per scrivere nel forum
3 risposte