Monopolo Acustico: Script Matlab

di il
5 risposte

Monopolo Acustico: Script Matlab

Buona sera. Per motivi accademici ho dovuto creare uno script Matlab che illustri graficamente il comportamento di un monopolo. Si tratta di un modello matematico per riprodurre l'effetto di sorgenti acustiche. Come potete vedere dall'immagine allegata, l'aspetto è quello assunto dalle onde in uno stagno.
Nella stessa foto ho allegato anche lo script elaborato. La sequenza dei plot al variare del tempo mi ha consentito di creare un'animazione in cui le onde si propagano correttamente. Pertanto posso affermare che lo script funziona.

Il problema che mi sta facendo ammattire, però, è quello relativo ai colori assunti dal grafico. Come potete vedere dall'immagine annessa, il grafico cambia colore uniformemente al variare del tempo, passando dal gallo al blu, fino al verde. Questo non dovrebbe accadere, considerando che i colori assunti da ogni punto del grafico sono legati all'intensità della pressione locale (per come è posta la formula di P). I colori dovrebbero variare in base alle onde, propagandosi con esse, e non cambiare in modo uniforme ovunque.
Ho scoperto che se invece di utilizzare il comando surf utilizzassi il comando surfl il problema parebbe risolversi autonomamente… ma è solo un illusione dovuta al fatto che con quel comando Matlab "illumina" il grafico con una fonte di luce virtuale.

Devo trovare il modo di poter impiegare il comando surf senza lo sgradevole cambio di colore al variare del tempo. Ho già provato a chiedere una mano al mio docente, i cui consigli sono stati però inutili:
-Cambiare il valore della costante K;
-Aumentare le dimensioni del grigliato X,Y.
-Impedire allo script di formulare un raggio pari a zero (per evitare eventuali singolarità)

Questi tentativi sono stati tutti vani.
Mi chiedevo se qualcuno avesse un suggerimento, anche perché a questo punto non so più dire se il problema sia nella formulazione dello script oppure nella scelta dei comandi (la differenza sostanziale tra surf e surfl mi ha lasciato stupito, ma purtroppo non posso accettarla come soluzione).
Allegati:
24783_633370385408f4b8f9502cf2adebbf24.png
24783_633370385408f4b8f9502cf2adebbf24.png

5 Risposte

  • Re: Monopolo Acustico: Script Matlab

    Dovresti pubblicare lo script come "testo" e non come immagine (che peraltro risulta illeggibile) in modo che si possa provare ad eseguirlo e provare a trovare la causa del cambiamento di colore e, naturalmente, anche gli eventuali dati di input.
    Senza il codice e gli eventuali dati, non si può fare molto (praticamente niente).
  • Re: Monopolo Acustico: Script Matlab

    ask_raf ha scritto:


    Dovresti pubblicare lo script come "testo" e non come immagine (che peraltro risulta illeggibile) in modo che si possa provare ad eseguirlo e provare a trovare la causa del cambiamento di colore e, naturalmente, anche gli eventuali dati di input.
    Senza il codice e gli eventuali dati, non si può fare molto (praticamente niente).
    Buona sera. Pensavo l'immagine potesse ingrandirsi.
    Provvedo subito a postare lo script:

    Q=13;
    ro=1.225;
    c=343;
    k=4.58;
    omega=60;
    for t=0:.01:0.30
    x=[-5:.1:5];
    y=[-5:.1:5];
    [X,Y]=meshgrid(x,y);
    r=sqrt(X.^2+Y.^2);
    P=@(r)((Q*ro*c*k)./(4*pi*r)).*cos(omega*t-k*r);
    z=P(r);
    axis([0 100 0 100 -20000 20000]);
    figure
    surf(z)
    end


    Resto disponibile per qualunque ulteriore chiarimento.
  • Re: Monopolo Acustico: Script Matlab

    Il problema si può risolvere specificando, ad ogni iterazione il parametro "clim" dell'axes.

    Di seguito una versione modificata del tuo codice:
    [*] la reazione della "figure" va spostata fuori dal loop in modo che non se ne crei una nuova ad ogni iterazione
    [*] definisci una mappa colore invocando la funzione "colormap" (nella documentazione on-line trovi quali siano le mappe disponibili e come crearne una "personalizzata")
    [*] aggiungi al grafico la barra (scala) dei colori invocando la funzione "colorbar"
    [*] setta ad ogni iterazione il parametro "clim" che definisce i valori minimo e massimo sui quali mappare i colori: i possibili valori possono essere, se ho capito quello che vuoi ottenere i valori minimo e massimo raggiunti da "z" (-7.4788e+003 6.3551e+003) che potresti arrotondare a (-7500 7500). Potresti considerare la possibilità di usare un range più poccolo (es. -3000 3000) visto che i valori più grandi (in vlaore assoluto) si ottengono al centro e mascherano il cambiamento dei colori nelle altre parti del grafico (nell'esempio ho usato [-2500 2500], valuta tu l'intervallo migliore)
    [*] per ottenere un effetto "dinamico" inserisci, al fondo del ciclo "for" la chiamata alla funzione "pause" che fermerà l'esecuzione dello script per "x" secondi.
    
    Q=13;
    ro=1.225;
    c=343;
    k=4.58;
    omega=60;
    figure
    for t=0:.01:0.30
       x=[-5:.1:5];
       y=[-5:.1:5];
       [X,Y]=meshgrid(x,y);
       r=sqrt(X.^2+Y.^2);
       P=@(r)((Q*ro*c*k)./(4*pi*r)).*cos(omega*t-k*r);
       z=P(r);
       surf(z)
       set(gca,'clim',[-2500 2500])
       axis([0 100 0 100 -20000 20000]);
    %   colormap(jet)
       colormap(hot)
       colorbar
       pause(.2)
    end
    
  • Re: Monopolo Acustico: Script Matlab

    ask_raf ha scritto:


    Il problema si può risolvere specificando, ad ogni iterazione il parametro "clim" dell'axes.
    Grazie infinite. E' proprio quello che volevo ottenere. Ti devo una birra, davvero!

    A scopo informativo, potresti meglio spiegarmi la funzione di ogni voce contenuta nella seguente stringa?

    set(gca,'clim',[-2500 2500])

    Grazie ancora, sei stato formidabile. Se continuavo a dar retta al mio docente non ne uscivo più, e le mie nozioni relative a Matlab sono limitate a quanto trattato nell'arco dei corsi accademici. Spero non ti dispiaccia se in futuro (anche nelle prossime ore, temo) chiederò ulteriori suggerimenti.
  • Re: Monopolo Acustico: Script Matlab

    La funzione "set" viene usata (fino alla versione R2014a) per settare i parametri dell'oggetto identificato dal primo parametro.
    Esiste anche la funzione "get" che ritorna il valore di un dato parametro.

    Dalla versione R2014b alla funzione "set" è stata introdotta la "dot notation": tramite questa si accede ai parametri direttamente tramite l'handel dell'oggetto.
    Con la dot notation, l'istruzione "set(gca,'clim',[-2500 2500])" si scriverebbe
    
    curr_ax=gca
    cur_ax.CLim=[-2500 2500]
    
    la dot notatio necessita dell'handle dell'oggetto, da qui la necessità della prima istruzone (cur_ax=gca).
    Uno degli svantaggi della dot notation è che il nome del parametro (CLim in questo caso) è "case sensitive".

    La chiamata alla funzione "set"
    
    set(gca,'clim',[-2500 2500])
    
    setta il parametro "clim" dell'axes al momento usato, ai valori [-2500 2500] (il parametro "clim" è un vettore di due elementi).

    Il parametro "clim" setta i limiti del range dei colori da rappresentare (un po' come "xlim" è il parametro che definisce i limiti dell'asse delle ascisse).
    Nella documentazione on-line trovi tutti i dettagli.

    Nella chiamata, il primo parametro (gca) è, a sua volta, una funzione che ritorna l'handle (una specie di "puntature" se hai familiarità con il C) all'axes corrente (gca sta per "get current axes")
Devi accedere o registrarti per scrivere nel forum
5 risposte