Plottare direttamente su gnuplot

di il
2 risposte

Plottare direttamente su gnuplot

Ciao ragazzi, vi mostro subito il codice in questione

void rk4(double r0,double phi0,double dt,double tmax) {
    int num=0;
    FILE *fp[11];
    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.000001;
    k=5.19615+-dec;
    
    
    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;
        }
        fclose(fp[num]);
        num++;

    }
}
volevo sapere se fosse possibile far plottare i file di dati, plottare il primo per poi replottarre quelli successivi, direttamente su gnuplo, con magari un xrange[-10;10] yrange[-10:10], ma con soprattutto un set polar.

2 Risposte

  • Re: Plottare direttamente su gnuplot

    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.
  • Re: Plottare direttamente su gnuplot

    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;
    }
    
    
    
    
    
Devi accedere o registrarti per scrivere nel forum
2 risposte