Pagina 4 di 5
Re: [c]utilizzare gnuplot
Inviato: sabato 18 aprile 2009, 20:34
da cristian_c
kiroken ha scritto:
intendo comunicare con gnuplot come se stessi scrivendo su di un file con le fwrite. In poche parole collegare ad esempio lo stdout del programma c con lo stdin di gnuplot così puoi interagire con gnuplot in modo interattivo (a quanto ho capito gnuplot prevede interattività). Con echo dai un comando e poi basta.
che cosa intendi in pratica? Fai un esempio

Re: [c]utilizzare gnuplot
Inviato: sabato 18 aprile 2009, 21:03
da kiroken_
beh diciamo che vorrei ottenere il risultato di
però a runtime ovvero lanciando gnuplot dentro al programma radice e concatenare gli stream
Re: [c]utilizzare gnuplot
Inviato: sabato 18 aprile 2009, 21:22
da cristian_c
se non ho capito male, già come ho fatto io funziona.
Si, ma in pratica quali operazioni vuoi eseguire? vuoi che l'output del programma c compaia in gnuplot?
Non mi è chiaro proprio quello che vorresti fare in concreto ::)
Re: [c]utilizzare gnuplot
Inviato: sabato 18 aprile 2009, 22:11
da kiroken_
ehm forse ho compreso male il funzionamento di gnuplot quindi quello che voglio fare non ha senso con questo programma.
Potrei chiedere ad esempio questo a gnuplot?
Codice: Seleziona tutto
gnuplot
// ora posso scrivere le richieste a gnuplot
f(x)=2y //mostrami il grafico di questa funzione
// attendo 40 secondi
f(x)=4y //ora mostrami il grafico di quest'altra il tutto senza chiudere l'istanza di gnuplot
Re: [c]utilizzare gnuplot
Inviato: sabato 18 aprile 2009, 23:47
da cristian_c
kiroken ha scritto:
ehm forse ho compreso male il funzionamento di gnuplot quindi quello che voglio fare non ha senso con questo programma.
Potrei chiedere ad esempio questo a gnuplot?
Codice: Seleziona tutto
gnuplot
// ora posso scrivere le richieste a gnuplot
f(x)=2y //mostrami il grafico di questa funzione
// attendo 40 secondi
f(x)=4y //ora mostrami il grafico di quest'altra il tutto senza chiudere l'istanza di gnuplot
si certo, credo che si possa fare

Anche se riguardo l'utilità non so.
Qualche post sopra avevo segnalato una libreria c che utilizza gnuplot.
Comunque puoi chiamare più di una volta la funzione system:
- la prima volta per chiamare la prima plot
- poi dai un comando tipo delay
- chiami una seconda volta plot
Re: [c]utilizzare gnuplot
Inviato: domenica 19 aprile 2009, 11:52
da kiroken_
si ma con system crei due istanze di gnuplot non è la stessa cosa

