Valutazione di funzione e grafico

di il
1 risposte

Valutazione di funzione e grafico

Ciao a tutti,
sono alle prime armi con Matlab. Stavo provando a riprendere un esempio del mio libro di Calcolo Numerico dove, al capitolo delle formule adattative prende questo integrale
integrale fra 1/2 e 100 di -2x^(-3)cos(x^(-2))
e dice che la funzione varia molto in prossimità dell'estremo sinistro e produce il seguente grafico

Io in matlab ho scritto le seguenti cose (correggetemi se ho sbagliato)
>> a=1/2; b=100; x=linspace(a,b);
>> f='-2.*x.^(-3).*cos(x.^(-2))';
>> fx=eval(f);
>> plot(x,fx)
e mi viene, dopo aver modificato a mano le ascisse e ordinate (come si imposta la scala da codice?)

So che magari è una cavolata...ma vorrei capire cosa sbaglio..
grazie a tutti!

1 Risposte

  • Re: Valutazione di funzione e grafico

    Nella domanda non è chiaro se il problema è relativo al calcolo dell'integrale o alla rappresentazione della funzione "f".

    La funzione eval chiamata nello script non calcola l'integrale, ma semplicemente la funzione "f".

    Se l'obiettivo è calcolare la funzione "f" nell'intervallo definito (0.5 100) non è necessario ricorrere a "eval", è sufficiente scrivere direttamente:

    fx=-2.*x.^(-3).*cos(x.^(-2));

    Per quanto riguarda la rappresentazione grafica:

    [*] per ottenere un grafico con uno od entrambi gli assi in scala logaritmica, si possono usare le seguenti funzioni:

    semilogx: scala logaritmica solo sull'asse X
    semilogy: scala logaritmica solo sull'asse Y
    loglog: scala logaritmica su entrambi gli assi

    nel caso della domanda:

    semilogx(x,fx)

    per poter "apprezzare" nel grafico l'andamento della funzione in prossimità dell'ascissa "0.5" occorre aumentare il numero di punti per i quali la funzione è calcolata.
    La funzione "linspace" genera di deafult "100" punti, per generarne di più bisogna specificarne il numero con un ulteriore parametro:

    x=linspace(a,b,1000);

    (aumentando il numero di punti, si può osservare, nel grafico, un andamento interessante in prossimità di x=0.5 ... prova a settare "a=0.1", "a=0.2", "a=0.3") ...

    in alternativa i valori di x possono essere definiti come:

    passo=0.1;
    x=a:passo:100;

    [*] per settare / modificare via codice i limiti degli assi bisogna accedere alle loro proprietà tramite il loro "handle" con le funzioni "get" e "set":

    limiti_asse_x=get(gca,'xlim'); ritorna i limiti attuali dell'asse X
    limiti_asse_x=get(gca,'ylim'); ritorna i limiti attuali dell'asse Y
    limiti_asse_z=get(gca,'ylim'); ritorna i limiti attuali dell'asse Z

    set(gca,'xlim',[new_min_x new_max_x]); setta i nuovi limiti attuali dell'asse X ai valori (new_min_x e new_max_x)
    set(gca,'ylim',[new_min_y new_max_y]); setta i nuovi limiti attuali dell'asse Y ai valori (new_min_y e new_max_y)
    set(gca,'zlim',[new_min_z new_max_z]); setta i nuovi limiti attuali dell'asse Z ai valori (new_min_z e new_max_z)

    gca: la funzione built-in gca restituisce l'handle del sistema di assi corrente

    Tramite le funzioni "get" e "set" è anche possibile modificare il tipo di asse (lineare / logaritmico)

    set(gca,'xscale','log'): per settare l'asse X "logaritmico" (partendo da un grafico generato con "plot")
    set(gca,'yscale','log'): per settare l'asse Y "logaritmico"

    Se si vuole aggiungere la "griglia" al grafico:

    grid on

    Alcuni dei suggerimenti sopra descritti sono stati implementati nello script che segue.
    
    a=1/2;
    b=100;
    x=a:0.1:b;
    fx=-2.*x.^(-3).*cos(x.^(-2));
    semilogx(x,fx,'r','linewidth',2)
    xlabel('Legenda asse X')
    ylabel('Legenda asse Y')
    legend('Funzione "f"')
    title('Grafico Funzione "f"')
    grid on
    
    Hope this helps.
    Allegati:
    16082_3b80278270cd09c280da2ad54a7499db.jpg
    16082_3b80278270cd09c280da2ad54a7499db.jpg
Devi accedere o registrarti per scrivere nel forum
1 risposte