[c]utilizzare gnuplot [RISOLTO]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c]utilizzare gnuplot

Messaggio da Zoff »

cristian_c ha scritto: (good) Ora finalmente la radice cubica viene disegnata! Grazie!  :D

Ora rimane il problema che la finestra di gnuplot scompare appena si fa qualsiasi cosa con i mouse (come fare clic in qualsiasi punto dello schermo del desktop):

Codice: Seleziona tutto

cristiancozzolino@cristiancozzolino-laptop:~$ cd programmazione/
cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ gcc radice.c -o radice -lm
cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ ./radice
// il programma calcola la radice
// di un qualunque numero reale scelto dall'utente
// con indice intero immesso da tastiera

Inserire un indice valido per la radice(un numero intero da 1 a 10): 3
Inserire un valore reale di cui calcolare la radice: 45

la radice cubica di 45 è 3.55689

cristiancozzolino@cristiancozzolino-laptop:~/programmazione$ 
** (<unknown>:8248): WARNING **: Failed to send buffer
<unknown>: Fatal IO error 11 (Risorsa temporaneamente non disponibile) on X server :0.0.
strano l'opzione -persist dovrebbe evitare proprio quello... Infatti a me rimane...
Controlla di aver scritto bene oppure leggiti bene il manuale...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

strano l'opzione -persist dovrebbe evitare proprio quello... Infatti a me rimane...
si,ma infatti con il codice precedente appariva sullo schermo la finestra di gnuplot per un decimo di secondo e poi spariva.
Ora, come ho detto, la finestra resta. Ma appena si svolge una qualsiasi operazione (per esempio con il mouse), questa sparisce e nel terminale appare il messaggio di errore riportato nel post precedente.

Nella guida a gnuplot che ho seguito non si fa riferimento a questo problema  :-\
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c]utilizzare gnuplot

Messaggio da Zoff »

cristian_c ha scritto:
strano l'opzione -persist dovrebbe evitare proprio quello... Infatti a me rimane...
si,ma infatti con il codice precedente appariva sullo schermo la finestra di gnuplot per un decimo di secondo e poi spariva.
Ora, come ho detto, la finestra resta. Ma appena si svolge una qualsiasi operazione (per esempio con il mouse), questa sparisce e nel terminale appare il messaggio di errore riportato nel post precedente.

Nella guida a gnuplot che ho seguito non si fa riferimento a questo problema  :-\
A me questo codice crea una finestra visibile anche dopo i click:

Codice: Seleziona tutto

#include 

main(){
	system("echo 'plot x**2' | gnuplot -persist");
}
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Zoff ha scritto:
cristian_c ha scritto:
strano l'opzione -persist dovrebbe evitare proprio quello... Infatti a me rimane...
si,ma infatti con il codice precedente appariva sullo schermo la finestra di gnuplot per un decimo di secondo e poi spariva.
Ora, come ho detto, la finestra resta. Ma appena si svolge una qualsiasi operazione (per esempio con il mouse), questa sparisce e nel terminale appare il messaggio di errore riportato nel post precedente.

Nella guida a gnuplot che ho seguito non si fa riferimento a questo problema  :-\
A me questo codice crea una finestra visibile anche dopo i click:

Codice: Seleziona tutto

#include 

main(){
	system("echo 'plot x**2' | gnuplot -persist");
}
a me invece mi crasha anche con il file gnuplot.c  ::) :-\ ???

Codice: Seleziona tutto

cristiancozzolino@cristiancozzolino-laptop:~$ gcc gnuplot.c -o gnuplot
cristiancozzolino@cristiancozzolino-laptop:~$ ./gnuplot
cristiancozzolino@cristiancozzolino-laptop:~$ 
** (<unknown>:8312): WARNING **: Failed to send buffer
<unknown>: Fatal IO error 11 (Risorsa temporaneamente non disponibile) on X server :0.0.

Quindi presumo che l'errore non sta nel programma radice.c di cui ora mostro il codice completo:

Codice: Seleziona tutto

#include <stdio.h>
#include <math.h>

#define ERR 0.00001