non parlo di usare le librerie c di gnuplot dentro a radice, ma radice che comunica con la stessa istanza di gnuplot
Re: [c]utilizzare gnuplot
Inviato: domenica 19 aprile 2009, 14:01
da cristian_c
Questo è un po' diverso e dovrebbe essere un utility da usare in accoppiata con Emacs per comporre script da utilizzare con Gnuplot
feff.phys.washington.edu/~ravel/software/gnuplot-mode/gpelcard.pdf
gnuplot-delay [0.01]
Time in seconds to allow the gnuplot display to
update. Increase this number if the prompts and
lines are displayed out of order.
Re: [c]utilizzare gnuplot
Inviato: domenica 10 maggio 2009, 21:57
da cristian_c
Ho fatto qualche modifica al programma riducendo il campo di visualizzazione della funzione ai soli numeri positivi (per ovvi motivi dovuti ai problemi riscontrati alcuni post fa) e ho impostato la scala logaritmica per l'asse x.
Purtroppo però in compilazione sono occorsi degli errori inaspettati.
Intanto posto il codice:
Codice: Seleziona tutto
#include <stdio.h>
#include <math.h>
#define ERR 0.00001
int ordine(double x)
{
int n=0;
while (floor(x)!=0) {
x=x/10;
n++;
}
return n+1;
}
main()
{
char *indice[]={"quadrata","cubica","quarta","quinta","sesta","settima","ottava","nona","decima"};
long double a,b,m,x;
long double fm,pot;
int n,i,res;
char x_str[50];
printf("\n// il programma calcola la radice\n// di un numero reale positivo scelto dall'utente\n// con indice intero immesso da tastiera\n\n");
do {
printf("Inserire un indice valido per la radice(un numero intero da 1 a 10): ");
res=scanf("%d",&n);
while(getc(stdin)!='\n');
} while((n<1 || n>10) && (res==0));
do {
printf("Inserire un valore reale di cui calcolare la radice: ");
res=scanf("%s",&x_str);
while(getc(stdin)!='\n');
} while(res==0);
sscanf(x_str,"%Lf",&x);
if (x>=0) {
if (n==1) printf("\nla radice prima di %Lf è %Lf\n",x_str,x_str);
else if (x==1) printf("\nla radice %s di 1 è 1\n\n",indice[n-2]);
else {
if (x>1) {
a=1; b=x;
}
else {
a=x; b=1;
}
do {
m=(a+b)/2;
pot=m;
for(i=1;i<n;i++) pot*=m;
fm=pot-x;
if (fm!=0) {
if (fm>0) b=m;
else a=m;
}
} while (fabs(fm)>ERR);
printf("\nla radice %s di %s è %Lg\n\n",indice[n-2],x_str,m);
}
char cmd[100];
float f = 1/(float)n;
sprintf(cmd,"echo \"set logscale x 10;plot[0:(%d)]x**(%f)\" | gnuplot -persist",ordine(x),f);
system(cmd);
}
else printf("Il numero reale digitato non è positivo.\n\n");
}
Ed ecco gli errori:
Codice: Seleziona tutto
cristiancozzolino@cristian-desktop:~/programmazione$ gcc radice.c -o radice -lm
radice.c: In function ‘main’:
radice.c:32: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[50]’
radice.c:37: warning: format ‘%Lf’ expects type ‘long double’, but argument 2 has type ‘char *’
radice.c:37: warning: format ‘%Lf’ expects type ‘long double’, but argument 3 has type ‘char *’
cristiancozzolino@cristian-desktop:~/programmazione$
a cosa può essere dovuto e come posso risolvere? :-\ ::) ??? :-[
Re: [c]utilizzare gnuplot
Inviato: domenica 10 maggio 2009, 22:35
da kiroken_
per il primo leva & a x_str. x_str è già un puntatore all'array
Per gli ultimi due devi convertire gli array di char in long double
Re: [c]utilizzare gnuplot
Inviato: domenica 10 maggio 2009, 22:47
da cristian_c
grazie per aver risposto!
Per il primo ho risolto, per gli altri due pensavo che la sscanf servisse proprio a fare la conversione:
Re: [c]utilizzare gnuplot
Inviato: domenica 10 maggio 2009, 23:59
da kiroken_
si ma poi se ci passi x_str non funziona

Re: [c]utilizzare gnuplot
Inviato: lunedì 11 maggio 2009, 15:54
da cristian_c
kiroken ha scritto:
si ma poi se ci passi x_str non funziona
eppure la sintassi che ho utilizzato è corretta:
http://digilander.libero.it/uzappi/C/librerie/funzioni/scanf.html ::)
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 11:36
da kiroken_
intendevo dire che ti da errore qua
Codice: Seleziona tutto
if (n==1) printf("\nla radice prima di %Lf è %Lf\n",x_str,x_str);
perchè invece di passarci le long double gli hai passato dei char *
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 13:36
da cristian_c
kiroken ha scritto:
intendevo dire che ti da errore qua
Codice: Seleziona tutto
if (n==1) printf("\nla radice prima di %Lf è %Lf\n",x_str,x_str);
perchè invece di passarci le long double gli hai passato dei char *
Grazie kiroken per l'aiuto e per avermi segnalato l'errore

(io non mi ero accorto :-[ )
Ora in compilazione non ricevo più errori, ma in esecuzione invece si. Infatti la finestra di gnuplot non compare, ma viene segnalato un errore in output:
Codice: Seleziona tutto
cristiancozzolino@cristian-desktop:~/programmazione$ ./radice
// il programma calcola la radice
// di un numero reale positivo scelto dall'utente
// con indice intero immesso da tastiera
Inserire un indice valido per la radice(un numero intero da 1 a 10): 5
Inserire un valore reale di cui calcolare la radice: 3456
la radice quinta di 3456 è 5.1017
line 0: x range must be greater than 0 for log scale
cristiancozzolino@cristian-desktop:~/programmazione$
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 13:50
da kiroken_
prova a far stampare tutti i comandi che invii a system così ti accorgi subito se tenti di inviargli qualcosa di non corretto
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 15:16
da cristian_c
kiroken ha scritto:
prova a far stampare tutti i comandi che invii a system così ti accorgi subito se tenti di inviargli qualcosa di non corretto
non mi è chiara la modalità in cui farlo ::)
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 15:48
da kiroken_
Codice: Seleziona tutto
sprintf(cmd,"echo \"set logscale x 10;plot[0:(%d)]x**(%f)\" | gnuplot -persist",ordine(x),f);
printf("il comando che invio è %s\n", cmd);
system(cmd);
così
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 18:28
da cristian_c
kiroken ha scritto:
Codice: Seleziona tutto
sprintf(cmd,"echo "set logscale x 10;plot[0:(%d)]x**(%f)" | gnuplot -persist",ordine(x),f);
printf("il comando che invio è %s\n", cmd);
system(cmd);
così
Grazie!
Codice: Seleziona tutto
cristiancozzolino@cristian-desktop:~/programmazione$ ./radice
// il programma calcola la radice
// di un numero reale positivo scelto dall'utente
// con indice intero immesso da tastiera
Inserire un indice valido per la radice(un numero intero da 1 a 10): 5
Inserire un valore reale di cui calcolare la radice: 3456
la radice quinta di 3456 è 5.1017
il comando che invio è echo "set logscale x 10;plot[0:10**(5)]x**(0.200000)" | gnuplot -persist
line 0: x range must be greater than 0 for log scale
cristiancozzolino@cristian-desktop:~/programmazione$
quindi a questo punto cosa dovrei fare? ???
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 18:33
da kiroken_
"set logscale x 10;plot[0:10**(5)]x**(0.200000)" | gnuplot -persist
controllare se la sintassi con cui hai invocato il comando è corretta usando i manuali io non lo conosco gnuplot
Re: [c]utilizzare gnuplot
Inviato: mercoledì 13 maggio 2009, 19:00
da cristian_c
copio incollo dal manuale ^_^
4.3 Specificare il dominio e il codominio
Il comando splot traccia automaticamente il grafico della funzione per x ∈ [−10; 10] e per y ∈
[−10; 10] e adattando l’asse delle z ai valori cos` ottenuti. Molte volte abbiamo per` la necessit`
di tracciare il grafico per valori di x e di y diversi da quelli di default. Se x1,x2,y1,y2,zi,z2
sono numeri reali un primo modo per ottenere il risultato voluto ` quello di utilizzare splot con
la seguente sintassi:
plot[x1:x2][y1:y2][z1:z2]f(x,y) viene specificato sia dominio che codominio
plot[x1:x2][y1:y2]f(x) viene specificato solo il dominio
plot[][][z1:z2]f(x) viene speciticato solo il codominio
In questo modo i valori specificati per il dominio e codominio valgono solo per il grafico che
stiamo tracciando.
6.3 Usare la scala logaritmica
Per impostare la scala logaritmica si usa il comando:
set logscale asse base
in cui asse ` x,y,z o qualunque combinazione due a due di questi valori, e base ` la base
logaritmica prescelta.
Per eliminare la scala logaritmica si usa il comando:
set nologscale asse
in cui asse ` x,y,z o qualunque combinazione due a due di questi valori.
Per eliminare tutte le scale logaritmiche impostate si usa il comando:
set nologscale
mentre per vedere la situazione delle scale logaritmiche impostate si usa il comando:
show logscale.
Per ulteriori precisazioni si veda l’help in linea richiamabile con help set logscale