公開プログラムのページ (ゴミ箱?おもちゃ箱?)
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'
- C言語でベクトル、行列を扱うためのライブラリィ
matrix library
です。行列を double へのポインタのポインタとして宣言します。
- UNIX+X11環境下で、C言語やFortran言語で書かれたプログラムで、
簡単な線画を描くためのライブラリィ
fplot-v1.6です。
使い方については
『図形描画ライブラリィ fplot』
を見て下さい。
- GLSC に matrix library の matrix を渡すと便利なので、
二三の関数 (g_contln2, g_f_hidden2, g_hidden2) を作りました。
(g_contln, g_f_hidden, g_hidden をかすかに書き換えただけです。)
glsc+.tar.gz
に入っています。
- gnuplot を用いて円盤領域で定義された関数の可視化を行なうプログラ
ムです。完成度が低いのですが、必要性が高いので、
とりあえず置いておきます。
call_gnuplot.c と
call_gnuplot.h と
サンプル・プログラム
polar4.c
プログラム中でやっているのは、常識的なことですが、
説明を読みたければ
「連立1次方程式I --- 計算量と直接法 ---」
などを見て下さい。
- 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
も置いておきます (こちらはほんの少し効率が低いです)。
- Gauss の消去法による LU 分解に基づく、連立1次方程式
(一般の行列を係数とする) を解くための関数のソース
general-lu-c.tar.gz です。
アルゴリズムは、
Forsythe and Moler の名著「計算機のための数値計算法」
に載っているものです。行列の扱いは matrix library を使っています。
- 帯行列を LU 分解するプログラム
luband3.c,
luband3.h
- 対称帯行列用の LU 分解プログラム
symbandlu.c,
symbandlu.h
です。
菊地文雄先生の『有限要素法概説』中の説明から作成した C プログラムです。
- 円盤領域内の熱方程式を半陰公式や ADI 法で解く時に現れる
連立一次方程式を LU 分解で解くプログラム
ptrilu.c,
ptrilu.h
です。
全部載せると学生の演習にならないので、
非同次境界条件の場合など、わざと載せていません :-)
- 空間1次元の熱方程式 (同次Dirichlet 境界条件)
を差分法 (陽解法) で解くための C のプログラム
heat1d-e-ng.c (グラフィックスなし)
です。
グラフィックスがないので、
どんな C コンパイラーでもコンパイルできるでしょう。
「一番簡単なプログラム」をねらいました。
- 空間1次元の熱方程式 (同次Dirichlet 境界条件) を差分法 (陽解法) で
解くための C のプログラム
heat1d-e-glsc.c (GLSC版),
heat1d-e.c (fplot版),
heat1d-eggx.c (EGGX版),
heat1d-glscwin.c (glscwin版),
heat1d-glsc3d.c (GLSC3D版)
です。
- 空間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)
です。
- 空間1次元の熱方程式 (同次Neumann 境界条件)
を差分法 (θ法) で解くための C のプログラム
heat1n-i-glsc.c (GLSC版),
heat1n-i.c (fplot版),
heat1n.BAS (十進BASIC),
heat1n-i-glsc-eigen-sparse.cpp
(GLSC, Eigenの SparseMatrix)
です。
-
「差分法関係のプログラムの説明 その1」
heat1d-e-glsc.c,
heat1d-i-glsc.c,
heat1n-i-glsc.c の簡単な説明です。
- 空間1次元の熱方程式で、
境界条件を Robin, Dirichlet 両方扱えるようにしたもの。
完成度は今一つですが (図を描くようにもなっていない)、
サンプルということで。
heat1g.c (後退Euler),
heat1g-v2.c (θ法)
- グラフィックスがない Java プログラムなんて…
空間1次元の熱方程式 (同次Dirichlet 境界条件)
を差分法 (θ法) で解くための Java プログラム
heat1d_i_ng.java
です。
Cay Horstmann の Format.java を使っています。
- ある年の卒業研究の成果、
Java による熱方程式のシミュレーション・プログラム
(by 大葉敏史&佐藤晴郎)
です
(古くて最近のブラウザ環境では動きませんが…)。
ソースプログラム (Windows 向け、zipフォーマット)
,
ソースプログラム (UNIX 向け、tar.gzフォーマット)
-
『どこでも1次元熱方程式の差分法シミュレーション』
- 空間2次元の熱方程式 (長方形領域, 同次Dirichlet 境界条件)
を差分法 (陽解法) で解くための C のプログラム
heat2d-e.c です。
図を描くために GLSC ライブラリィを使っています。
以前は差分解を記憶する 2 重添字数列を扱うために、
上記 matrix library を使っていましたが、
smallmatrix.h
をインクルードすれば良いように変更しました (2020/12/29)。
- 空間2次元の熱方程式 (長方形領域, 同次Dirichlet 境界条件)
を差分法 (陰解法) で解くための C のプログラム
heat2d-i-naive.c です。
おそろしく効率が悪いので、
これをそのまま使おうなどと思わないで下さい
(叩き台にしてもらうつもり)。
図を描くために GLSC ライブラリィを使っています。
連立1次方程式を解くために上で紹介した
lu.c とlu.h
を使っています (実はバグがあったので直しました 1999/1/12)。
これも
smallmatrix.h
を使うように直しました (2020/12/29)。
- 上記 heat2d-i-naive.c では、
境界上の格子点における値も未知数として扱っていましたが、
これを省いた
heat2d-i-naive2.c
です (本質的な改善ではありません)。
これも
smallmatrix.h
を使うように直しました (2020/12/29)。
- 上記 heat2d-i-naive.c を、帯行列用 LU 分解を利用するように改めた
heat2d-i-band3.c
です。帯行列用のLU分解プログラムとしては、上でも紹介した
luband3.cと
luband3.h
を使っています。卒研の学生 石川邦臣君の仕事です。
これまでとは段違いに速く動きます。
これも
smallmatrix.h
を使うように直しました (2020/12/29)。
- 上で説明した対称帯行列用の LU 分解プログラム
symbandlu.c,
symbandlu.h
を利用した、
空間2次元の熱方程式 (長方形領域,
非同次 Dirichlet 境界条件) を差分法で解くための
heat2d-i.c
です。
ある意味で終着点です
(連立1次方程式を直接法で解くのに、
ほぼ無駄がないプログラムになっている)。
smallmatrix.h
を使うように直しました (2020/12/29)。
- heat2d-i.c を見直して、matrix library, symbandlu.c など必要のない、
単一のソース・ファイルのプログラムにしました。
オリジナルのGLSCで動きます。(2017/3/5)
現象数理学科 Mac 向けに簡単にコンパイル・実行出来るように、ということ。
ちなみにどれでもスピードにあまり差はない。
今のところ LLVM より gcc の方が速い (原因不明)。
そのうち cglsc++ とか用意しよう。
- heat2d-i.c の系列で、現時点で一番速いバージョン
heat2d-i-eigen-sparse.cpp
EigenのSparseMatrixのソルバー SimplicialLDLT (Cholesky分解) を使って
連立1次方程式を解いている (2017/3/9)。
- MATLABのプログラム例
heat2d.m,
heat2d_mat.m,
解説
- 空間2次元の熱方程式 (長方形領域, 非同次Neumann 境界条件) を差分法
で解くための素朴なプログラム
heat2n-i-naive.c
です。
連立1次方程式を解くために上で紹介した
lu.c とlu.h
を使っています。
これも
smallmatrix.h
を使うように直しました (2020/12/30)。
- 上で説明した対称帯行列用の LU 分解プログラム
symbandlu.c,
symbandlu.h
を利用した、
空間2次元の熱方程式 (長方形領域,
非同次 Neumann 境界条件) を差分法で解くための
heat2n-i.c
です。十分効率的です。
これも
smallmatrix.h
を使うように直しました (2020/12/30)。
- heat2n-i.c の系列で、現時点で一番速いバージョン
heat2n-i-eigen-sparse.cpp
EigenのSparseMatrixのソルバー SimplicialLDLT (Cholesky分解) を使って
連立1次方程式を解いている (2017/3/13)。
- MATLABのプログラム例
heat2n.m,
heat2n_mat.m,
解説
- 空間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)。
- 空間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)。
- 円盤領域における熱方程式を解く C プログラム
fdm-in-disk.tar.gz
matrix library
を使っています。
popen() で gnuplot を呼び出して可視化しています。
- 円盤について、可視化は相変わらずいいかげんですが、
計算は見直しました (2004/10/24)。
Shortley-Weller 近似で楕円領域における波動方程式を解いたのを載せてないとか、
宿題がたまっている…
- 空間1次元の波動方程式 (同次Dirichlet 境界条件) を差分法で解くための
十進BASICプログラム wave1d.BASです
(2012/12/10)。
- 空間1次元の波動方程式 (同次Neumann 境界条件) を差分法で解くための
十進BASICプログラム wave1n.BASです
(2012/12/10)。
- C+GLSC を使った
wave1d-glsc-v2.c と
wave1n-glsc-v2.c です
(2013/12/6)。
現在は g_sleep() を使えるので必要がなくなりましたが、
以前は時間待ちのために関数 msleep() を使っていました。
これは UNIX の常識というか、関数呼び出し一発ですが、
簡単に暗記できるものでもないので、
ソースプログラムをここに置いておきます
msleep.c
- (参考、古いプログラム)
空間1次元の波動方程式 (同次Dirichlet 境界条件)
を差分法で解くための C プログラム
wave1d-glsc.c
空間1次元の波動方程式 (同次Neumann 境界条件)
を差分法で解くための C プログラム
wave1n-glsc.c (仮想格子点近似)
です。
昔は GLSC を使わないものや、
仮想格子点矜持をしないも載せていましたが、
やめました。
- 少し更新しました (初期条件を増やす等)。
wave1-glsc.c,
wave1-initial.c
(2007/12)
- wave2d.c
音
- readwave.c
- writewave.c
- ReadWave.java
- MakeWaveFile.java
棒の振動
(準備中)
板の振動
まだ整理されていないけれど、
Numerical Analysis of Chladni figures
にいくつか載せてある。
数学科の卒研の学生が作ったプログラム
お勧めプログラム
私以外の人達の作った、お勧めのプログラムです。
- 龍谷大学で開発された、UNIX+X11環境下で利用できるグラフィックス・
ライブラリィ
GLSC
です。
2変数関数の等高線や鳥瞰図を簡単に描くことが出来てとても便利です。
マニュアルもあります。このディレクトリィ
ftp://ftp.st.ryukoku.ac.jp/pub/ryukoku/software/math/
にあるファイルを20年間維持しているというのも凄いですね。
一時期 Win32 用の glscwin というのがありましたが、
もう公開されていないのですね…
ちょっと残念だけれど、
最近は自分の身の回りに Windows 環境がなくなったので、
ありがとう、さようなら、なのかな。
なお GLSC の使い方についての情報は
「卒研ノウハウ GLSC の項」
を見て下さい。
- C++ で利用可能な区間演算ライブラリィ
PROFIL/BIAS
を使っていたことがあります。
古いバージョン向けの自作パッチをここに置いてありましたが、
さすがに obsolete なので捨てます (笑)。
明治大学理工学部数学科
〒214-8571 神奈川県川崎市多摩区東三田1-1-1
第二校舎6号館6、7階
Tel. 044-934-7456
FAX. 044-934-7913
mk@math.meiji.ac.jp
(@はASCIIの@)