main()
{
 char *indice[]={"quadrata","cubica","quarta","quinta","sesta","settima","ottava","nona","decima"};
 float a,b,m,x;
 float fm,pot;
 int n,i,res;
 printf("\n// il programma calcola la radice\n// di un qualunque numero reale 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("%f",&x);
     while(getc(stdin)!='\n');
 } while(res==0);
 if (n%2==0 && x<0) printf("\nil valore inserito non è valido poichè non fa parte dell'insieme di definizione della radice\n");  
 else if (n==1) printf("\nla radice prima di %g è %g\n",x,x);
      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 if (x<-1) {
                          a=x; b=-1;
                      }
                      else {
                            a=-1; 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 %g è %g\n\n",indice[n-2],x,m);                     
           }
 char cmd[100];
 float f = 1/(float)n;
 sprintf(cmd,"echo "plot x**(%f)" | gnuplot -persist",f);
 system(cmd); 
}
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c]utilizzare gnuplot

Messaggio da Zoff »

Infatti a me funziona ;D
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Ho scoperto che è un bug del pacchetto gnuplot: https://bugs.launchpad.net/ubuntu/+source/gnuplot/+bug/239466, e quindi per risolvere basterebbe compilare il programma da sorgenti. Anche se non capisco come mai questo accade anche senza effetti visivi abilitati  :-\
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Nella guida di gnuplot è scritto:
Il comando plot traccia automaticamente il grafico della funzione per x ∈ [−10; 10] e adattando
l’asse delle y ai valori cos` ottenuti. Molte volte abbiamo per` la necessit` di tracciare il grafico
                            ı                                  o          a
per valori di x diversi da quelli di default. Se x1,x2,y1,y2 sono numeri reali un primo modo
per ottenere il risultato voluto ` quello di utilizzare plot con la seguente sintassi:
                                  e
plot[x1:x2][y1:y2]f(x) viene specificato sia dominio che codominio
plot[x1:x2]f(x) viene specificato solo il dominio
plot[][y1:y2]f(x) viene speciticato solo il codominio
come potrei adattare il grafico al valore di x che immetto da tastiera nel programma?  ???
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Sono riuscito a centrare il grafico rispetto al valore di x in ascissa, inserendo un range 'delta'.  (good)

Il codice è questo:

Codice: Seleziona tutto

#include <stdio.h>
#include <math.h>

#define ERR 0.00001

main()
{
 char *indice[]={"quadrata","cubica","quarta","quinta","sesta","settima","ottava","nona","decima"};
 float a,b,m,x;
 float fm,pot;
 int n,i,res;
 printf("\n// il programma calcola la radice\n// di un qualunque numero reale 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("%f",&x);
     while(getc(stdin)!='\n');
 } while(res==0);
 if (n%2==0 && x<0) printf("\nil valore inserito non è valido poichè non fa parte dell'insieme di definizione della radice\n");  
 else if (n==1) printf("\nla radice prima di %g è %g\n",x,x);
      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 if (x<-1) {
                          a=x; b=-1;
                      }
                      else {
                            a=-1; 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 %g è %g\n\n",indice[n-2],x,m);                     
           }
 char cmd[100];
 float f = 1/(float)n;
 sprintf(cmd,"echo \"plot[(%f)-10:(%f)+10]x**(%f)\" | gnuplot -persist",x,x,f);
 system(cmd); 
}
Però si presenta quest'errore in certi casi quando inserisco un valore di x oppure non mi con indice della radice dispari, oppure non mi adatta l'asse delle y e quindi non riesco a vedere il grafico nella zona interessata:

Codice: Seleziona tutto

cristiancozzolino@ubuntu:~/programmazione$ ./radice

// il programma calcola la radice
// di un qualunque numero reale scelto dall'utente
// con indice intero immesso da tastiera

Inserire un indice valido per la radice(un numero intero da 1 a 10): 3
Inserire un valore reale di cui calcolare la radice: -45

la radice cubica di -45 è -3.55689


gnuplot> plot[(-45.000000)-10:(-45.000000)+10]x**(0.333333)
                                                           ^
         line 0: all points y value undefined!

cristiancozzolino@ubuntu:~/programmazione$ 
::)

Poi c'è un altro vecchio problema che non riesco a risolvere.
Se per esempio digito:

Codice: Seleziona tutto

cristiancozzolino@ubuntu:~/programmazione$ ./radice

// il programma calcola la radice
// di un qualunque numero reale 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: 1000000
il programma si impalla e non mi restituisce il risultato. come posso risolvere?  ::)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

per quanto riguarda l'errore:

Codice: Seleziona tutto

         line 0: all points y value undefined!
mi hanno detto che sembra che manchi il parametro y.

