3 C言語プログラミングの練習

C言語プログラミングの練習をした方が良いかな?と考えています。

「C言語これくらい覚えよう」
「練習問題」
の 4.1 「比較的簡単なもの」を解いてみて下さい。


1〜2時間程度取り組んでみて、出来たプログラムを送る、 というのを宿題にしようと考えています。


(2020/11/20 プログラム追記)

ターミナルで適当なディレクトリィにファイルをコピー
mkdir zemi                   (例えば)
cd zemi
curl -O http://nalab.mind.meiji.ac.jp/~mk/program/fdm/heat1d-e-glsc.c
curl -O http://nalab.mind.meiji.ac.jp/~mk/program/fdm/heat1d-i-glsc.c
curl -O http://nalab.mind.meiji.ac.jp/~mk/program/fdm/heat1n-i-glsc.c
curl -O http://nalab.mind.meiji.ac.jp/~mk/labo/text/heat-fdm-0.pdf

最後の heat-fdm-0.pdf は「発展系の数値解析」という文書である。 4節「数値実験例」と5節「陰解法」の数値計算を再現してみよう。

heat1d-e-glsc.c を試す
($ はプロンプトで入力はしない。)
$ cglsc heat1d-e-glsc.c
$ ./heat1d-e-glsc.c
区間の分割数 N = 20
λ (=τ/h^2) = 0.5
τ=0.00125
最終時刻 Tmax = 1
終りました。X の場合はウィンドウをクリックして下さい。

heat1d-i-glsc.c を試す
$ cglsc heat1d-e-glsc.c
$ ./heat1d-e-glsc
区間の分割数 N = 20
λ (=τ/h^2) = 0.5
τ=0.00125
最終時刻 Tmax = 1
終りました。X の場合はウィンドウをクリックして下さい。
bash-3.2$ cglsc heat1d-i-glsc.c
bash-3.2$ ./heat1d-i-glsc
入力して下さい : nfunc(1..5)=1
入力して下さい : θ=0
入力して下さい : N=40
入力して下さい : λ=0.5
 時間の刻み幅τ= 0.0003125 になりました。
入力して下さい : 最終時刻 Tmax=1
入力して下さい : グラフ書き換え時間間隔(Δt)=0.01
T=   0.0000e+00
  I     u(i)      I     u(i)      I     u(i)      I     u(i)      I     u(i)
  0  0.0000e+00   1  2.5000e-02   2  5.0000e-02   3  7.5000e-02   4  1.0000e-01
  5  1.2500e-01   6  1.5000e-01   7  1.7500e-01   8  2.0000e-01   9  2.2500e-01
 10  2.5000e-01  11  2.7500e-01  12  3.0000e-01  13  3.2500e-01  14  3.5000e-01
 15  3.7500e-01  16  4.0000e-01  17  4.2500e-01  18  4.5000e-01  19  4.7500e-01
 20  5.0000e-01  21  4.7500e-01  22  4.5000e-01  23  4.2500e-01  24  4.0000e-01
 25  3.7500e-01  26  3.5000e-01  27  3.2500e-01  28  3.0000e-01  29  2.7500e-01
 30  2.5000e-01  31  2.2500e-01  32  2.0000e-01  33  1.7500e-01  34  1.5000e-01
 35  1.2500e-01  36  1.0000e-01  37  7.5000e-02  38  5.0000e-02  39  2.5000e-02
 40  0.0000e+00
マウスでウィンドウをクリックして下さい。
bash-3.2$

  1. heat1d-e-glsc.c の解説をする。
  2. 「発展系の数値解析」の p. 6 の (1) 解析解との比較を解説して、 p. 7 の表1と図2を再現する。
    heat1d-i-glsc.c を使うと良い。 図2を作るには、次のようなファイルを作ってから、 gnuplot を使うと良い。
      10 0.36654433 1.653709
      20 0.37118820 0.407728
      40 0.37232923 0.101583
      80 0.37261327 0.025374
     160 0.37268420 0.006342
     320 0.37270193 0.001585
     640 0.37270636 0.000396
    
    「gnuplot 入門」 の4節「数値データをプロットしよう」の2つ目 「対数グラフを描く」が参考になる。
  3. 「発展系の数値解析」のpp. 6-7 (2) 解の漸近挙動のうち、 ディリクレ境界条件の場合を説明して、p. 8 の図3〜8を再現する。 heat1d-i-glsc.cを使う。
  4. p. 9 の図9〜14と、p. 10の表2を再現する。 heat1n-i-glsc.cを使う。
  5. p. 12の 5陰解法(1)安定性を説明する。p. 13の図21〜24を再現する。
  6. pp. 13-15の(2)後退Euler法と(3)θ法・クランク・ニコルソン法を解説する。
  7. heat1d-i-glsc.c の解説をする。
桂田 祐史
2020-11-20