公開プログラムのページ (ゴミ箱?おもちゃ箱?)

Last modified: Wed Dec 30 02:34:15 2020

 授業・卒研等で使っているプログラムを公開します。 動作環境等は、かなり個人的な事情に依存しています (具体的には Solaris, FreeBSD, Cygwin, Linux, Mac OS X などを使って来ました)。

 色々ためこんでいるので、整理がつき次第、 順次このページに載せていきます (というのは建前で、 「以前作ったものが必要になった」で発掘したときにここに載せる、 が真実に近い)。 整理しないといけないとは思うのですが……

 中身については、かなりの部分 『卒研ノート』 にある文書で説明しています。

 プログラムの多くは、これまでは文字コードとして日本語 EUC を使ってましたが、 UTF-8 に移行しました。 適当なものに変換して使って下さい。 例えば nkf を使って UTF8 にするには、

      nkf --overwrite -w なんとか.c
  
という調子です。 私はシェルで次のような別名定義をして utf8 コマンドを定義しています。
      alias utf8='nkf --overwrite -w'
  

補助的なライブラリィ (古めかしい)

  1. C言語でベクトル、行列を扱うためのライブラリィ matrix library です。行列を double へのポインタのポインタとして宣言します。
  2. UNIX+X11環境下で、C言語やFortran言語で書かれたプログラムで、 簡単な線画を描くためのライブラリィ fplot-v1.6です。
    使い方については 『図形描画ライブラリィ fplot』 を見て下さい。
  3. GLSC に matrix library の matrix を渡すと便利なので、 二三の関数 (g_contln2, g_f_hidden2, g_hidden2) を作りました。 (g_contln, g_f_hidden, g_hidden をかすかに書き換えただけです。) glsc+.tar.gz に入っています。
  4. gnuplot を用いて円盤領域で定義された関数の可視化を行なうプログラ ムです。完成度が低いのですが、必要性が高いので、 とりあえず置いておきます。 call_gnuplot.ccall_gnuplot.h と サンプル・プログラム polar4.c

連立1次方程式

 プログラム中でやっているのは、常識的なことですが、 説明を読みたければ 「連立1次方程式I --- 計算量と直接法 ---」 などを見て下さい。

  1. 3項方程式 (三重対角行列を係数とする連立1次方程式) を Gauss の消去法で LU 分解して解くための C の関数のソース trid-lu.c, trid-lu.h です。
    添字が 1 から始まるバージョン trid-lu1.c, trid-lu1.h も置いておきます。
    なお、2000年11月以前の版 trid-lu-old.c, trid-lu-old.h も置いておきます (こちらはほんの少し効率が低いです)。
  2. Gauss の消去法による LU 分解に基づく、連立1次方程式 (一般の行列を係数とする) を解くための関数のソース general-lu-c.tar.gz です。 アルゴリズムは、 Forsythe and Moler の名著「計算機のための数値計算法」 に載っているものです。行列の扱いは matrix library を使っています。
  3. 帯行列を LU 分解するプログラム luband3.c, luband3.h
  4. 対称帯行列用の LU 分解プログラム symbandlu.c, symbandlu.h です。 菊地文雄先生の『有限要素法概説』中の説明から作成した C プログラムです。
  5. 円盤領域内の熱方程式を半陰公式や ADI 法で解く時に現れる 連立一次方程式を LU 分解で解くプログラム ptrilu.c, ptrilu.h です。