Ma il parametro y non dovrebbe calcolarlo gnuplot data la formula inclusa nel comando e disegnando la funzione?

A questo punto non capisco  ::)

Avete un'idea per la soluzione di questo problema?  :D
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Poi c'è un altro vecchio problema che non riesco a risolvere.
Se per esempio digito:
Codice:

cristiancozzolino@ubuntu:~/programmazione$ ./radice

// il programma calcola la radice
// di un qualunque numero reale 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: 1000000

il programma si impalla e non mi restituisce il risultato. come posso risolvere?  Roll Eyes
Riguardo questo problema, mi hanno detto che il codice va beneissimo, ma allora non so perchè si blocca.  :-\
Sul fatto di sostituire i float con dei double mi hanno detto che probabilmente il problema non è quello.

Tu cosa ne pensi, Zoff?  ???
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Ho risolto apparentemente il problema di prima sostituendo i float con dei long double:

Codice: Seleziona tutto

#include <stdio.h>
#include <math.h>

#define ERR 0.00001

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;
 printf("\n// il programma calcola la radice\n// di un qualunque numero reale 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("%lf",&x);
     while(getc(stdin)!='\n');
 } while(res==0);
 if (n%2==0 && x<0) printf("\nil valore inserito non è valido poichè non fa parte dell'insieme di definizione della radice\n");  
 else if (n==1) printf("\nla radice prima di %lg è %lg\n",x,x);
      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 if (x<-1) {
                          a=x; b=-1;
                      }
                      else {
                            a=-1; 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 %lg è %lg\n\n",indice[n-2],x,m);                     
           }
 char cmd[100];
 float f = 1/(float)n;
 sprintf(cmd,"echo \"plot[(%f)-10:(%f)+10]x**(%f)\" | gnuplot -persist",x,x,f);
 system(cmd); 
}
Il problema è che ottengo dei risultati strani:

Codice: Seleziona tutto

cristiancozzolino@ubuntu:~/programmazione$ ./radice

// il programma calcola la radice
// di un qualunque numero reale 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: 1000000

la radice quinta di 1e+06 è 1.52486e-314

Warning: empty y range [1:1], adjusting to [0.99:1.01]
cristiancozzolino@ubuntu:~/programmazione$ 
sia nel risultato della radice che nel messaggio relativo a gnuplot. Allego anche uno screenshot.

Secondo voi quale può essere il motivo e come si può risolvere tutto?  ??? ::) :-\
Allegati
Schermata-Gnuplot (window id : 0).png
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Adesso sostituendo l con L il risultato è giusto:

Codice: Seleziona tutto

cristiancozzolino@ubuntu:~/programmazione$ ./radice

// il programma calcola la radice
// di un qualunque numero reale 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: 1000000

la radice quinta di 1e+06 è 15.8489

Segmentation fault
cristiancozzolino@ubuntu:~/programmazione$ 
Ora il problema è che il grafico neanche appare più! Infatti si è verificato un 'segmentation fault'.
A cosa è dovuto e come si può risolvere?   ::)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Se eseguo lo stesso comando nel terminale ottengo:

Codice: Seleziona tutto

cristiancozzolino@ubuntu:~$ gnuplot

	G N U P L O T
	Version 4.2 patchlevel 2 
	last modified 31 Aug 2007
	System: Linux 2.6.24-23-generic

	Copyright (C) 1986 - 1993, 1998, 2004, 2007
	Thomas Williams, Colin Kelley and many others

	Type `help` to access the on-line reference manual.
	The gnuplot FAQ is available from http://www.gnuplot.info/faq/

	Send bug reports and suggestions to <http://sourceforge.net/projects/gnuplot>


Terminal type set to 'wxt'
gnuplot> plot[1000000-10:1000000+10]x**(1/5)
Warning: empty y range [1:1], adjusting to [0.99:1.01]
e stavolta il grafico appare, ma è una linea orizzontale  :o

Perchè nel programma in c ottengo un segmentation fault e qui no?
E soprattutto cosa significa l'ultimo output e perchè ottengo una linea orizzontale?


Poi ho riprovato a lanciare di nuovo il programma in c:

Codice: Seleziona tutto

cristiancozzolino@ubuntu:~/programmazione$ ./radice

// il programma calcola la radice
// di un qualunque numero reale 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: 1000000

la radice quinta di 1000000 è 15.8489

