2012-02-22 7 views
2

私はLinux上でリアルタイムプロットをしようとしています。すべてがうまくいきます。プログラムが終了すると、しばらくの間CPU使用量が大きくなってしまいます。また、私はusleep(0.3秒のような)で非常に短い時間を使うので、なぜbashシェルがgnuplotインターフェースによって支配されているのかわからない。他のbashウィンドウでも開こうとするので、Ctrl + Cキーを使うことはできない。プログラムを停止します。gnuplotとusleep on C

usleepの代わりに使用できる機能はありますか?または、何か私はWindows上でgnuplotの支配を避けるために修正することができますか?

gp = popen("nice gnuplot -","w"); 

は多少お使いのシステムを食べてからgnuplotのを防ぐ​​が、あなたを持っています:

事前に感謝して

私の悪い英語のため申し訳ありませんが、私はここに

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
float s=10.; 
float r=28.; 
float b=8.0/3.0; 
/* Definimos las funciones */ 
float f(float x,float y,float z){ 
    return s*(y-x); 
} 
float g(float x,float y,float z){ 
    return x*(r-z)-y; 
} 
float h(float x,float y,float z){ 
    return x*y-b*z; 
} 
FILE *output; 
FILE *gp; 

int main(){ 
    gp = popen("gnuplot -","w"); 
    output = fopen("lorenzgplot.dat","w"); 
    float t=0.; 
    float dt=0.01; 
    float tf=30; 
    float x=3.; 
    float y=2.; 
    float z=0.; 
    float k1x,k1y,k1z, k2x,k2y,k2z,k3x,k3y,k3z,k4x,k4y,k4z; 
    fprintf(output,"%f %f %f \n",x,y,z); 
    fprintf(gp, "splot '/home/david/documents/lorenzgplot.dat' with lines \n"); 
/* Ahora Runge Kutta de orden 4 */ 
    while(t<tf){ 
     /* RK4 paso 1 */ 
     k1x = f(x,y,z)*dt; 
     k1y = g(x,y,z)*dt; 
     k1z = h(x,y,z)*dt; 
     /* RK4 paso 2 */ 
     k2x = f(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt; 
     k2y = g(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt; 
     k2z = h(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt; 
     /* RK4 paso 3 */ 
     k3x = f(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt; 
     k3y = g(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt; 
     k3z = h(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt; 
     /* RK4 paso 4 */ 
     k4x = f(x+k3x,y+k3y,z+k3z)*dt; 
     k4y = g(x+k3x,y+k3y,z+k3z)*dt; 
     k4z = h(x+k3x,y+k3y,z+k3z)*dt; 
     /* Actualizamos las variables y el tiempo */ 
     x += (k1x/6.0 + k2x/3.0 + k3x/3.0 + k4x/6.0); 
     y += (k1y/6.0 + k2y/3.0 + k3y/3.0 + k4y/6.0); 
     z += (k1z/6.0 + k2z/3.0 + k3z/3.0 + k4z/6.0); 
     /* finalmente escribimos sobre el archivo */ 

     fprintf(output,"%f %f %f \n",x,y,z); 
     fflush(output); 
     usleep(100000); 
     fprintf(gp, "replot \n"); 
     fflush(gp); 
     t += dt; 
    } 
    fclose(gp); 
    fclose(output); 
    return 0; 
} 

答えて

4

コードを考えてみましょうgnuplotを起動する前にrunge-kuttaコードを実行することを考えましたか?出力をファイルに書き出し、バックグラウンドジョブのgnuplotにファイルを送ります。

たとえば、これはすべてint型の1つのスクリプトになっています。例で

runge-kutta > rkfile.dat 
cat rkfile.dat | gnuplot - & 
wait 

at -k now <<! 
cd /path/to/rk 
nice ./my_rkscript.sh 
! 

これらのすべては、あなたの現在のインタラクティブな環境を食べてから仕事を維持する方法はいくつかあります。 このようにして、「窓」は結ばれていません。サンプルスクリプトでは、stderrのリダイレクションと、必要に応じて追加するその他の改善が必要です。

+0

ああ、ありがとう。プログラムは終了してもCPUを消費しません。うん、最初にRKuttaを実行する方が良いです、私はちょうどリアルタイムプロットがどのように働いたかをテストしていました。たぶん、コード内のループが値を計算するのに時間がかかる場合は、もっと便利です。最後の例については、私はそれらのコマンドをよく知っていませんが、私はそれらについて見ていきます、私は考えを持っています:) –