空間1次元の熱方程式

 全部載せると学生の演習にならないので、 非同次境界条件の場合など、わざと載せていません :-)

  1. 空間1次元の熱方程式 (同次Dirichlet 境界条件) を差分法 (陽解法) で解くための C のプログラム heat1d-e-ng.c (グラフィックスなし) です。 グラフィックスがないので、 どんな C コンパイラーでもコンパイルできるでしょう。 「一番簡単なプログラム」をねらいました。
  2. 空間1次元の熱方程式 (同次Dirichlet 境界条件) を差分法 (陽解法) で 解くための C のプログラム heat1d-e-glsc.c (GLSC版), heat1d-e.c (fplot版), heat1d-eggx.c (EGGX版), heat1d-glscwin.c (glscwin版), heat1d-glsc3d.c (GLSC3D版) です。
  3. 空間1次元の熱方程式 (同次Dirichlet 境界条件) を差分法 (θ法) で解くための C のプログラム heat1d-i-glsc.c (GLSC版), heat1d-i.c (fplot版), heat1d-i-eggx.c (EGGX版), heat1d-i-glscwin.c (glscwin版), heat1d.BAS (十進BASIC), heat1d-i-glsc-eigen-sparse.cpp (GLSC, Eigenの SparseMatrix) です。
  4. 空間1次元の熱方程式 (同次Neumann 境界条件) を差分法 (θ法) で解くための C のプログラム heat1n-i-glsc.c (GLSC版), heat1n-i.c (fplot版), heat1n.BAS (十進BASIC), heat1n-i-glsc-eigen-sparse.cpp (GLSC, Eigenの SparseMatrix) です。
  5. 「差分法関係のプログラムの説明 その1」 heat1d-e-glsc.c, heat1d-i-glsc.c, heat1n-i-glsc.c の簡単な説明です。
  6. 空間1次元の熱方程式で、 境界条件を Robin, Dirichlet 両方扱えるようにしたもの。 完成度は今一つですが (図を描くようにもなっていない)、 サンプルということで。 heat1g.c (後退Euler), heat1g-v2.c (θ法)
  7. グラフィックスがない Java プログラムなんて… 空間1次元の熱方程式 (同次Dirichlet 境界条件) を差分法 (θ法) で解くための Java プログラム heat1d_i_ng.java です。
    Cay Horstmann の Format.java を使っています。
  8. ある年の卒業研究の成果、 Java による熱方程式のシミュレーション・プログラム (by 大葉敏史&佐藤晴郎) です (古くて最近のブラウザ環境では動きませんが…)。
    ソースプログラム (Windows 向け、zipフォーマット) , ソースプログラム (UNIX 向け、tar.gzフォーマット)
  9. 『どこでも1次元熱方程式の差分法シミュレーション』

空間2次元熱方程式

  1. 空間2次元の熱方程式 (長方形領域, 同次Dirichlet 境界条件) を差分法 (陽解法) で解くための C のプログラム heat2d-e.c です。 図を描くために GLSC ライブラリィを使っています。 以前は差分解を記憶する 2 重添字数列を扱うために、 上記 matrix library を使っていましたが、 smallmatrix.h をインクルードすれば良いように変更しました (2020/12/29)。
  2. 空間2次元の熱方程式 (長方形領域, 同次Dirichlet 境界条件) を差分法 (陰解法) で解くための C のプログラム heat2d-i-naive.c です。 おそろしく効率が悪いので、 これをそのまま使おうなどと思わないで下さい (叩き台にしてもらうつもり)。 図を描くために GLSC ライブラリィを使っています。 連立1次方程式を解くために上で紹介した lu.clu.h を使っています (実はバグがあったので直しました 1999/1/12)。
    これも smallmatrix.h を使うように直しました (2020/12/29)。
  3. 上記 heat2d-i-naive.c では、 境界上の格子点における値も未知数として扱っていましたが、 これを省いた heat2d-i-naive2.c です (本質的な改善ではありません)。
    これも smallmatrix.h を使うように直しました (2020/12/29)。
  4. 上記 heat2d-i-naive.c を、帯行列用 LU 分解を利用するように改めた heat2d-i-band3.c です。帯行列用のLU分解プログラムとしては、上でも紹介した luband3.cluband3.h を使っています。卒研の学生 石川邦臣君の仕事です。 これまでとは段違いに速く動きます。
    これも smallmatrix.h を使うように直しました (2020/12/29)。
  5. 上で説明した対称帯行列用の LU 分解プログラム symbandlu.c, symbandlu.h を利用した、 空間2次元の熱方程式 (長方形領域, 非同次 Dirichlet 境界条件) を差分法で解くための heat2d-i.c です。 ある意味で終着点です (連立1次方程式を直接法で解くのに、 ほぼ無駄がないプログラムになっている)。smallmatrix.h を使うように直しました (2020/12/29)。
  6. heat2d-i.c を見直して、matrix library, symbandlu.c など必要のない、 単一のソース・ファイルのプログラムにしました。 オリジナルのGLSCで動きます。(2017/3/5)
    現象数理学科 Mac 向けに簡単にコンパイル・実行出来るように、ということ。 ちなみにどれでもスピードにあまり差はない。 今のところ LLVM より gcc の方が速い (原因不明)。 そのうち cglsc++ とか用意しよう。
  7. heat2d-i.c の系列で、現時点で一番速いバージョン heat2d-i-eigen-sparse.cpp
    EigenのSparseMatrixのソルバー SimplicialLDLT (Cholesky分解) を使って 連立1次方程式を解いている (2017/3/9)。
  8. MATLABのプログラム例 heat2d.m, heat2d_mat.m, 解説
  9. 空間2次元の熱方程式 (長方形領域, 非同次Neumann 境界条件) を差分法 で解くための素朴なプログラム heat2n-i-naive.c です。 連立1次方程式を解くために上で紹介した lu.clu.h を使っています。
    これも smallmatrix.h を使うように直しました (2020/12/30)。
  10. 上で説明した対称帯行列用の LU 分解プログラム symbandlu.c, symbandlu.h を利用した、 空間2次元の熱方程式 (長方形領域, 非同次 Neumann 境界条件) を差分法で解くための heat2n-i.c です。十分効率的です。
    これも smallmatrix.h を使うように直しました (2020/12/30)。
  11. heat2n-i.c の系列で、現時点で一番速いバージョン heat2n-i-eigen-sparse.cpp
    EigenのSparseMatrixのソルバー SimplicialLDLT (Cholesky分解) を使って 連立1次方程式を解いている (2017/3/13)。
  12. MATLABのプログラム例 heat2n.m, heat2n_mat.m, 解説
  13. 空間2次元の熱方程式 (長方形領域, 非同次 Dirichlet 境界条件) を差分法 (ADI法) で解くための C のプログラム heat2d-adi.c です。 図を描くために GLSC ライブラリィ, 連立1次方程式を解くために、 三重対角行列を LU 分解する関数を収めた trid-lu1.c, trid-lu1.h を使っています (少しの書き換えで trid-lu.c, trid-lu.h でも使えます)。
    これも smallmatrix.h を使うように直しました (2020/12/30)。
  14. 空間2次元の熱方程式 (長方形領域, 非同次 Neumann 境界条件) を差分法 (ADI法) で解くための C のプログラム heat2n-adi.c です。 heat2d-adi.c の Neumann 境界条件版です。 連立1次方程式を解くために、 三重対角行列を LU 分解する関数を収めた trid-lu.c, trid-lu.h を使っています。
    これも smallmatrix.h を使うように直しました (2020/12/30)。 実は長いことメモリ管理関係のバグがあったのに気づかず、 ようやく直しました (2020/12/30)。
  15. 円盤領域における熱方程式を解く C プログラム fdm-in-disk.tar.gz
    matrix library を使っています。 popen() で gnuplot を呼び出して可視化しています。
  16. 円盤について、可視化は相変わらずいいかげんですが、 計算は見直しました (2004/10/24)。