Warning: empty y range [1:1], adjusting to [0.99:1.01]
*** stack smashing detected ***: ./radice terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xb7f1d138]
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7f1d0f0]
./radice[0x80489f1]
[0x32313239]
======= Memory map: ========
08048000-08049000 r-xp 00000000 fe:00 9166881    /home/cristiancozzolino/programmazione/radice
08049000-0804a000 rw-p 00000000 fe:00 9166881    /home/cristiancozzolino/programmazione/radice
0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
b7e2f000-b7e30000 rw-p b7e2f000 00:00 0 
b7e30000-b7f79000 r-xp 00000000 fe:00 1196056    /lib/tls/i686/cmov/libc-2.7.so
b7f79000-b7f7a000 r--p 00149000 fe:00 1196056    /lib/tls/i686/cmov/libc-2.7.so
b7f7a000-b7f7c000 rw-p 0014a000 fe:00 1196056    /lib/tls/i686/cmov/libc-2.7.so
b7f7c000-b7f7f000 rw-p b7f7c000 00:00 0 
b7f85000-b7f8f000 r-xp 00000000 fe:00 1197542    /lib/libgcc_s.so.1
b7f8f000-b7f90000 rw-p 0000a000 fe:00 1197542    /lib/libgcc_s.so.1
b7f90000-b7f94000 rw-p b7f90000 00:00 0 
b7f94000-b7f95000 r-xp b7f94000 00:00 0          [vdso]
b7f95000-b7faf000 r-xp 00000000 fe:00 1197543    /lib/ld-2.7.so
b7faf000-b7fb1000 rw-p 00019000 fe:00 1197543    /lib/ld-2.7.so
bfb4f000-bfb64000 rw-p bffeb000 00:00 0          [stack]
Aborted
cristiancozzolino@ubuntu:~/programmazione$ 

stavolta appare la finestra di gnuplot ma è sempre una retta orizzontale di valore 1

Come mai?  ::) ??? :-\
Allegati
Schermata-Gnuplot (window id : 0)-1.png
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Ho provato a cercare in internet il significato dell'ultimo messaggio:

Codice: Seleziona tutto

// il programma calcola la radice
// di un qualunque numero reale 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: -45

la radice quinta di -45 è -2.14113

Warning: empty y range [1:1], adjusting to [0.99:1.01]
e nelle FAQ di gnuplot è scritto:
7.3 Why does gnuplot ignore my very small numbers?

Gnuplot treats all numbers less than 1e-08 as zero, by default. Thus, if you are trying to plot a collection of very small numbers, they may be plotted as zero. Worse, if you're plotting on a log scale, they will be off scale. Or, if the whole set of numbers is "zero", your range may be considered empty:

gnuplot> plot 'test1'
Warning: empty y range [4.047e-19:3e-11], adjusting to [-1:1]
ma sia i numeri che riguardano x che y, non possono essere considerati zero!

che cosa significa tutto questo?  ::)
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Ciao Zoff,
a quel punto non sapevo proprio perchè avevo quegli strani errori e avevo pensato di utilizzare questo: http://ndevilla.free.fr/gnuplot/gnuplot_i/index.html anchese se mi pareva un po' complicato da usare  >:(

Però oggi ho pensato: e se faccio il casting a float della x (dichiarata e usata come long double) nel comando passato a gnuplot forse riesco a risolvere il problema:

Codice: Seleziona tutto

sprintf(cmd,"echo \"plot[(%f)-10:(%f)+10]x**(%f)\" | gnuplot -persist",(float)x,(float)x,f);
e infatti come volevasi dimostrare riesco a disegnare la funzione.

Il sorgente del programma:

Codice: Seleziona tutto

#include <stdio.h>
#include <math.h>

#define ERR 0.00001

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 qualunque numero reale 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 (n%2==0 && x<0) printf("\nil valore inserito non è valido poichè non fa parte dell'insieme di definizione della radice\n");  
 else 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 if (x<-1) {
                          a=x; b=-1;
                      }
                      else {
                            a=-1; 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 \"plot[(%f)-10:(%f)+10]x**(%f)\" | gnuplot -persist",(float)x,(float)x,f);
 system(cmd); 
}
Ora però rimane un unico problema. Non mi viene disegnata la parte negativa del grafico quando digito un numero negativo con radice a indice dispari (per l'indice pari ho già un messaggio che mi dice che non fa parte dell'insieme di definizione).  :)

