2010年8月6日金曜日

open その2

テストプログラムを作って見ました

これは,振り子が動く図をたくさん出力します
これをimagemagickのconvertを使って動画にします
たとえば,

convert -delay 10 IMGSEQUENCE/*.gif a.mpg
こんな感じです

ちょっと複雑になりました


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

int main(void) {
  FILE *gid, *data;
char *data_file, *k,kk[20],k1[10],k2[10],k3[10];
float dx, x, y,th,vth,al,dt;
int i, imax,j ,jmax,j1,j2,j3;
 imax=1;
 jmax=200;
  gid = popen("gnuplot -persist", "w");

    fprintf(gid, "set xrange [-2:2]\n");
fprintf(gid, "set yrange [-2:2]\n");
    fprintf(gid, "set term gif truecolor size 640,480\n");
data_file="out.dat";
  
  
     dx=0.4/imax;
dt=0.2;
al=0.1;
    x=0;
th=1;
vth=0;
for(j=0; j
j1=j%10;
j2=((j-j1)%100)/10;
j3=j/100;
sprintf(k1,"%d",j1);
sprintf(k2,"%d",j2);
sprintf(k3,"%d",j3);


sprintf(kk,"data/outdata%d",j);

data_file=kk;
    data = fopen(data_file,"w");
fprintf(data,"%f\t%f\n", 0.0 ,0.0);
 //    for(i=0; i<=imax; i++){
      th+=vth*dt;
 vth+=-al*th*dt;
 x=sin(th);
 y=-cos(th);
       fprintf(data,"%f\t%f\n",x, y);
       x+=dx;
//     }
 
     fclose(data);
   sprintf(k,"%d",i);
 //   printf("%s\n",k);
strcat(k,k3);
strcat(k,k2);
strcat(k,k1);
    fprintf(gid, "set output 'IMGSEQUENCE/sequence0%s.gif' \n",k);

    fprintf(gid,  " plot '%s' w l \n",kk);
    fprintf(gid, "set output \n");
};
  pclose(gid);
  return 0;
}

2010年8月4日水曜日

popen

popen・・・Gnuplotを用いてアニメを作成するときに使うC言語の関数
各自調べて勉強してみましょう!!

2010年7月14日水曜日

ポインタ・数値微分についてと次回への課題

ポインタ
ポインタを使ってファイルに書き込む作業(過去の記事参照)
ポインタ:メモリのアドレス
イメージはファイルの置いてある場所
ex 棚の右から3番目とか

数値微分
微分を差分に置き換える。
微分はf(x,t)=dx/dt
差分はxi+1-xi=f(x,t)Δt
     詳しくは過去記事に数式が記載されている。

次回の課題
二次元振り子(近似なし)を差分プログラムを作成。

2010年7月8日木曜日

昨日のプログラムは動きました

以下のプログラムは、ぼくの計算機ではコンパイルと実行ができました
ので、昨日のプログラムには、文字化けがあるような気がします
#include のあとが問題かもしれません
羽部

2010年7月7日水曜日

ファイルへの書き込み

<今日の内容>
・sinxのテーラー展開の復習
・得られたデータをファイルに書き込む
・Gnuplotでデータをプロットする

〜ファイルへの書き込み〜
「./a.out > ”ファイル名”」とすればリダイレクトされて、./a.outの内容がファイルに書き込まれる。

sinxの展開のプログラムでpow関数を用いた方がコンパイルできなかった。
→各自、原因を考えて来てください

プログラム
#include
#include
main()
{
int i, n;
double x;
double dx, s ,c1,c3,c5,c7,c9;
x=0.0e0;
n= 70;
dx = 0.1e0;
x = -dx ;
c1=1;
c3=c1/2/3;
c5=c3 / 4 /5;
c7 = c5 /6 /7;
c9 = c7 /8 /9;
for (i=1;i<=n; i++ ){
x = x + dx;
s = x -c3 *pow(x,3.0) + c5*pow(x,5.0) - c7 * pow(x,7.0)+c9* pow(x,9.0);
printf(" %d %f %e \n", i , x, s);
}
}

2010年2月8日月曜日

前回の続き













・ドリフト運動
 ドリフト運動について電荷にかかる合力や曲率半径などを考えて、ドリフト運動の理解を深めようとした。
 曲率半径について
  ds = 2πR *(dθ/2π)= R*dθ
 
  R * |de/ds| = 1 (e:速度の単位ベクトル)←相似比より

  |de/ds| * ds = dθ←上の2式でRを消去


・ドリフト運動(その2)
 x方向の初速を0にした場合をグラフで表した。

・ドリフト運動(その3)
 x方向の初速を−2.0にした場合をグラフで表した。

2010年2月1日月曜日

ドリフト運動を調べる(概要)

まず電場がかかっていない、普通のローレンツ力の場合を考えて比較する。

ローレンツ力は円運動
なぜなら速度と向心力の内積が0←向心力は速度に影響しない

円運動とローレンツ力のつりあいの式
mv^2/r = qvB
より
r=m/(qB)×v
等速円運動(r,vは定数)

ドリフト運動は向心力の他に電場による静電気力も働くので内積は0にならない。(←あとで証明)

速度vは時刻とともに変化する。←変化は電場による加速度の速度方向をみて

r=m/(qB)×v

より、速度が大きくなれば荷電粒子の回転半径が大きくなることが分かる。

2010年1月18日月曜日

gnuplotで各軸の感覚を調節する

グラフが正しい比率でかかれないと
物体の運動の軌跡が解析しにくいことがある。

これにはグラフで表示するxとyの範囲を適度に調節すればよい。
x軸の範囲を0以上0.6以下にしたいときは、
以下のコマンドをプロット前に実行しておく。
set xrange [ 0 : 0.6 ]
y軸についても同様に行えばよい。

gnuplotで各軸に名前をつける


gnuplotは標準では各軸にX軸、Y軸などの名前が表示されない。
gnuplotでデータをプロットする前に、次のコマンドを実行しておく。

set xlabel "x" 0.0,1.0

これでx軸の下に”x”と表示されるようになる。

ドリフト運動のグラフを1:1に直してみると…


磁場の加速度のx方向の成分が電場の加速度の方向と強めあうときは、グラフの接線方向の加速度が大きくなるので回転半径が大きくなる。また弱め合う場合は、グラフの接線方向の加速度が小さくなるので回転半径が小さくなる。この変化を繰り替えしていくと荷電粒子が全体としてy軸負の方向に移動しているようにみえる。

各時刻でグラフに内接する円の中心の座標がどのように移動していくかプロットすることで、何か分かるだろうか…?