波動方程式

 Shortley-Weller 近似で楕円領域における波動方程式を解いたのを載せてないとか、 宿題がたまっている…

  1. 空間1次元の波動方程式 (同次Dirichlet 境界条件) を差分法で解くための 十進BASICプログラム wave1d.BASです (2012/12/10)。
  2. 空間1次元の波動方程式 (同次Neumann 境界条件) を差分法で解くための 十進BASICプログラム wave1n.BASです (2012/12/10)。
  3. C+GLSC を使った wave1d-glsc-v2.cwave1n-glsc-v2.c です (2013/12/6)。
    現在は g_sleep() を使えるので必要がなくなりましたが、 以前は時間待ちのために関数 msleep() を使っていました。 これは UNIX の常識というか、関数呼び出し一発ですが、 簡単に暗記できるものでもないので、 ソースプログラムをここに置いておきます msleep.c
  4. (参考、古いプログラム) 空間1次元の波動方程式 (同次Dirichlet 境界条件) を差分法で解くための C プログラム wave1d-glsc.c
    空間1次元の波動方程式 (同次Neumann 境界条件) を差分法で解くための C プログラム wave1n-glsc.c (仮想格子点近似) です。
    昔は GLSC を使わないものや、 仮想格子点矜持をしないも載せていましたが、 やめました。
  5. 少し更新しました (初期条件を増やす等)。 wave1-glsc.c, wave1-initial.c (2007/12)
  6. wave2d.c

  1. readwave.c
  2. writewave.c
  3. ReadWave.java
  4. MakeWaveFile.java

棒の振動

 (準備中)

板の振動

 まだ整理されていないけれど、 Numerical Analysis of Chladni figures にいくつか載せてある。



数学科の卒研の学生が作ったプログラム

お勧めプログラム

 私以外の人達の作った、お勧めのプログラムです。


明治大学理工学部数学科
〒214-8571 神奈川県川崎市多摩区東三田1-1-1
第二校舎6号館6、7階
Tel. 044-934-7456
FAX. 044-934-7913

mk@math.meiji.ac.jp (@はASCIIの@)