Codice: Seleziona tutto

cristiancozzolino@ubuntu:~/programmazione$ ./radice

// il programma calcola la radice
// di un qualunque numero reale scelto dall'utente
// con indice intero immesso da tastiera

Inserire un indice valido per la radice(un numero intero da 1 a 10): 3
Inserire un valore reale di cui calcolare la radice: -5

la radice cubica di -5 è -1.70998

cristiancozzolino@ubuntu:~/programmazione$ 

Allego uno screenshot:
Immagine
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
Eccomiqui
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1401
Iscrizione: lunedì 13 novembre 2006, 9:27

Re: [c]utilizzare gnuplot

Messaggio da Eccomiqui »

cristian_c ha scritto: nelle faq di gnuplot si fa riferimento a questo:
5.2 Can I use gnuplot routines for my own programs?

On systems supporting pipes, you can pipe commands to gnuplot from other programs. Many applications with gnuplot as the graphics engine, like Octave (http://www.octave.org), uses this method. This also works from a cgi script to drive gnuplot from a forms-based web page.

John Campbell (jdc@nauvax.ucc.nau.edu) modified a much earlier version of gnuplot (3.5) to be a library of C subroutines callable from a C program. Gnuplot itself has changed radically since then, and we are not aware of any plans to create a similar library based on the current version.
come si fa ad attuare quello che è scritto qui sopra?  ???
Ciao! Riprendo in mano questa interessantissima discussione per chiedere se qualcuno ha provato ad usare le librerie di cui si parla qui sopra (quelle sviluppate da John Campbell) per utilizzare gnuplot da C. Le soluzioni che ho visto nella discussione, infatti, mi pare che utilizzino solo le pipe.
O per lo meno se qualcuno sa dove si trovano le librerie con la documentazione.
Grazie
I hate this stupid machine: it never does what I want, just what I tell it.
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

Eccomiqui ha scritto:
cristian_c ha scritto: nelle faq di gnuplot si fa riferimento a questo:
5.2 Can I use gnuplot routines for my own programs?

On systems supporting pipes, you can pipe commands to gnuplot from other programs. Many applications with gnuplot as the graphics engine, like Octave (http://www.octave.org), uses this method. This also works from a cgi script to drive gnuplot from a forms-based web page.

John Campbell (jdc@nauvax.ucc.nau.edu) modified a much earlier version of gnuplot (3.5) to be a library of C subroutines callable from a C program. Gnuplot itself has changed radically since then, and we are not aware of any plans to create a similar library based on the current version.

come si fa ad attuare quello che è scritto qui sopra?  ???
Ciao! Riprendo in mano questa interessantissima discussione per chiedere se qualcuno ha provato ad usare le librerie di cui si parla qui sopra (quelle sviluppate da John Campbell) per utilizzare gnuplot da C. Le soluzioni che ho visto nella discussione, infatti, mi pare che utilizzino solo le pipe.
O per lo meno se qualcuno sa dove si trovano le librerie con la documentazione.
Grazie
è qui la documentazione: http://ndevilla.free.fr/gnuplot/gnuplot_i/gnuplot__i_8c.html
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
kiroken_
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2008
Iscrizione: mercoledì 2 maggio 2007, 17:38

Re: [c]utilizzare gnuplot

Messaggio da kiroken_ »

se usi un vero pipeline puoi usare dinamicamente la stessa istanza di gnuplot come se la stessi usando da shell dando il comando

Codice: Seleziona tutto

gnuplot
ora però non ricordo qual'è la funzione per implementare un pipeline.
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
Avatar utente
cristian_c
Accecante Asceta
Accecante Asceta
Messaggi: 23422
Iscrizione: lunedì 29 ottobre 2007, 11:31

Re: [c]utilizzare gnuplot

Messaggio da cristian_c »

kiroken ha scritto: se usi un vero pipeline puoi usare dinamicamente la stessa istanza di gnuplot come se la stessi usando da shell dando il comando

Codice: Seleziona tutto

gnuplot
ora però non ricordo qual'è la funzione per implementare un pipeline.
system o echo, a seconda di cosa intendi  :-\
UP! Unreal Project: il futuro inizia qui. Crusade è tra noi
È scienza!
Avatar utente
kiroken_
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2008
Iscrizione: mercoledì 2 maggio 2007, 17:38

Re: [c]utilizzare gnuplot

Messaggio da kiroken_ »

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.
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti