spectrum ha scritto:
Scusa, ma non si capisce molto di quello che ti serve (almeno a mio avviso). Puoi spiegare un po' meglio ?
Se questo gnuplot che non so cosa sia prende parametri in command line, puoi provare a stamparli nello stdout, e a passarglieli in una pipe.
Tipo
tuoprog | gnuplot
tuoprog deve generare i dati nel formato gradito a gnuplot
Ovviamente questo in Linux.
Oppure dovrai scrivere i dati su un file da importare in gnuplot. Ovviamente anche qui puoi automatizzare con un script bash, sempre in Linux.
HO RISOLTO, POSTO LA SOLUZIONE MAGARI A QUALCUNI PUO' SERVIRE
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double fy(double r,double k)
{
return -sqrt(1-k*k*1/(r*r)*(1-2/r));
}
double fa(double r,double k)
{
return k/(r*r)*sqrt(1-2/r);
}
void rk4(double r0,double phi0,double dt,double tmax) {
int num=0;
FILE *fp[11];
FILE *gnu;
double t,r,phi,i,x,y,k,j,dec;
double y1,a1,y2,a2,y3,a3,y4,a4;
int n=(int)round(tmax/dt);
t=0;
r=r0;
phi=phi0;
dec=0.0000001;
k=5.19615;
gnu= popen("gnuplot -persist","w");
fprintf(gnu,"set xrange[-10: 20]\n");
fprintf(gnu,"set yrange[-10: 20]\n");
fprintf(gnu,"set polar\n");
fprintf(gnu,"set key off\n");
for(j=k;j>5.19614;j-=dec)
{
char str[12];
sprintf(str,"eps_%d.txt",num);
fp[num]= fopen(str, "w+");
t=0;
r=r0;
phi=phi0;
for(i=0;i<n;i++)
{
y1=fy(r,j)*dt;
y2=fy(r+y1*0.5,j)*dt;
y3=fy(r+y2*0.5,j)*dt;
y4=fy(r+y3,j)*dt;
a1=fa(r,j)*dt;
a2=fa(r+y1*0.5,j)*dt;
a3=fa(r+y2*0.5,j)*dt;
a4=fa(r+y3,j)*dt;
r+= (y1+2*y2+2*y3+y4)/6;
phi+=(a1+2*a2+2*a3+a4)/6;
x=r*cos(phi);
y=r*sin(phi);
fprintf(fp[num],"%g %g\n",r,phi);
t+=dt;
}
if (num==0) {
fprintf(gnu,"p 'eps_%d.txt' u 2:1 w l \n",num);
}else if(num>0){
fprintf(gnu,"rep 'eps_%d.txt' u 2:1 w l \n",num);
}
fclose(fp[num]);
num++;
}
pclose(gnu);
}
int main(int argc, char *argv[])
{
double k,r0,phi0,dt,tmax;
if(argc!=5)
{printf("errore.i parametri da fornire devono essere quattro:r0,phi0,dt,tmax");exit (0);}
r0=atof(argv[1]);
phi0=atof(argv[2]);
dt=atof(argv[3]);
tmax=atof(argv[4]);
/*printf("k=%g, r0=%g, phi0=%g, dt=%g, tmax=%g\n",k,r0,phi0,dt,tmax);*/
rk4(r0,phi0,dt,tmax);
return 0;
}