[c++] Consigli per grafici

alle.fabbri
Ciao a tutti,
sto studiando da autodidatta il libro Numerical Recipes, per chi non lo conoscesse una bibbia di codici per implementare algoritmi numerici per la soluzione di praticamente qualunque problema matematico/fisico/statistico. In particolare mi sto concentrando sulla parte relativa alla soluzione di equazioni differenziali, ordinarie per il momento. Il mio problema è che non riesco a trovare un modo semplice di testare i miei risultati, nel senso che una volta che il programma ha fatto tutto quello che deve io mi trovo con due array di valori e non so cosa farmene per controllare se sono buoni o meno. Una volta usavo Python e lì era facile fargli disegnare un grafico per valutare il risultato ottenuto, ma in c++ come si fa? Come posso "uscire" da c++ per ottenere un grafico o aprire una finestra, tipo pop-up, con il grafico dei risultati ottenuti? Attualmente lavoro su Win (e me ne vergogno...). Se qualcuno di più esperto avesse qualche consiglio, anche radicale, sarei felice di accettare indicazioni essendo praticamente un neofita di programmazione.
Grazie mille a tutti!

Risposte
apatriarca
Se ti basta verificare i risultati al di fuori della tua applicazione è sufficiente memorizzarli in un qualche formato che venga letto da un qualsiasi programma come excel o matlab o ... A quel punto puoi fare tutte le analisi dei dati che vuoi.

Se no ti devi affidare a qualche libreria esterna per la visualizzazione dei grafici. Non te ne saprei consigliare nessuna per Windows però. gnuplot dovrebbe avere un porting per Windows ma non ho idea se anche l'interfaccia per il C o il C++ sia stata portata su Windows. Di altre devo ammettere di non conoscerne. Normalmente o mi creo il grafico direttamente nel codice oppure faccio ricorso a Matlab per analizzare i dati.

alle.fabbri
Grazie delle risposte apatriarca!
Devo ammettere che soprattutto nella seconda parte non ho capito bene cosa intendi. Il porting non so cosa sia. Adesso cercherò qualche tutorial su gnuplot e vediamo cosa ne esce. Ma quando dici che ti crei il grafico direttamente nel codice cosa intendi? Mi potresti postare qualche esempio?

david_e1
La cosa più facile da fare è fare output dei dati su file ASCII (su colonne) e poi analizzarli con gnuplot o simili.

alle.fabbri
Grazie ad entrambi. Ho provato sia matlab che gnuplot (per win) passando per un file .dat scritto dal programma c++. Mi chiedevo se ci fosse un modo per automatizzare il processo. Nel senso di chiamare gnuplot dal c++....non so se la mia domanda abbia senso....

david_e1
"alle.fabbri":
Grazie ad entrambi. Ho provato sia matlab che gnuplot (per win) passando per un file .dat scritto dal programma c++. Mi chiedevo se ci fosse un modo per automatizzare il processo. Nel senso di chiamare gnuplot dal c++....non so se la mia domanda abbia senso....

Si è possibile usando il comando system, ma non è una buona pratica, per un certo numero di ragioni. La più importante è che è buona norma separare i momenti "calcolo" e "analisi dei dati", in modo da rendere più flessibile l'analisi dei dati, facilitando la possibilità di confrontare dati provenienti da fonti diverse o calcolati con versioni / opzioni diverse del codice, evitando di dover ripetere più volte il calcolo (che può essere molto costoso) quando si vuole raffinare l'analisi.

Ad esempio supponi a un certo punto di voler fare un confronto fra i dati ottenuti con versioni diverse del codice. Con gnuplot ti basta un semplice

plot 'vecchio.dat' u 1:2 title 'Vecchia versione', 'nuovo.dat' u 1:2 title 'Nuova versione'


se invece fai il plot direttamente da C++ il tutto diventa molto più complicato.

*** PS ***
Una via alternativa, molto usata in ambito scientifico, è quella di usare uno script batch per invocare prima la parte di "calcolo" e poi quella di "analisi dei dati".

alle.fabbri
Grazie. Non ci avevo pensato... In effetti finchè si parla dei numeri da 1 a 10 scritti in colonna il problema non si pone ma in effetti questa modularità che suggerisci ha perfettamente senso.

PS.
Qui non ho proprio capito... So che esistono i file batch e li usavo negli anni 90 per far partire i giochi. Come lo useresti per fare quello che suggerivi?

david_e1
Io di solito li scrivo usando la shell di Linux (o OS-X dato che hanno la stessa shell). Quelle shell sono molto più potenti del prompt dei comandi di Windows: sono dei veri e propri linguaggi di programmazione. Per cui possono essere usate ad esempio per automatizzare il lancio del codice con parametri diversi e catalogare / comprimere automaticamente i dati etc. (metti che devi lanciare il codice per calcolare qualche migliaio di configurazioni diverse...)

Sotto Windows esistono varie soluzioni: c'è la possibilità di installare le shell UNIX usando cygwin oppure c'è anche una shell molto potente, sullo stile di quelle UNIX, che è la PowerShell. Nel tuo caso forse la cosa più facile, però, è scrivere i comandi dello script gnuplot in un file gpi: dentro gnuplot quando sei contento dello stile del grafico(*) fai

save "grafico.gpi"


dopodiché puoi fare un batch che automatizzi le cose facendo

PROGRAMMA.EXE
C:\PATH\TO\GNUPLOT.EXE -PERSIST GRAFICO.GPI


e salvandolo come "RUNME.BAT".

-------
(*) occhio che grafico.gpi conterrà il riferimento al file.dat che stavi plottando in quel momento, per cui assicurati che il tuo programma faccia un file con quel nome.

alle.fabbri
 for(int i = 1; 1 ; i++)
  cout << "Grazie infinite!!! ";

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.