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

Codice: Seleziona tutto

./radice | gnuplot
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  ;D 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 :p
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!  :D

Per il primo ho risolto, per gli altri due pensavo che la sscanf servisse proprio a fare la conversione:

Codice: Seleziona tutto

sscanf(x_str,"%Lf",&x);

Re: [c]utilizzare gnuplot

Inviato: domenica 10 maggio 2009, 23:59
da kiroken_
si ma poi se ci passi x_str non funziona :p

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 :p
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  :D (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!  :D

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